ホーム技術ブログ › 03
2026-09-07 #03

置換辞書で4,056箇所を自動修正する。ただし辞書の向きが逆だと永遠に壊れ続ける

124行のCSVで機械的に直す仕組みと、その辞書自体を全件検算するスクリプトを書いた理由。

Pythonデータ品質自動化

■ この記事はこんな人におすすめ

  • 同じ誤変換が何百回も出てきて、手で直すのを諦めかけている人
  • 一括置換をやりたいが、正しい語まで壊しそうで怖い人
  • 置換ルールを作ったあと、それが正しく効いているか確かめる術がない人

■ この記事で得られること

  • 無条件に置換してよい語と、絶対にしてはいけない語を分ける基準
  • 置換ルールを手で育てずに、人の修正履歴から自動で拾う方法
  • ルールの向きが逆になっていないかを全件で検算するやり方

1. 結論

登録の条件を「誤形がコーパスに1件も出てこないこと」に固定すると、無条件で置換できます。 この1点だけで、一括置換の怖さはほぼ消えました。

いまは124行の辞書で4,056箇所を直しています。

2. 具体的にやること

# data/known_fixes.csv
誤形,正形,根拠
ゼア公文,there構文,テロップで確認 (2026-08-04)
乱学,Langaku,概要欄の提供表記
フォレスト,Forest,概要欄「総合英語Forest」
クロードコード,Claude Code,英字が正

登録する前に、その誤形がコーパスに残っていないかを引きます。

$ python3 -c "
import sqlite3; c=sqlite3.connect('data/yuru.db')
q=lambda w: c.execute(
  \"SELECT COUNT(*) FROM segments WHERE COALESCE(text_corrected,text) LIKE ?\",
  (f'%{w}%',)).fetchone()[0]
for w in ['ゼア公文','バン','マキタ']:
    print(w, q(w))
"
ゼア公文 0     # 誤形が残っていない。登録できる
バン 214       # 「バン」は普通に使われる。BAN への一括置換はできない
マキタ 0       # 登録できる(人名。正しくは槙田)

3. 各項目の説明

■ なぜ「誤形が0件」が条件になるのか

誤形がコーパスに1件も出てこないなら、置換して壊れる正しい語が存在しないということです。 逆に「バン」のように普通に使われる語は、どれだけ「BAN」に直したくても辞書には入れられません。 入れた瞬間、正しく喋られている「バン」まで全部壊れます。

■ 辞書は手で育てない

項目は、管理画面で直した履歴から機械的に拾っています。 指摘されてから足すのではなく、直した事実のほうから拾いたかったからです。

$ python3 scripts/mine_user_fixes.py

■ 辞書に登録できる候補 (誤形がコーパスに0件)
  マキタ        → 槙田          人名。カタカナ→漢字
  クロードコード → Claude Code   カタカナ英語→英字
  オーパス      → Opus

■ 登録できないもの (誤形が正当出現する)
  バン → BAN    ※「バン」は普通に使われる語

■ 傾向
  - カタカナ英語は英字表記に直される (フォレスト→Forest / オーパス→Opus)
  - 人名のカタカナは漢字に直される (マキタ→槙田)

思ったより効いたのは、いちばん下の「傾向」でした。 英単語がカタカナで出ていたら英字を疑う、人名がカタカナなら漢字を疑う、 という当たりを先に付けられるようになっています。

■ 出てきた候補を全部は入れない

この抽出は、文ごと書き換えた箇所からも機械的にペアを作ってしまいます。 実際、直近の9件のうち語の対応になっていたのは1件だけでした。

祖収る       → ソシュール      ← 語の対応。登録した
そしゅうるの   → ソシュール      ← 助詞が付いている。入れない
であえずマキタ → There's Makita  ← 文ごと直した跡。入れない
カズトヨ      → かずとよ)       ← 括弧が混ざっている。入れない

提案を全部そのまま入れる作りにしなかったのは、ここが理由です。

ハマったところ: 向きが逆だと、気づかずに壊れ続ける

辞書は取り込みのたびに無条件で発火します。 1行間違えれば、正しい語が毎回壊れます。 しかも差分を見ても気づけません。どちらも「ありそうな日本語」だからです。

それで、辞書だけを検算するスクリプトを足しました。

$ python3 scripts/audit_known_fixes.py

辞書 124 件を検算した
  ① 誤形がコーパスに残っていないか  → 残っていれば置換が効いていない
  ② 正形が1件以上あるか            → 0件なら向きが逆の疑い

✅ 全件が条件を満たす (誤形0件 / 正形1件以上)

一度作って終わりのデータに見えますが、実際は毎回動く仕掛けです。 そこに逆向きの検算を付けておくのが、いちばん効きました。

← Whisperは日本語のとき、聞いていない話者名を書… LLMに校正させるとき、精度より効いたのは「作文の禁… → 目次へ

ゆる言語学ラジオ・ゆるコンピュータ科学ラジオ 公認/株式会社pedantic の了承と、運営者・安東暁史との合意に基づく協力体制で運営しています。ドメイン yururadio.jp は株式会社pedanticが保有。開発・保守: 安東暁史·このサイトについて·お問い合わせ