$30 off During Our Annual Pro Sale. View Details »

POI検索システムにおける 誤字・脱字との戦い

POI検索システムにおける 誤字・脱字との戦い

GO株式会社のSaito Tomokiが、地図やナビアプリの「POI(地点)検索」の裏側で起きている課題と、その解決へのアプローチを明かす技術資料です 。

「とうきょうえひ」と検索したら、0件。

多くのユーザーが経験するこの「検索ヒットしない」問題。実は、この検索システムは「検索速度」を最優先する特定のアルゴリズム(B+tree)を採用しているため、少しの誤字・脱字も許容しにくいというジレンマを抱えていました 。

では、システムの強みである「速度」を維持したまま、どうすれば「とうきょうえひ」を「とうきょうえき」だと認識させられるのでしょうか?

本資料では、単なる「表記ゆれ(全角/半角など)」や「別名(通称)」の対応といった一般的な改善策に留まらず、厄介な「純粋な入力ミス」 にどう立ち向かったのかが語られます。

最大の鍵は、資料の後半で明かされる「分析ログ」 の活用法。

ユーザーが検索に失敗し、最終的に“手動で”地図上から目的地を設定した行動ログ にこそ、解決のヒントが隠されていました。

一体どのようなログを、どう分析すれば 、ユーザーの「入力ミス」と「本当に探したかった場所」 を結びつけられるのか? その具体的な「戦い」の全貌が、ここに記されています。

Avatar for Tomoki Saito

Tomoki Saito

November 12, 2025
Tweet

More Decks by Tomoki Saito

Other Decks in Technology

