CC-100 重み付き統合レポート
概要
CC-100 (Common Crawl ベースの大規模日本語コーパス) を akaza のコーパス統計に統合した。
単純に weight=1.0 で統合すると大幅な退行が発生するため、path:weight 形式の重み付け機能を
akaza-data に実装し、CC-100 を weight=0.3 で統合することで退行を抑えつつ改善を実現した。
背景
akaza のベースモデルは jawiki (Wikipedia 日本語版) と青空文庫のコーパス統計から構築される。 Wikipedia は百科事典であるため、以下の弱点がある:
- 日常会話語が弱い(買う、結構、寝る、使う 等の基本語の頻度が低い)
- 歴史用語・学術用語が過剰に強い(前漢、契機、巨星 等)
- 口語表現の bigram がほぼ存在しない
CC-100 は Web クロールベースのコーパスで、日常的なテキストを多く含むため、 これらの弱点を補完できると期待された。
問題: weight=1.0 での統合失敗
CC-100 は jawiki の約 1.9 倍のボリュームがあり、weight=1.0 で統合すると CC-100 の統計が jawiki を圧倒してしまう。
統合前後の比較 (weight=1.0)
| 指標 | jawiki+青空文庫のみ | + CC-100 (weight=1.0) | 差分 |
|---|---|---|---|
| Good | 6141 | - | - |
| Bad | 4381 | - | - |
| 再現率 | 92.17% | 90.89% | -1.28% |
退行 1927件、修正 1587件。ネットで +340 BAD という大幅な悪化。
主な退行パターン:
- 機能語の同音異義語崩壊:
と→途(48件),さい→賽(47件),そう→総(29件),ご→五(22件) - CC-100 のノイズ由来の珍語が高スコア化
解決策: 重み付け機能の実装
akaza-data への変更 (akaza-im/akaza#425)
wfreq と wordcnt-bigram コマンドの --src-dir / --corpus-dirs 引数で
"path:weight" 形式を受け付けるようにした。
utils.rs:parse_dir_weight()ヘルパー追加wfreq.rs: 内部集計をu32→f64に変更、出力時にround()で整数化make_stats_system_bigram_lm.rs: 同様のf64集計対応
weight 省略時は 1.0 として扱うため、既存の使い方に影響なし。
akaza-corpus-stats への変更 (akaza-im/akaza-corpus-stats#1)
-full ターゲットで CC-100 に CC100_WEIGHT=0.3 を適用:
CC100_WEIGHT ?= 0.3
# wfreq
--src-dir=work/cc100/vibrato-ipadic/:$(CC100_WEIGHT)
# wordcnt-bigram
--corpus-dirs work/cc100/vibrato-ipadic/:$(CC100_WEIGHT)
結果: weight=0.3 での統合
| 指標 | jawiki+青空文庫のみ | + CC-100 (weight=0.3) | 差分 |
|---|---|---|---|
| Good | 6141 | 6457 | +316 |
| Bad | 4381 | 4154 | -227 |
| 再現率 | 92.17% | 92.76% | +0.59% |
| Real BAD (filtered) | 3761 | 3630 | -131 |
修正 2137件、退行 1910件。ネットで -227 BAD の改善。
修正されたパターンの分析 (2137件)
1. 同音異義語・漢字選択誤り — ~1,340件 (62.6%)
Wikipedia では低頻度だが日常では高頻度な語の unigram スコアが CC-100 で補強された。
| 誤 → 正 | 件数 | 例 |
|---|---|---|
| 勝った → 買った | 20 | お友達で勝った人 → 買った人 |
| 返還 → 変換 | 17 | 返還エンジン → 変換エンジン |
| 肩 → 方(かた) | 15 | 興味のある肩は → 興味のある方は |
| 熱い → 暑い/厚い | 12 | 熱い雑誌を読む → 厚い雑誌を読む |
| 欠航 → 結構 | 10 | 欠航いい感じ → 結構いい感じ |
| 週刊 → 週間 | 8 | 1週刊のみ → 1週間のみ |
| 会った → あった | 27 | 連絡が会った → 連絡があった |
| 練る → 寝る | 7 | 練ることにします → 寝ることにします |
| 仕様 → 使用 | 7 | 仕様されている → 使用されている |
| 意外 → 以外 | 7 | 英語意外の → 英語以外の |
2. 分節崩壊の修正 — ~530件 (24.8%)
日常的な語の bigram が強化され、正しい語境界が選ばれるようになった。
15ねんグライツ勝手いるもので→15年ぐらい使っているもので2改名硬派→2回目以降は高杉ててが出ません→高すぎて手が出ません口元を誇ろバス→口元を綻ばす
3. 助詞・接辞の漢字化修正 — ~94件 (4.4%)
ひらがなであるべき助詞が同音の漢字に変換されるケースが修正された。
遊べ途言って→遊べと言って(途→と: 36件)ない名→ないな(名→な: 44件)
4. 不正カタカナ変換修正 — 85件 (4.0%)
11ジゴロ起きた→11時頃起きたアイテルの稼働ナノカ→空いてるのかどうなのか
5. ひらがな未変換修正 — 48件 (2.2%)
あさって→明後日あきんど→商人
6. Wikipedia 偏り修正 — ~31件 (1.4%)
契機先行き→景気先行き前漢出撃命令→全艦出撃命令
退行パターン (1910件)
退行の大部分は以下のパターン:
- 数字+助数詞:
10ねん→十念(NUMBER が漢数字化)、2かい→2書い(分節崩壊) - CC-100 ノイズ由来: Web テキスト特有の表記揺れやタイプミスが統計に混入
考察
weight=0.3 の妥当性
CC-100 は jawiki の約 1.9 倍のボリュームがあるため、weight=0.3 を適用すると
実効的な寄与は 1.9 × 0.3 = 0.57 倍程度となり、jawiki を超えない範囲に収まる。
これにより jawiki の統計を基盤としつつ、CC-100 で日常語を補強する構成が実現できた。
今後の改善余地
- weight の最適化: 0.3 は初期値。0.2〜0.5 の範囲で evaluate を回して最適値を探索できる
- 数字+助数詞の退行対策: CC-100 由来の退行の多くは数字パターン。NUMBER の特別扱いや、 数字周辺の bigram を training-corpus で補強することで対処可能
- CC-100 のフィルタ強化: extract-cc100.py のフィルタを強化し、ノイズの多い文を除外する
検証手順
本レポートの評価結果は、corpus-stats のリリース前にローカルで再現した。
- akaza-im/akaza#425 をマージ後、
cargo install --path akaza-dataで akaza-data を更新 - akaza-corpus-stats リポジトリで
make clean-tokenized && make all-fullを実行し、 CC-100 weight=0.3 の統計データをローカルビルド - 生成された trie ファイルを akaza-default-model の
work/に手動コピー:cp akaza-corpus-stats/work/stats-vibrato-unigram-full.wordcnt.trie work/stats-vibrato-unigram.wordcnt.trie cp akaza-corpus-stats/work/stats-vibrato-bigram-full.wordcnt.trie work/stats-vibrato-bigram.wordcnt.trie cp akaza-corpus-stats/work/vibrato-ipadic-full.vocab work/vibrato-ipadic.vocab makeでモデル再ビルド、make evaluateで評価
corpus-stats の正式リリース後は、akaza-default-model の CORPUS_STATS_VERSION を
更新して make するだけで同じ結果が再現される。
関連 PR
- akaza-im/akaza#425:
path:weight形式の実装 - akaza-im/akaza-corpus-stats#1: CC-100 に weight=0.3 を適用
実行日
2026-02-10