- 同じものの名前が記録ごとに違う書き方で入っていると、AIに聞いても答えは出ません。照合する先が無いからです。
- 引くための資料は、目的に合わせて削って作ります。名前を突き合わせるだけなら、名前と読みだけで足ります。
- 大きい単位で引くと候補が数件に絞れます。絞り込みはコードの仕事、そこから先の判断はAIに残します。
- 「資料に無いから新規」と決めると、すでにある行を二重に作ります。
1. 名寄せは、AIに聞く前の準備で決まる
たとえば、商品の一覧を持っているとします。
同じものが、記録によって違う書き方で入っている。
「コンピュータ」と「コンピューター」。
「Tシャツ 白 M」と「白Tシャツ(M)」。
発注書と納品書と社内の台帳で、それぞれ別の書き方になっている、ということが起こります。
この状態のまま「この行はどれと同じですか」と聞いても、答えは返ってきません。
AIが賢いかどうかではなく、突き合わせる先が手元に無いという話です。
こういう作業を名寄せ(record linkage:レコードリンケージ)と呼びます1。
別々に書かれた記録が同じ対象を指しているかどうかを判断して、一つにまとめる2。
人がやると地味に骨が折れますが、AIに任せるにしても、判断の拠り所は要ります。
だから最初にやったのは、照合の相手になる資料を用意することでした。
2. 引くための資料は、削って作る
2.1. 目的に要らない列を落とす
元になる台帳には、たいてい名前以外の列が並んでいます。
単価、在庫数、仕入先、備考。
名寄せに使うのは名前だけなので、それ以外は持ち込みませんでした3。
持っていないものは漏れません4。
資料をあちこちで開いたり、途中の作業ファイルに残したりすることを考えると、削っておくほうが後が楽です。
削ると、副次的にいいことがありました。
数百件あっても、名前と読みだけなら十数キロバイトに収まります。
元の台帳は開くだけで重いのですが、削った資料は端から端まで読める。
この「全部読める大きさ」が、あとで効いてきます。
2.2. 大きい単位で引いて、細かいところで区別する
では、なぜ書かれたとおりの名前で引かないのか。
完全一致は、一字でも違えば当たらないからです5。
表記が揺れている記録を相手にすると、そこがそのまま取りこぼしになります。
メーカー名や品目名のような大きい単位で引くと、候補が数件に絞られます6。
数百件の台帳なら、同じメーカーの同じ品目は一つか二つしかありません。
絞れてさえいれば、そのあとの書き方が多少違っても、どれのことかは分かります。
長音記号があるかないかだけ違う、送り仮名が違う、全角と半角が混ざっている7。
候補が二件まで減っていれば、こうした揺れは迷いません。
けれど候補を絞らずに全件から探すと、同じ揺れが「見つからない」に化けます。
絞り込みと判定は、別の作業だと思ったほうがよさそうです。
3. 同じものの名前が3通りあるとき
3.1. 記録のでき方で、信じる重みが変わる
同じものが三通りの書き方で出てきたとき、どれを正とするか。
記録のでき方から考えました。
急いで書き込む記録は、表記が揺れやすい8。
入力する人が別にいる台帳は、正確そうに見えて、稀に写し間違いが混ざります。
一方で、同じことが何度も書かれる記録なら、多数決が効きます。
一回きりの書き方は疑って、繰り返し出てくる書き方を採る。
登録したときの記録も重く見ました。
名前が確定するのはその時点で、それ以前の記録は、電話で聞き取っただけで書かれていることがあるからです。
ただ、多数決はあくまで目安でした。
回数では負けているほうが正しかった例が、実際に出てきます。
機械的に決めきらず、最後は分かる人に聞く。
3.2. 「見つからない」は「いない」ではない
ここで失敗しました。
資料に当たらない名前を「新しいもの」と判断して、すでにある行を二重に作ってしまったのです9。
四件。
どれも読みは同じで、表記が一文字だけ違っていました。
旧字と新字、全角と半角のように規則で言えるものなら、変換表を持っておけば寄せられます10。
けれど、まったく別の字が使われていると寄りません。
書き間違いや聞き違いで生まれた揺れは、規則で吸収できる範囲の外にあります。
厄介なのは、照合の仕組みを作り込んだあとだったことです。
仕組みが「無い」と言うと、それを疑わなくなる。
「見つからない」は「無い」ではなく、「探し方が合っていない」かもしれないのに。
4. コードに任せる範囲を決める
似ているかどうかを判定する機能を書きかけて、途中でやめました。
文字列の近さを点数にして、閾値を超えたら候補として出す11。
書けはするのですが、閾値を下げれば拾えるものが増えるかわりに、関係ないものも混ざります。
上げれば逆。
調整はキリがないうえに、なぜその判定になったのかを説明できません。
代わりにしたのは、削って軽くした一覧をそのまま読ませることでした。
数百行なら丸ごと読めます。
読みの順に並べておけば、一文字違いの名前は隣り合って出てきます。
点数で近いかどうかを当てにいくより、並べて見比べたほうが確実でした。
そこで線を引きました。
候補を数件に絞るところまではコードの仕事12。
そこから先の「これは同じものか」はAIの判断に残して、決まらなければ人に聞く。
そして、確認がとれたことは資料に書き戻します。
この書き方はこれ、と一行足しておけば、次からは一発で当たる。
資料が使うたびに育っていくので、同じ名前で二度悩まなくて済みます。
作り込みをどこでやめるかは、性能の問題ではなく分担の問題でした。
全部を自動で決めさせようとすると、間違えたときに気づけない仕組みになる。
半分だけ機械にやらせて、残りを判断のために空けておく。
その空け方を決めるのが、いちばん頭を使うところだったと思います。
- 異なるデータベースやシステムに散らばった同一の情報を、一つにまとめる作業を指します。 – 名寄せとは?データクレンジングとの違いや作業手順を解説
- 表記ゆれや重複を整えるのがデータクレンジングで、分かれてしまった重複データを統合するのが名寄せ。先にクレンジングをしてから名寄せに進むのが一般的とされています。 – 【DB会社が解説】名寄せとは?顧客データを整備・管理する方法を徹底解説!
- 個人情報保護法でも、利用目的の特定と目的外利用の禁止を通じて、扱う内容は利用目的に照らして必要最小限であることが求められています。 – 「個人情報保護法」を分かりやすく解説。個人情報の取扱いルールとは?
- 収集しないデータは漏洩せず、保存しないデータは悪用されない。収集量を減らすこと自体が、最も根本的なプライバシー保護になるという考え方です。 – データ最小化とは?定義、メリット、ベストプラクティス
- 同じキーが一致した行だけを結びつけるやり方は決定的リンケージと呼ばれ、誤記や欠損があると、本当は同じものが結びつかないまま残ります。 – Probabilistic record linkage
- 名寄せではブロッキングと呼ばれる工程です。総当たりだと比較回数が件数の掛け算で増えていくので、先に塊へ分けて候補の組み合わせを減らします。 – A Comparison of Blocking Methods for Record Linkage
- 全角と半角の混在は、Unicodeの正規化形式NFKCで揃えられます。「123abc」が「123abc」になります。 – Pythonで文字列をUnicode正規化(unicodedata.normalize)
- 全角と半角の違いのような書き方の差で、同じものが別のデータとして登録されてしまうことを表記ゆれと呼びます。 – データクレンジングとは?名寄せとの違い、自動化の手法をご紹介!
- 表記ゆれを吸収できないと、同じ対象が別の行として登録され、重複データが増えていきます。 – 名寄せとデータクレンジングのコスト削減と効率化の方法
- 新字体と旧字体・異体字の対応は表として整理されていて、四百字あまりが対応づけられています。 – 新字体と旧字体・異体字の対応一覧表(437字)
- Pythonの標準ライブラリにある比較器は、共通する最長の部分列を再帰的に探して0から1の点数を返します。0.6を超えていれば近い、というのが目安とされています。 – difflib | Python Standard Library
- 大規模言語モデルを使う名寄せでも、先に候補を絞るブロッキングが処理量と精度の両面で効くと報告されています。 – Efficient Record Linkage in the Age of Large Language Models: The Critical Role of Blocking