Upgrade to Pro — share decks privately, control downloads, hide ads and more …

位置情報を用いた高速な検索システムの裏側

GO Inc. dev
October 17, 2023

 位置情報を用いた高速な検索システムの裏側

GO TechTalk #23 ジオスペシャル!位置情報活用の現場をお話します! で発表した資料です。

■ YouTube
https://www.youtube.com/live/5V_SVH9wIgE?si=BTUZPaKQCQqHC9cp&t=2998

■ connpass
https://jtx.connpass.com/event/295571/

GO Inc. dev

October 17, 2023
Tweet

More Decks by GO Inc. dev

Other Decks in Programming

Transcript

  1. © GO Inc. 2 自己紹介 GO株式会社 データサイエンティスト / 齋藤 智輝

    タクシーアプリ『GO』の到着時間予測システムや POI検索システムを担当 最近はサバゲー + サウナにハマっています。 友達とノリで出場したアクアスロンも完走しました。
  2. © GO Inc. 9 システム全体図 フリーワードを受け取り    検索エンジンに最適なクエリに変換してからリクエスト 乗務員向けアプリ POI検索サーバ 検索エンジン

    POIデータ POIデータ POIデータ POIデータ POIデータ 検索リクエスト (フリーワード) 検索リクエスト (最適化クエリ)
  3. © GO Inc. 10 意外と難しい問題が多い 表記ゆれ 例. 「ナイキストア」 vs.「nikeストア」   

    「一丁目」   vs. 「1丁目」 距離制限 例.  大阪周辺で、「空港」  と検索 => 「成田空港」  東京駅周辺で、「スシロー」と検索 => 「スシロー帯広店」 別称・通称 例. 「成田国際空港」: 「成田空港, 新東京国際空港, NRT, ...」  「ビッグサイト」: 「東京国際展示場, 東京ビッグサイト, ...」 検索対象施設を増やすのが困難 例. 「居酒屋〇〇」と検索 => 検索結果なし...
  4. © GO Inc. 11 意外と難しい問題が多い 表記ゆれ 例. 「ナイキストア」 vs.「nikeストア」   

    「一丁目」   vs. 「1丁目」 , etc. 距離制限 例.  大阪周辺で、「空港」  と検索 => 「成田空港」  東京駅周辺で、「スシロー」と検索 => 「スシロー帯広店」 別称・通称 例. 「成田国際空港」: 「成田空港, 新東京国際空港, NRT, ...」  「ビッグサイト」: 「東京国際展示場, 東京ビッグサイト, ...」 検索対象施設を増やすのが困難 例. 「居酒屋〇〇」と検索 => 検索結果なし... 検索時の距離考慮 住所の闇
  5. © GO Inc. 13 システム全体図 POI検索サーバから検索エンジンにリクエストするまでの話 乗務員向けアプリ POI検索サーバ 検索エンジン POIデータ

    POIデータ POIデータ POIデータ POIデータ 検索リクエスト (フリーワード) 検索リクエスト (最適化クエリ)
  6. © GO Inc. 14 検索エンジン向けの最適化 検索対象の絞り込み, 距離考慮などを行う POI検索サーバ … 距離考慮

    など 現在地から遠い施設は    当たりにくくする 検索クエリ 検索対象POI群 検索対象の絞り込み 駅系: 病院系: 空港系 : ホテル系: =>    駅系POI群 =>    病院系POI群 =>    空港系POI群 =>   ホテル系POI群 「東京駅」 「東大病院」 「羽田空港」 「雷門旅館」
  7. © GO Inc. 17 距離減衰関数の導入 例. exp関数を利用した場合 ▪ 20km(offset)以下であれば減衰なし ▪

    10(scale)kmごとに0.8(decay)減衰 どんなに遠くても スコアは0にならない 東京駅から「成田空港」と検索結果に出るように!
  8. © GO Inc. 20 近場検索の正解率が向上 公衆トイレ検索 クエリによって減衰関数を切り替え、近場の施設を優先 リリース告知 機能リリース 検索数・正解率共に増加

    トイレ検索リリース後の検索指標推移 ※正解率  : 文字列一致率などから独自に定義した割合  ナビ開始率: 検索後に実際にナビ案内機能まで遷移した割合 近場検索用の減衰関数のイメージ
  9. © GO Inc. 22 検索できる施設数の課題 • 日々増えていく・小規模施設などの検索は      データ数を増やすことで対応するしか無い 例えば ▪

    居酒屋 ▪ コンビニ ▪ レストラン ▪ 新しい商業施設, etc. • データを購入し、住所や座標などのデータを付与すれ ば、検索結果に追加できる
  10. © GO Inc. 23 データの追加には何が必要か 検索文字列の追加、座標の付与を行う 検索エンジン かな変換 「東京駅」 => 「とうきょうえき」

    「成田空港」=> 「なりたくうこう」 「新宿駅」 => 「しんじゅくえき」 … 別称の付与 「東京国際展示場」=> 「ビッグサイト」 「新東京国際空港」=> 「成田空港」 … ジオコーディング など 住所から座標に変換する 「東京都千代田区丸の内1丁目」   35.68122, 139.76676 住所 座標 POI名称 POI名称 別称 POI名称かな
  11. © GO Inc. 24 データの追加には何が必要か 検索文字列の追加、座標の付与を行う 検索エンジン かな変換 「東京駅」 => 「とうきょうえき」

    「成田空港」=> 「なりたくうこう」 「新宿駅」 => 「しんじゅくえき」 … 別称の付与 「東京国際展示場」=> 「ビッグサイト」 「新東京国際空港」=> 「成田空港」 … ジオコーディング など 住所から座標に変換する 「東京都千代田区丸の内1丁目」   35.68122, 139.76676 住所 座標 POI名称 POI名称 別称 POI名称かな コチラ の話
  12. © GO Inc. 28 普通の住所なら結構簡単 ▪ 全角とか余裕 北海道小樽市オタモイ1ー2ー3 ↓ 北海道,

    小樽市, オタモイ, 1丁目, 2, 3 ▪ 県名も推測可能 横浜市港南区港南台7-52-2 ↓ 神奈川県, 横浜市港南区, 港南台, 7丁目, 52, 2
  13. © GO Inc. 29 正規表現とか使えばまだまだいける ▪ 空白以降は無視 東京都練馬区西大泉5-32-12 アイフィールド大泉B101 ↓

    東京都, 練馬区, 西大泉, 5丁目, 32, 12 ▪ 「南2丁目」と認識されても切り離す 大阪府池田市豊島南2ー10ー15 ↓ 大阪府, 池田市, 豊島南, 2丁目, 10, 15
  14. © GO Inc. 30 ギリギリ行ける ▪ 丁目なし、地番なしの枝番のみ 京都府京都市伏見区三栖半町475番地 ↓ 京都府,

    京都市伏見区, 三栖半町, , , 475 京都府京都市山科区東野舞台町一番地 ↓ 京都府, 京都市南区, 上鳥羽仏現寺町 , , , 1
  15. © GO Inc. 31 もう無理 ▪ 丁目なし、街区なし、地番あり、枝番あり 三重県名張市蔵持町原出522-115 ↓ 三重県,

    名張市, 蔵持町原出, , , 522, 115 ▪ 丁目あり、街区なし、地番あり、枝番あり 兵庫県西宮市鳴尾浜1-1-12 ↓ 兵庫県, 西宮市, 鳴尾浜, 1丁目, , 1, 12
  16. © GO Inc. 32 解決策は手作業! 持っている住所と座標の変換データを参照しつつ検索 例. 東京都港区六本木3-2-1 東京都 東京都

    千葉県 神奈川県 ・ ・ ・ 港区 千代田区 港区 世田谷区 ・ ・ ・ 六本木 赤坂 六本木 芝公園 ・ ・ ・ 3 1丁目 2丁目 3丁目 ・ ・ ・ 展開 展開 展開
  17. © GO Inc. 33 住所の奥深さ かなり細分化されている 住所の整理 出典: 今尾恵介『住所と地名の大研究』 (新潮選書

    2004) cf. 住所検索開発者が教える、知っておきたい日本の住所の話 (第1回)
  18. © GO Inc. 34 検索対象施設を増やすことに成功 検索施設が約6倍増加! 検索エンジン POIデータ POIデータ POIデータ

    POIデータ POIデータ 検索エンジン POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ POIデータ
  19. © GO Inc. 35 まとめ 以下について説明を行った ▪ タクシーアプリ『GO』でのPOIシステムの利用箇所 ▪ サービスでの利用箇所とシステム概要、課題点の整理

    ▪ 検索時に行っているサービス固有の工夫点 ▪ 長距離、近場施設の検索が難しかった ▪ 検索対象範囲の切り替えに減衰関数を用いることで解決 ▪ 住所の闇にハマったこと ▪ ジオコーディングを行う際に住所分割・正規化を甘く考えていた ▪ 階層データを用いて手作業で解決!