要件
ユーザーが入力した住所と、基幹システムが保持している16,000件の住所マスタから一致する住所を特定する。
住所の例
利用者入力 | マスター住所1 | マスター住所2 |
---|---|---|
桜町123ー5サンライズAー101 | 桜町123−5 | サンライズ A棟101 |
花山町45ー3スカイヒルズB202 | 花山町45−3 | スカイヒルズ B202 |
虹ヶ丘2ー7-12パークサイドレジデンス3-204 | 虹ヶ丘二丁目7−12 | パークサイドレジデンスⅢ−204 |
青空町456ー1シティビルメゾンII202 | 青空町456−1 | シティビルメゾン Ⅱ−202 |
若葉町1234ー56グランドヒルズ101号室 | 若葉町1234−56 | グランドヒルズ 101号室 |
湖山台3丁目890番地ファミールヴィラD202 | 湖山台三丁目890 | ファミールヴィラ D202 |
難しい点
人間が読めばわかりますが、プログラミング単体で正規化しマッチングさせるのは困難でした。
- 表記揺れの処理
- 全角・半角や漢数字と算用数字の混在
- 「1丁目」や「一丁目」など
- 曖昧な建物名・号室表記
- 地名のスペースの有無
- 番地や丁目の位置の違い
ベクトル検索とリランカーで検証
- マスタ住所を intfloat/multilingual-e5-large を使ってエンベディングし、ユーザーが入力した住所を使って、ベクトル検索エンジンで類似検索を行い、候補リストを50件取得。
- リランカーとして、hotchpotch/japanese-reranker-cross-encoder-large-v1 を使って50件のデータから最も類似度の高い1件を抽出
- 一致したかを確認
結果
申請合計数 | 住所一致 | 住所不一致 | 住所一致率 |
---|---|---|---|
509件 | 428件 | 81件 | 84.08% |
惜しい点
かなり高い一致率だったが、部屋番号を間違えて引っ張ってくる例が散見された。
ユーザー入力 | 正しいマスター住所 | 検索結果(誤った部屋番号) |
---|---|---|
桜町123ー5サンライズAー101 | 桜町123−5 サンライズA棟101 | 桜町123−5 サンライズA棟102 |
花山町45ー3スカイヒルズB202 | 花山町45−3 スカイヒルズB202 | 花山町45−3 スカイヒルズB201 |
虹ヶ丘2ー7-12パークサイドレジデンス3-204 | 虹ヶ丘二丁目7−12 パークサイドレジデンスⅢ−204 | 虹ヶ丘二丁目7−12 パークサイドレジデンスⅢ−203 |
青空町456ー1シティビルメゾンII202 | 青空町456−1 シティビルメゾンⅡ−202 | 青空町456−1 シティビルメゾンⅡ−201 |
湖山台3丁目890番地ファミールヴィラD202 | 湖山台三丁目890 ファミールヴィラD202 | 湖山台三丁目890 ファミールヴィラD201 |
ベクトル検索とLLMの組み合わせで検証
次に、リランカーは使用せずにベクトル検索エンジンから取得した候補50件をLLMに渡して、LLMに最も一致している住所を選択させる形で検証した。
結果
gpt4o-mini
申請合計数 | 住所一致 | 住所不一致 | 住所一致率 |
---|---|---|---|
509件 | 449件 | 60件 | 88.24% |
gpt4o
申請合計数 | 住所一致 | 住所不一致 | 住所一致率 |
---|---|---|---|
509件 | 480件 | 29件 | 94.30% |
結論
住所マッチングにおいては、リランカーよりもgpt4oの方が精度が高かったが当然コストが高くなるため、運用においてはどの程度の一致率で是とするかは要検討。