Transcript

  1. 6 ルート・Parent(親)・Child(子)ノードで構成される B+treeアルゴリズム Root Key7 Parent Key3 Key6 Parent Key10

    Key11 Child (key: value) Key1 Val2 Key2 Val2 Child (key: value) Key4 Val2 Key5 Val2 Child (key: value) Key8 Val2 Key9 Val2 Child (key: value) Key12 Val2 Key13 Val2
  2. 7 keyをPOI名称から生成 key生成の例 case1. 「東京駅」 => ト::トウ::トウキ::トウキョ::トウキョウ::トウキョウエ::トウキョウエ キ::東::東京::東京駅 case2. 「東京スカイツリー」

    => ト::トウ::トウキ::トウキョ::トウキョウ::トウキョウス::トウキョウス カ::トウキョウスカイ::トウキョウスカイツ::(省略) B+treeアルゴリズムで何を検索するのか
  3. 8 構築された一部を抜粋すると B+treeアルゴリズム Parent 東 Parent 東京 東海 Parent 東北

    東和 Child (key: value) 東京駅 POI: 東京駅 東京スカ イツリー POI: 東京ス カイツリー Child (key: value) 東海寺 東海大学 Child (key: value) 東北神社 東北物産 Child (key: value) 東和建物 東和寺 POI: 東和建物 POI: 東和寺 POI: 東北神社 POI: 東北物産 POI: 東海寺 POI: 東海大学 Root or Parent ノードへ
  4. 9 システム構成 POI元データA POI元データB POIデータA POIデータB データ加工モジュール オンライン処理 モジュール エンドユーザ

    POI元データB 必要データ(列など)の 取り込み 役割 • 複数データの統合 • 文字列正規化処理 • 独自スコアの付与 • 類似POIデータ の統合, etc. 統合 POIデータ 役割 • インデックスの作成 (B+Treeの生成) • リクエスト受取 • クエリ文字列処理 • 距離による順位付け • 最終結果のsort, etc. 検索用 インデックス
  5. 13 ▪ 範囲検索 ▪ クエリ: 「とうきょうえひ」に対して ▪ 「とうきょう」〜 「とうきょうえき」までを検索 ▪

    多くなる候補のソートを工夫する ▪ ベクトル検索 ▪ 意味的に同じ対象を検索する ▪ 誤字・脱字変換 ▪ クエリ: 「とうきょうえひ」に対して ▪ 検索クエリを「とうきょうえき」に修正 ▪ 修正用の辞書を頑張って作る どういった構想で誤字・脱字に対応するのか
  6. 14 ▪ 範囲検索 ▪ クエリ: 「とうきょうえひ」に対して ▪ 「とうきょう」〜 「とうきょうえき」までを検索 ▪

    多くなる候補のソートを工夫する ▪ ベクトル検索 ▪ 意味的に同じ対象を検索する ▪ 誤字・脱字変換 ▪ クエリ: 「とうきょうえひ」に対して ▪ 検索クエリを「とうきょうえき」に修正 ▪ 修正用の辞書を頑張って作る どういった構想で誤字・脱字に対応するのか コチラ の話
  7. 17 クエリの正規化で対応 汎用化できるケース 全角・半角スペースの有無 クエリ: 「東京 タワー」 名称: 「東京タワー」 大文字・小文字の違い

    クエリ: 「TOKYO STATION」 名称: 「Tokyo Station」 中黒(・)の有無 クエリ: 「マークイズ」 名称: 「マーク・イズ」 ハイフン(-)の有無 クエリ: 「セブンイレブン」 名称: 「セブン-イレブン」 半角・全角カタカナの違い クエリ: 「サンシャイン」 名称: 「サンシャイン」 ひらがな・カタカナの違い クエリ: 「ららぽーと」 名称: 「ララポート」 長音符(ー)の有無 クエリ: 「コンピュータ」 名称: 「コンピューター」 「ヶ」「ケ」「が」の揺れ クエリ: 「霞が関」 名称: 「霞ケ関」 助詞「の」「ノ」の揺れ クエリ: 「お茶の水」 名称: 「御茶ノ水」
  8. 18 以下のケースはPOIの別称・通称として考える POI名称として正しいケース ▪ POI名称: 「東京国際空港」 クエリ文字列: 「羽田空港」 ▪ POI名称:

    「大阪国際空港」 クエリ文字列: 「伊丹空港」 ▪ POI名称: 「中部国際空港」 クエリ文字列: 「セントレア」 ▪ POI名称: 「東京国際展示場」 クエリ文字列: 「東京ビッグサイト」 ▪ POI名称: 「東京港連絡橋」 クエリ文字列: 「レインボーブリッジ」 ▪ POI名称: 「東京スタジアム」 クエリ文字列: 「味の素スタジアム」 ▪ POI名称: 「横浜国際平和会議場」 クエリ文字列: 「パシフィコ横浜」 ▪ POI名称: 「阪神甲子園球場」 クエリ文字列: 「甲子園」 ▪ POI名称: 「東京都庁舎」 クエリ文字列: 「都庁」 ▪ POI名称: 「ユニバーサル・スタジオ・ジャパン」 クエリ文字列: 「USJ」
  9. 19 名称としては間違っているがよくある誤字・脱字は         エイリアスに登録 or 独自辞書の作成を行う 発生回数として多いケース ▪ 単語の抜け(脱字) クエリ: 「グランドホテル

    A」 POI名称: 「ニュー グランドホテルA」 ▪ 同音異字(漢字 vs ひらがな) クエリ: 「まるふく寿司」 POI名称: 「まるふく寿し」 ▪ 漢字とカタカナの混在(略記) クエリ: 「ABC皮膚科」 POI名称: 「ABC皮フ科」 ▪ 類似した意味を持つ接尾語の違い クエリ: 「XYZ直売店」 POI名称: 「XYZ直売所」 ▪ カナの入力ミス(「ン」の挿入) クエリ: 「グランス シティ」 POI名称: 「グラス シティ」 ▪ 異体字(旧字体・新字体) クエリ: 「メゾン山崎」 POI名称: 「メゾン山﨑」 ▪ 濁点・半濁点の入力ミス クエリ: 「なごのキャンバス」 POI名称: 「なごのキャンパス」 ▪ 同音異義語(似た業種の漢字違い) クエリ: 「かわひがし接骨院」 POI名称: 「かわひがし整骨院」
  10. 21 目的 「入力ミス」と「正しい POI」のペアを抽出する。 手順. ※母集団は 「検索を利用したが結果を使わずに手動で迎車位置を設定した配車」 Step1. 「正解POI」の特定 「実際に迎車した位置(緯度経度)」を取得。その緯度経度に「最も近い

    POI」を特定する。 (例: 迎車位置 → 最寄りPOI 「東京タワー」) Step2. 「入力クエリ」と「正解 POI」の比較 「ユーザーが検索に用いた文字列(クエリ)」を取得する。 (例: 検索クエリ 「とうきょうタわー」) Step3. 類似ペアの抽出(辞書候補) 「入力クエリ」と「正解POI」を比較し、類似しているペアを抽出する。 類似度の判定: 編集距離を計算し、距離が近い(=文字列が似ている)ものを採用する。 (例: 「とうきょうタわー」 vs 「東京タワー」 → 類似度 高) 分析ログからの誤字・脱字取得方針
  11. 25 末尾かな POI名の末尾が「かな」で終わるもの。 入力途中や、名称自体がひらがな /カタカナの場合。 (例: 「東京えき」、「東京こくさいフォーラム」) 1文字 1文字のみの検索クエリ。 特定のカテゴリ(「駅」など)や地図上の記号(「

    A」など)の可能性。 現在地 「現在地」や「今いる場所」を表すクエリ。 現在地周辺のPOI検索が目的。(例 : 「現在地」「今いる場所」) 住所 特定の住所を直接入力したクエリ。 その住所自体や、その周辺の POI検索。(例: 「東京都新宿区西新宿」) 分析ログから得られた別タイプのクエリ 数字のみ 数字だけで構成されるクエリ。 郵便番号、電話番号 、特定のビル名・番地(例 : 「109」)など 空文字・NULL 見た目上は空文字だが、 文字コードの異なる空白など、 正規表現で除外しきれなかった入力 。 (誤操作やシステム起因も含む) 記号のみ 記号だけで構成される検索クエリ。 (例: 「!?」、「@」、「(^o^)」のような顔文字 )