📑

CER(文字誤り率)とは?

に公開

執筆日

2026/2/7

OCRの精度の評価方法に困った

OCRのプロジェクトを進める中で、誰もが直面するのが 「このモデル、結局どれくらい正確なの?」 という問いです。
OCRの評価において、一言一句すべて合っている 完全一致率(正解率) だけを見ると、10文字中1文字だけ間違えたデータも、1文字も掠っていないデータも同じ「誤り」として扱われてしまいます。これではモデルの微細な改善が見えません。そこで有効なのが CER(文字誤り率) です。


CERとは?

CERは、正解のテキスト(Ground Truth)に対して、OCRの推論結果がどれだけ文字単位で異なっているかを数値化した指標です。

計算には、二つの文字列の差を示す レーベンシュタイン距離(編集距離) の考え方を用います。具体的には、以下の3つの編集操作をカウントします。

  • 置換 (Substitution): 文字が読み間違えられている(例:「大」→「太」)
  • 削除 (Deletion): 文字が読み飛ばされている(例:「東京都」→「東都」)
  • 挿入 (Insertion): 無い文字が入り込んでいる(例:「100」→「1000」)

計算式

CER = \frac{S + D + I}{N}

(S: 置換数, D: 削除数, I: 挿入数, N: 正解の総文字数)


Pythonによる実装例

PythonでCERを計算する場合、標準的なライブラリである jiwer を使う方法があります。

ライブラリのインストール

pip install jiwer

CER計算のコード

日本語の評価に特化した、最小限のコード例です。

main.py
import jiwer

def calculate_cer_details(reference, hypothesis):
    """
    CERの計算とその内訳を返す (jiwer 3.x 対応)
    """
    # 文字単位で評価を行うための処理
    out = jiwer.process_characters(reference, hypothesis)
    
    # cer, substitutions, deletions, insertions などの属性にアクセス可能
    return {
        "cer": out.cer,
        "substitutions": out.substitutions,
        "deletions": out.deletions,
        "insertions": out.insertions,
    }

# テストデータ
gt_text = "東京都千代田区"
ocr_result = "東京都干代田区" 

res = calculate_cer_details(gt_text, ocr_result)

print(f"CER: {res['cer']:.2%}")
print(f"内訳: 置換={res['substitutions']}, 削除={res['deletions']}, 挿入={res['insertions']}")

出力結果

CER: 14.29%
内訳: 置換=1, 削除=0, 挿入=0

参考記事

https://book.st-hakky.com/data-science/evaluation-metrics-for-speech-recognition

ヘッドウォータース

Discussion