Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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)差分
Good6141--
Bad4381--
再現率92.17%90.89%-1.28%

退行 1927件、修正 1587件。ネットで +340 BAD という大幅な悪化。

主な退行パターン:

  • 機能語の同音異義語崩壊: と→途 (48件), さい→賽 (47件), そう→総 (29件), ご→五 (22件)
  • CC-100 のノイズ由来の珍語が高スコア化

解決策: 重み付け機能の実装

akaza-data への変更 (akaza-im/akaza#425)

wfreqwordcnt-bigram コマンドの --src-dir / --corpus-dirs 引数で "path:weight" 形式を受け付けるようにした。

  • utils.rs: parse_dir_weight() ヘルパー追加
  • wfreq.rs: 内部集計を u32f64 に変更、出力時に 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)差分
Good61416457+316
Bad43814154-227
再現率92.17%92.76%+0.59%
Real BAD (filtered)37613630-131

修正 2137件、退行 1910件。ネットで -227 BAD の改善。

修正されたパターンの分析 (2137件)

1. 同音異義語・漢字選択誤り — ~1,340件 (62.6%)

Wikipedia では低頻度だが日常では高頻度な語の unigram スコアが CC-100 で補強された。

誤 → 正件数
勝った → 買った20お友達で勝った人買った人
返還 → 変換17返還エンジン変換エンジン
肩 → 方(かた)15興味のある肩は興味のある方は
熱い → 暑い/厚い12熱い雑誌を読む厚い雑誌を読む
欠航 → 結構10欠航いい感じ結構いい感じ
週刊 → 週間81週刊のみ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 のリリース前にローカルで再現した。

  1. akaza-im/akaza#425 をマージ後、cargo install --path akaza-data で akaza-data を更新
  2. akaza-corpus-stats リポジトリで make clean-tokenized && make all-full を実行し、 CC-100 weight=0.3 の統計データをローカルビルド
  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
    
  4. 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