「宿泊費」と「ホテル代」。同じことを指しているのに、文字としては一致しません。しかも全角半角を揃えても解けません。
11組で試したところ、文字を揃える処理では0組しか一致しませんでした。辞書で結ぶと11組すべて一致します。
意味が同じで字が違う組11件で測りました。文字を揃える処理では0組、辞書で結ぶと11組すべてが一致します。
表記ゆれ吸収が必要になる範囲を、実際に測って切り分けました。用意したのは意味が同じで字が違う組11件です。
判定は本当に実行しています。組の一覧も辞書もコードに書いてあり、そこを変えれば結果も変わります。
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);
組 文字を揃える 辞書で結ぶ
宿泊費 / ホテル代 不一致 一致
宿泊費 / 宿代 不一致 一致
報告書 / レポート 不一致 一致
報告書 / 復命書 不一致 一致
前払 / 仮払 不一致 一致
備品 / 消耗品 不一致 一致
精算 / 清算 不一致 一致
精算 / 経費処理 不一致 一致
一致した組 文字を揃える: 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組すべてを辞書に入れたからです。実運用では、まだ書いていない言い換えのほうが多いという前提で考えることになります。
文字の処理には越えられない線がある。そこから先は辞書。
同じことを指す別の言い方を、1つにまとめる仕組みです。文字の処理では解けない揺れを担当します。
表記ゆれ吸収は、同じことを指す別の言い方を結びつける仕組みです。検索で当たるようにするために置きます。
3番目と4番目が、この記事の対象です。1番目と2番目は仕組みが用意されていますが、3番目からは中身を自分で用意することになります。
Sudachiのような日本語の形態素解析の仕組みは、語に区切りながら表記を揃えます。送り仮名の違いなどはここで解けます。
同じREADMEでは、同義の辞書と密接に連携することも特徴として挙げられています。区切る仕組みと、言い換えの辞書は別のものとして組み合わされます。
当てる場所は2つあります。文書を登録するときと、問いを受け取るときです。
片方だけでは一致しません。前の節の判定も、両側を代表の語に寄せてから比べています。
運用していて有効だったのは、検索されたのに0件だった問いを集めておくことでした。そこに出てくる語が、そのまま辞書に足すべき言い換えになります。想像で辞書を作るより確実です。
足す担当と頻度を決めます。決めないと、時間とともに当たらない問いが増えていきます。
表記ゆれ吸収でいちばん難しいのは、作ることではなく維持し続けることです。
組織の言葉づかいは変わります。新しい制度が始まれば新しい呼び方が生まれ、辞書に無い語で検索されるようになります。
作った直後は当たっていた検索が、半年後には当たらない。この劣化は静かに進みます。
4番目は避けてください。担当が決まっていない作業は、忙しくなった時点で止まります。
既製の同義辞書もあります。Sudachiでも、同義の辞書を後日公開すると書かれています。
ただし既製の辞書は、社内の呼び方までは含みません。一般の言い換えは既製で、社内の呼び方は自前でという分担になります。
作るより、足し続けるほうが難しい。担当を決めておく。
We will release the sysnonym dictionary at a later date原文WorksApplications/Sudachi README この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る