Skip to main content

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}