失敗記録: bigram バックオフに unigram 補間を導入
日付: 2026-02-08
仮説
現在の get_edge_cost_with_user_data は、bigram が見つからない場合に固定の default_edge_cost(≈10-12)を返す。この定数は「私+は」のようなありふれた語の組み合わせにも「鑢+蛸」のような稀な組み合わせにも同じペナルティを与えてしまうため、同音異義語の誤選択の原因になっているのではないか。
両方の語が語彙に存在する場合、それぞれの unigram コストを利用して「この語の組み合わせはどの程度自然か」を推定すれば、よりなめらかなバックオフを実現できるのではないか。
変更内容
libakaza/src/graph/lattice_graph.rs の get_edge_cost_with_user_data を変更。
#![allow(unused)]
fn main() {
// 変更前
} else {
self.system_bigram_lm.get_default_edge_cost()
}
// 変更後
} else {
let backoff = (prev_score + node_score) / 2.0 + BIGRAM_BACKOFF_PENALTY;
backoff.min(self.system_bigram_lm.get_default_edge_cost())
}
}
BIGRAM_BACKOFF_PENALTY = 3.0 を定数として追加。
評価結果
| 指標 | ベースライン (変更前) | バックオフ導入後 | 差分 |
|---|---|---|---|
| Good | 5870 | 4453 | -1417 |
| Top-5 | 493 | 775 | +282 |
| Bad | 4702 | 5837 | +1135 |
| 再現率 | 91.47% | 86.23% | -5.24pt |
考察
再現率が 91.47% → 86.23% に 5.24 ポイント大幅悪化した。
バックオフコストが default_edge_cost より低くなることで、bigram が未登録の語ペアに対して「遷移しやすい」と過大評価してしまい、本来選ばれるべきでない候補が選ばれるようになったと考えられる。
具体的には、unigram コストが低い(= 頻出の)語同士であれば bigram 未登録でも低コストで遷移可能になるが、「頻出語同士だから自然な組み合わせ」とは限らない。例えば「日本」と「だけ」はそれぞれ頻出語だが、「二本だけだ」→「日本だけだ」のような誤変換を誘発する可能性がある。
bigram が未登録であるということ自体が「この組み合わせはコーパス上で観測されなかった」という強いシグナルであり、固定のペナルティで抑制するのが妥当だったと思われる。
結論
この方針は採用しない。変更はすべて revert 済み。