RAG・検索基盤

表記ゆれ吸収とは|文字を揃えても11組すべて不一致、辞書で結ぶと11組すべて一致

表記ゆれ吸収とは何をする仕組みなのか文字を揃える処理とどう違うのか辞書の維持はどれだけ大変か

「宿泊費」と「ホテル代」。同じことを指しているのに、文字としては一致しません。しかも全角半角を揃えても解けません。

11組で試したところ、文字を揃える処理では0組しか一致しませんでした。辞書で結ぶと11組すべて一致します。

この記事の要点

  • 文字を揃える処理では11組中0組しか一致しない
  • 辞書で結ぶと11組すべて一致する
  • 辞書は語の数だけ書けばよく、組み合わせを並べる必要はない
  • ただし辞書に無い言い換えは拾えない

文字を揃えても11組すべて不一致、辞書で結ぶと11組すべて一致

意味が同じで字が違う組11件で測りました。文字を揃える処理では0組、辞書で結ぶと11組すべてが一致します。

表記ゆれ吸収が必要になる範囲を、実際に測って切り分けました。用意したのは意味が同じで字が違う組11件です。

判定は本当に実行しています。組の一覧も辞書もコードに書いてあり、そこを変えれば結果も変わります。

javascript
const GROUPS = [
  ['宿泊費', 'ホテル代', '宿代', '宿泊料'],
  ['報告書', 'レポート', '復命書'],
  ['前払', '仮払', '事前支給'],
  ['備品', '消耗品', '物品'],
  ['精算', '清算', '経費処理'],
];
const dict = new Map();
for (const g of GROUPS) for (const w of g) dict.set(w, g[0]);

// 文字を揃えるだけの判定と、辞書で寄せてからの判定
const byChar = (a, b) => nfkc(a).replace(/[\sー ]/g, '') === nfkc(b).replace(/[\sー ]/g, '');
const byDict = (a, b) => (dict.get(a) || a) === (dict.get(b) || b);
text
組                        文字を揃える  辞書で結ぶ
宿泊費 / ホテル代                不一致           一致
宿泊費 / 宿代                  不一致           一致
報告書 / レポート                不一致           一致
報告書 / 復命書                 不一致           一致
前払 / 仮払                   不一致           一致
備品 / 消耗品                  不一致           一致
精算 / 清算                   不一致           一致
精算 / 経費処理                 不一致           一致

一致した組  文字を揃える: 0/11   辞書で結ぶ: 11/11

1組あたりの語数  辞書の行数  同義の組み合わせ
           2語          2行               1組
           3語          3行               3組
           4語          4行               6組
           6語          6行              15組
          10語         10行              45組

上の表は0対11です。文字を揃える処理では、1組も一致しません

文字の処理では届かない領域

理由は単純で、字がまったく違うからです。「宿泊費」と「ホテル代」に共通する文字はありません。

全角半角を揃えても、空白を落としても、長音を消しても変わりません。文字を操作する処理には、越えられない線があります。その手前までの話は日本語正規化の記事で扱っています。

辞書の書き方は組ではなく一覧

下の表が辞書の性質を示しています。4語の意味なら4行書けばよく、6組の組み合わせを書き並べる必要はありません

代表の語に寄せる形にすると、すべての語が同じ代表に落ちるので、どの2つを比べても一致します。語が10語に増えても、書くのは10行のままです。

辞書に無いものは拾えない

限界もはっきりしています。辞書に書いていない言い換えは、いつまでも拾えません

この計測で11組すべて一致したのは、11組すべてを辞書に入れたからです。実運用では、まだ書いていない言い換えのほうが多いという前提で考えることになります。

文字の処理には越えられない線がある。そこから先は辞書。

件数4502語3語4語6語10語同義の組み合わせ辞書に書く行数代表の語に寄せる形なら、書くのは語の数だけで済む。組み合わせを並べる必要はない。
図1 ── 語数と、辞書に書く行数の関係
出典WorksApplications/Sudachi README2026-08-18 確認
Work closely with the synonym dictionary
原文WorksApplications/Sudachi README この内容の有効期限2027-02-18

表記ゆれ吸収とは何をする仕組みなのか

同じことを指す別の言い方を、1つにまとめる仕組みです。文字の処理では解けない揺れを担当します。

表記ゆれ吸収は、同じことを指す別の言い方を結びつける仕組みです。検索で当たるようにするために置きます。

