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

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

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

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. 位置情報を用いた
    高速な検索システムの裏側
    2023.10.16
    齋藤 智輝
    GO株式会社

    View full-size slide

  2. © GO Inc. 2
    自己紹介
    GO株式会社
    データサイエンティスト / 齋藤 智輝
    タクシーアプリ『GO』の到着時間予測システムや
    POI検索システムを担当
    最近はサバゲー + サウナにハマっています。
    友達とノリで出場したアクアスロンも完走しました。

    View full-size slide

  3. © GO Inc. 3
    目次
    1. 『GO』でのPOI検索システム
    2. 検索時の距離考慮
    3. 住所の闇

    View full-size slide

  4. © GO Inc.
    1. 『GO』での位置情報検索システム
    4

    View full-size slide

  5. © GO Inc. 5
    POIとは
    POI: Point of Interestの略
    地図やナビゲーションアプリケーションでは
    ユーザーにとって興味のある場所や施設を示す

    View full-size slide

  6. © GO Inc. 6
    タクシーアプリ『GO』でのPOI検索
    2つの端末でPOI検索は行われている
    乗務員用端末
    ユーザ端末

    View full-size slide

  7. © GO Inc. 7
    タクシーアプリ『GO』でのPOI検索
    2つの端末でPOI検索は行われている
    乗務員用端末
    ユーザ端末
    コチラ
    の話

    View full-size slide

  8. © GO Inc. 8
    乗務員端末でのPOI検索
    フリーワード検索での利用
    入力画面
    フリーワード選択画面

    View full-size slide

  9. © GO Inc. 9
    システム全体図
    フリーワードを受け取り
       検索エンジンに最適なクエリに変換してからリクエスト
    乗務員向けアプリ
    POI検索サーバ
    検索エンジン
    POIデータ
    POIデータ
    POIデータ
    POIデータ
    POIデータ
    検索リクエスト
    (フリーワード)
    検索リクエスト
    (最適化クエリ)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. © GO Inc.
    2. 検索時の距離考慮
    12

    View full-size slide

  13. © GO Inc. 13
    システム全体図
    POI検索サーバから検索エンジンにリクエストするまでの話
    乗務員向けアプリ
    POI検索サーバ
    検索エンジン
    POIデータ
    POIデータ
    POIデータ
    POIデータ
    POIデータ
    検索リクエスト
    (フリーワード)
    検索リクエスト
    (最適化クエリ)

    View full-size slide

  14. © GO Inc. 14
    検索エンジン向けの最適化
    検索対象の絞り込み, 距離考慮などを行う
    POI検索サーバ

    距離考慮
    など
    現在地から遠い施設は
       当たりにくくする
    検索クエリ 検索対象POI群
    検索対象の絞り込み
    駅系:
    病院系:
    空港系 :
    ホテル系:
    =>    駅系POI群
    =>    病院系POI群
    =>    空港系POI群
    =>   ホテル系POI群
    「東京駅」
    「東大病院」
    「羽田空港」
    「雷門旅館」

    View full-size slide

  15. © GO Inc. 15
    距離考慮の失敗
    車両からPOIまでの距離に制限を設けるだけだと
             ユースケースに合わないことも
    例えば検索範囲を半径50km以内に絞ってしまうと...
    東京駅                成田空港
    直線距離 約60km
    経路距離 約70km
    東京駅から「成田空港」と検索しても出てこない…

    View full-size slide

  16. © GO Inc. 16
    距離減衰関数
    どんなに離れていても当てたいPOIはある
    減衰(Decay)関数
    距離によって減衰する関数をスコアに適用
    cf. elastic, “Supported decay functions”

    View full-size slide

  17. © GO Inc. 17
    距離減衰関数の導入
    例. exp関数を利用した場合
    ▪ 20km(offset)以下であれば減衰なし
    ▪ 10(scale)kmごとに0.8(decay)減衰
    どんなに遠くても
    スコアは0にならない
    東京駅から「成田空港」と検索結果に出るように!

    View full-size slide

  18. © GO Inc. 18
    ケースによっては減衰度合いの調整が必要
    例. 「近場のトイレを検索したい」ケース
    通常検索用の減衰関数だと
    ▪ 20km先までのトイレでも当たりやすい
    ▪ どんなに離れたトイレでも当てたい?

    20km以下は減衰なし
    10kmごとに0.8減衰 従来の減衰関数

    View full-size slide

  19. © GO Inc. 19
    減衰度合いを強めることで調整
    例. 「近場のトイレを検索したい」ケース
    より近場の施設を優先した減衰関数
    ▪ 減衰は1m先から開始
    ▪ 300m離れると0に漸近する

    1m以下は減衰なし
    10mごとに0.8減衰 トイレ検索用の減衰関数

    View full-size slide

  20. © GO Inc. 20
    近場検索の正解率が向上
    公衆トイレ検索
    クエリによって減衰関数を切り替え、近場の施設を優先
    リリース告知
    機能リリース
    検索数・正解率共に増加
    トイレ検索リリース後の検索指標推移
    ※正解率  : 文字列一致率などから独自に定義した割合
     ナビ開始率: 検索後に実際にナビ案内機能まで遷移した割合
    近場検索用の減衰関数のイメージ

    View full-size slide

  21. © GO Inc.
    3. 住所の闇
    21

    View full-size slide

  22. © GO Inc. 22
    検索できる施設数の課題
    ● 日々増えていく・小規模施設などの検索は
         データ数を増やすことで対応するしか無い
    例えば
    ■ 居酒屋
    ■ コンビニ
    ■ レストラン
    ■ 新しい商業施設, etc.
    ● データを購入し、住所や座標などのデータを付与すれ
    ば、検索結果に追加できる

    View full-size slide

  23. © GO Inc. 23
    データの追加には何が必要か
    検索文字列の追加、座標の付与を行う
    検索エンジン
    かな変換
    「東京駅」 => 「とうきょうえき」
    「成田空港」=> 「なりたくうこう」
    「新宿駅」 => 「しんじゅくえき」

    別称の付与
    「東京国際展示場」=> 「ビッグサイト」
    「新東京国際空港」=> 「成田空港」

    ジオコーディング
    など
    住所から座標に変換する
    「東京都千代田区丸の内1丁目」   35.68122, 139.76676
    住所 座標
    POI名称 POI名称 別称
    POI名称かな

    View full-size slide

  24. © GO Inc. 24
    データの追加には何が必要か
    検索文字列の追加、座標の付与を行う
    検索エンジン
    かな変換
    「東京駅」 => 「とうきょうえき」
    「成田空港」=> 「なりたくうこう」
    「新宿駅」 => 「しんじゅくえき」

    別称の付与
    「東京国際展示場」=> 「ビッグサイト」
    「新東京国際空港」=> 「成田空港」

    ジオコーディング
    など
    住所から座標に変換する
    「東京都千代田区丸の内1丁目」   35.68122, 139.76676
    住所 座標
    POI名称 POI名称 別称
    POI名称かな
    コチラ
    の話

    View full-size slide

  25. © GO Inc.
    階層的な住所と座標変換データは持っていたので、
    住所を正しく分割・正規化すれば変換できるAPIを用意
    25
    ジオコーディングを作ろうとして
    例.
    「東京都港区六本木3-2-1」
    「東京都, 港区, 六本木, 3丁目, 2, 1」
    変換・正規化
    35.66481763757194, 139.73775542529668
    行けるっしょ!
    APIリクエスト

    View full-size slide

  26. © GO Inc.
    階層的な住所と座標変換データは持っていたので、
    住所を正しく分割・正規化すれば変換できるAPIを用意
    ココが
    難しかった
    26
    住所を正しく分割することを甘くみていた
    もう無理…
    例.
    「東京都港区六本木3-2-1」
    変換・正規化
    「東京都, 港区, 六本木, 3丁目, 2, 1」
    35.66481763757194, 139.73775542529668
    APIリクエスト

    View full-size slide

  27. © GO Inc. 27
    実際のデータにチャレンジ
    なんとかなるっしょ

    View full-size slide

  28. © GO Inc. 28
    普通の住所なら結構簡単
    ▪ 全角とか余裕
    北海道小樽市オタモイ1ー2ー3

    北海道, 小樽市, オタモイ, 1丁目, 2, 3
    ▪ 県名も推測可能
    横浜市港南区港南台7-52-2

    神奈川県, 横浜市港南区, 港南台, 7丁目, 52, 2

    View full-size slide

  29. © GO Inc. 29
    正規表現とか使えばまだまだいける
    ▪ 空白以降は無視
    東京都練馬区西大泉5-32-12 アイフィールド大泉B101

    東京都, 練馬区, 西大泉, 5丁目, 32, 12
    ▪ 「南2丁目」と認識されても切り離す
    大阪府池田市豊島南2ー10ー15

    大阪府, 池田市, 豊島南, 2丁目, 10, 15

    View full-size slide

  30. © GO Inc. 30
    ギリギリ行ける
    ▪ 丁目なし、地番なしの枝番のみ
    京都府京都市伏見区三栖半町475番地

    京都府, 京都市伏見区, 三栖半町, , , 475
    京都府京都市山科区東野舞台町一番地

    京都府, 京都市南区, 上鳥羽仏現寺町 , , , 1

    View full-size slide

  31. © GO Inc. 31
    もう無理
    ▪ 丁目なし、街区なし、地番あり、枝番あり
    三重県名張市蔵持町原出522-115

    三重県, 名張市, 蔵持町原出, , , 522, 115
    ▪ 丁目あり、街区なし、地番あり、枝番あり
    兵庫県西宮市鳴尾浜1-1-12

    兵庫県, 西宮市, 鳴尾浜, 1丁目, , 1, 12

    View full-size slide

  32. © GO Inc. 32
    解決策は手作業!
    持っている住所と座標の変換データを参照しつつ検索
    例. 東京都港区六本木3-2-1
    東京都
    東京都
    千葉県
    神奈川県



    港区
    千代田区
    港区
    世田谷区



    六本木
    赤坂
    六本木
    芝公園



    3
    1丁目
    2丁目
    3丁目



    展開 展開 展開

    View full-size slide

  33. © GO Inc. 33
    住所の奥深さ
    かなり細分化されている
    住所の整理
    出典: 今尾恵介『住所と地名の大研究』 (新潮選書 2004)
    cf. 住所検索開発者が教える、知っておきたい日本の住所の話 (第1回)

    View full-size slide

  34. © 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データ

    View full-size slide

  35. © GO Inc. 35
    まとめ
    以下について説明を行った
    ▪ タクシーアプリ『GO』でのPOIシステムの利用箇所

    サービスでの利用箇所とシステム概要、課題点の整理
    ▪ 検索時に行っているサービス固有の工夫点

    長距離、近場施設の検索が難しかった

    検索対象範囲の切り替えに減衰関数を用いることで解決
    ▪ 住所の闇にハマったこと

    ジオコーディングを行う際に住所分割・正規化を甘く考えていた

    階層データを用いて手作業で解決!

    View full-size slide

  36. © GO Inc.
    文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください

    View full-size slide