neco_fuzzy/config.rs
1/// エネルギーモデルの重みと変換係数をまとめた設定です。
2#[derive(Clone, Copy, PartialEq)]
3pub struct ScoreConfig {
4 /// 先頭から離れるほど増える位置コストの重みです。
5 pub w_pos: f32,
6 /// 境界度の高い位置へ引き寄せる重みです。
7 pub w_bnd: f32,
8 /// 文字列先頭および basename 先頭を優遇する重みです。
9 pub w_head: f32,
10 /// 離れた文字を飛び越えるときのギャップコスト重みです。
11 pub w_gap: f32,
12 /// スパンを候補長全体へ分散して抑える重みです。
13 pub w_span: f32,
14 /// 最後の一致より後ろに残る末尾長へのコスト重みです。
15 pub w_tail: f32,
16 /// 候補全体と query が一致するときのボーナス重みです。
17 pub w_exact: f32,
18 /// case-insensitive 一致で大小が異なる文字へのコスト重みです。
19 pub w_case: f32,
20 /// Gaussian 減衰の基準となる sigma です。
21 pub sigma_base: f32,
22 /// sigma 適応で基準に使う候補長です。
23 pub n_ref: f32,
24 /// コーパス統計由来の IDF を効かせる重みです。
25 pub w_idf: f32,
26 /// energy から confidence へ写像するときのスケールです。
27 pub confidence_scale: f32,
28}
29
30/// energy を互換性のある整数 value に変換するときの尺度です。
31pub const VALUE_SCALE: f32 = 100.0;
32
33impl Default for ScoreConfig {
34 fn default() -> Self {
35 Self {
36 // 現行の整数スコア比率
37 // +45 boundary, +70 contiguous, -3 position, -2 span,
38 // +120 head, +90 basename を初期の相対関係として写します。
39 w_pos: 0.03,
40 w_bnd: 0.64,
41 w_head: 1.20,
42 w_gap: 1.80,
43 w_span: 0.02,
44 w_tail: 0.08,
45 w_exact: 0.60,
46 w_case: 0.05,
47 sigma_base: 3.0,
48 n_ref: 12.0,
49 w_idf: 0.0,
50 confidence_scale: 0.35,
51 }
52 }
53}
54
55impl ScoreConfig {
56 /// 候補長に応じて適応させた sigma を返します。
57 pub fn sigma(&self, candidate_len: usize) -> f32 {
58 self.sigma_base * (candidate_len as f32 / self.n_ref).sqrt()
59 }
60}