揺れの種類

  1. 文字種の違い。全角半角、カタカナの長音。文字の処理で解ける
  2. 送り仮名や活用の違い。形態素解析の仕組みで扱える
  3. 言い換え。宿泊費とホテル代。辞書が要る
  4. 略語や社内の呼び方。辞書に自分で書く

3番目と4番目が、この記事の対象です。1番目と2番目は仕組みが用意されていますが、3番目からは中身を自分で用意することになります

形態素解析との分担

Sudachiのような日本語の形態素解析の仕組みは、語に区切りながら表記を揃えます。送り仮名の違いなどはここで解けます。

同じREADMEでは、同義の辞書と密接に連携することも特徴として挙げられています。区切る仕組みと、言い換えの辞書は別のものとして組み合わされます。

どこで当てるか

当てる場所は2つあります。文書を登録するときと、問いを受け取るときです。

片方だけでは一致しません。前の節の判定も、両側を代表の語に寄せてから比べています。

余談 当たらなかった問いが辞書の元になる

運用していて有効だったのは、検索されたのに0件だった問いを集めておくことでした。そこに出てくる語が、そのまま辞書に足すべき言い換えになります。想像で辞書を作るより確実です。

出典WorksApplications/Sudachi README2026-08-18 確認
Sudachi is Japanese morphological analyzer.
原文WorksApplications/Sudachi README この内容の有効期限2027-02-18

表記ゆれ辞書の維持をどう回すか

足す担当と頻度を決めます。決めないと、時間とともに当たらない問いが増えていきます。

表記ゆれ吸収でいちばん難しいのは、作ることではなく維持し続けることです。

放っておくと当たらなくなる

組織の言葉づかいは変わります。新しい制度が始まれば新しい呼び方が生まれ、辞書に無い語で検索されるようになります

作った直後は当たっていた検索が、半年後には当たらない。この劣化は静かに進みます

決めておくこと

  1. 0件だった問いを記録する。辞書に足す候補になる
  2. 足す担当を決める。技術の担当とは限らない
  3. 足す頻度を決める。月に1度など
  4. 気づいた人が足す。誰も足さなくなる

4番目は避けてください。担当が決まっていない作業は、忙しくなった時点で止まります

用意されている辞書を待つかどうか

既製の同義辞書もあります。Sudachiでも、同義の辞書を後日公開すると書かれています。

ただし既製の辞書は、社内の呼び方までは含みません。一般の言い換えは既製で、社内の呼び方は自前でという分担になります。

作るより、足し続けるほうが難しい。担当を決めておく。

充足 2 / 40件だった問いを記録している辞書に足すべき言い換えが、そこにそのまま出てくる足す担当と頻度を決めてある決まっていない作業は、忙しくなった時点で止まる文字を揃える処理で足りると考えている言い換えの11組は、文字を揃える処理では0組しか一致しなかった既製の辞書だけで済ませている一般の言い換えは含まれるが、社内の呼び方は自前で足すことになる言い換え11組での実測にもとづく。辞書で結べば11組すべてが一致した。
図2 ── 辞書を回すときの点検項目
出典WorksApplications/Sudachi README2026-08-18 確認
We will release the sysnonym dictionary at a later date
原文WorksApplications/Sudachi README この内容の有効期限2027-02-18

よくある質問

全角半角を揃えれば解けませんか
解けません。「宿泊費」と「ホテル代」は文字としてまったく違うためです。この計測でも0組でした。
辞書はどれだけ書けばよいですか
1つの意味に対して、その言い方の数だけ書きます。4語なら4行です。組み合わせは6組ありますが、全部を書き並べる必要はありません。
辞書に無い言い換えはどうなりますか
拾えません。ですから誰がいつ辞書に足すかを決めておかないと、時間とともに当たらない問いが増えます。
形態素解析の仕組みを使えば済みますか
送り仮名や活用の揺れは扱えます。ただし「宿泊費」と「ホテル代」のような言い換えは、同義の辞書が別に要ります。

まとめ

  • 表記ゆれ吸収は同じ意味の別の言い方を結ぶ仕組み
  • 文字を揃える処理では11組中0組
  • 辞書で結べば11組すべて
  • 辞書は語の数だけでよいが、足す人を決めないと止まる

今日から始められること

  1. 検索されたのに当たらなかった語を集める
  2. その語が、文書中のどの語を指していたかを書き出す
  3. 組ではなく、意味ごとの言い方の一覧として辞書に書く
  4. 辞書に足す担当と、足す頻度を決める

実務で組んだ表記ゆれ吸収のワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る