地点検索の工夫


[NAVITIME JAPAN Advent Calendar 2019][adventcalendar] 1日目の記事です。

この記事では [Search Engineering Tech Talk 2019 Spring][searchtech-2019-spring] で発表した [「安心な移動」のためのPOI検索][slideshare] の解説を行います。



## はじめに
こんにちは。
ナビタイムジャパンの [lasta][github] です。

[NAVITIME JAPAN Advent Calendar 2019][adventcalendar] の1日目ということで、
NAVITIME のサービスの入り口の1つである地点検索について書きます。

多くのサービスは検索機能を持ちます。
EC サイトであれば商品やブランド等の検索機能、レシピサイトではレシピ検索機能を持つように、ナビゲーションアプリである NAVITIME は地点検索機能を持ちます。

この記事では、地点データ、経路探索サービスにおける検索の立ち位置について説明した後に、地点データの検索ならではの工夫について説明します。

## 地点データ (≒ POI データ)
### POI[^1] とは
Point of interest の略称です。
[Wikipedia][Wikipedia-POI] では下記のように説明されています。

> point of interestまたはPOIは誰かが便利、あるいは興味のある所と思った特定の場所のことである。

もともとは地図学の用語のため、聞き慣れない方も多いかもしれません。

聞き慣れない方は、「スポット」または「地点」と読み替えても差し支えはありません。
本記事では、移動の **目的地** となりうる場所を POI と定義します。

[^1]: [Point of Interest - Wikipedia][Wikipedia-POI]

### POI データの要素
上述の通り、 POI は移動の目的地となりうる場所を指します。
そのため、 POI データは必須要素として「名前」と「緯度経度」を持ちます。

| Key        | Value                                         | Required           |
|------------|-----------------------------------------------|--------------------|
| 名前       | (株)ナビタイムジャパン                        | :white_check_mark: |
| 読み       | なびたいむじゃぱん                            |                    |
| 緯度       | 35.667395                                     | :white_check_mark: |
| 経度       | 139.71490                                     | :white_check_mark: |
| 住所       | 東京都港区南青山3丁目8-38<br />南青山東急ビル | :white_check_mark: |
| 郵便番号   | 107-0062                                      |                    |
| カテゴリ   | 情報/通信/サービス                            |                    |
| ...        | ...                                           | ...                |

POI は数千万件あるため、検索しやすくするために様々なメタ情報を持ちます。
それらのうち、自然言語な要素のほとんどは単語か短文になります。
文章となっている要素は少しだけ存在するか、あるいは全く無かったりします。

## 経路探索サービスにおけるPOI検索の立ち位置

![POI検索がうまく行かない場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/5c3abcc8-1645-7591-f723-a70f2c4ba613.png)


縦軸はユーザの満足度、横軸はユーザがアプリを起動してからの時系列です。
経路探索アプリケーションを利用するユーザは、多くの場合、アプリを起動した後に目的地の検索をします。
目的地が見つからないと、経路探索を行うことができません。

![POI検索がうまくできた場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/46be3e89-ea48-62c4-d51a-9f13ecb247da.png)

ユーザが意図する目的地を正しく検索できて初めて経路探索を行うことができ、目的地にたどり着くことができます。

## 地点検索の工夫
NAVITIME の地点検索結果画面において、上位6件目以降を選択した割合は1割を下回り、
ほとんどの人が上位 5 件目以内を選択しています。

そのため、地点検索は情報検索 (Google 検索等) と少し似ています。

もし情報検索と似ているのであれば、キーワードの一致度が重要であるという仮説が立ちます。

### キーワードのみ重視した場合
[ホテル椿山荘東京][chinzanso] を検索したいシーンを想定します。
ある期間では、7割以上の方が「椿山荘」というキーワードで「ホテル椿山荘東京」を検索していました。

![「ホテル椿山荘東京」を検索する際の検索ワードの割合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/1ed1eccd-efe2-01ac-8913-e9b191f5fc1e.png)

仮にキーワードのみ重視すると、下図のように失敗します。

![「椿山荘」で「ホテル椿山荘東京」が上位にヒットしない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/9d66e485-66e7-a37f-66ed-49101a9b34c4.png)


実は「椿山荘 (つばきやまそう)」というアパートが全国にあり、「椿山荘 (ちんざんそう)」と完全一致してしまうため、「ホテル椿山荘東京」が上位に返却されません。

他にも似たようなものがありました。

| 🔍         | 期待値 :ok_woman: :+1: | 完全一致 :no_good: :-1: |
|------------|------------------------|-------------------------|
| 椿山荘     | ホテル椿山荘東京       | 椿山荘 (アパート)       |
| skytree    | 東京スカイツリー       | SkyTree (スナック)      |
| ディズニー | ディズニーランド       | ディズニー (美容室)     |

「椿山荘」では「ホテル椿山荘東京」を、「ディズニー」では「東京ディズニーランド」や「東京ディズニーシー」を思い浮かべる人が多いかと思います。
これらの共通点として、 **完全一致する POI よりも部分一致している POI のほうが有名である** ということが挙げられます。

以上から、キーワードの一致度だけではなく、 POI 自身の有名度を考慮すべきである、という仮設が立ちます。

### POI の有名度 [^2] を考慮する
この仮設を検証するために、検索スコアの要素として「キーワード一致度」に加えて「POI の有名度」を導入します。
他のサービスであれば、ページのビュー数や「いいね!」の数に応じたランキング等とほぼ同義です。
ここでは、ユーザのログを元に算出した独自のスコアを有名度として扱っています。

POI の有名度を考慮した結果、下図のように「ホテル椿山荘東京」が上位に返却されるようになりました。

![「椿山荘」で「ホテル椿山荘東京」が上位にヒットした](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/f8ee02c0-549d-c909-164f-33b80bf29629.png)


[^2]: ユーザのログを元に算出した独自のスコア

### POI の有名度を考慮した場合の NG 例
キーワード一致度と有名度を考慮するだけでは NG な場合があります。

![「セブンイレブン」で「有名なセブンイレブン」が上位にヒットした](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/35685d72-684a-6f05-353c-67669509973c.png)


上図の通りキーワード一致度と有名度を考慮し「セブンイレブン」を検索した場合、大きい商業施設付近のセブンイレブンが上位に返却されました。
セブンイレブンなどのようなチェーン店を検索する場合は、ユーザによって求めているセブンイレブンが異なります。
「セブンイレブン」というキーワードで検索した結果500件のうち、選択されたセブンイレブンの店舗のバリエーションは約450種類になったことから、この仮設は裏付けられます。

以上のことから、コンビニ等のチェーン店に行きたい場合は有名度ではなく、近いものがほしいという仮説が立ちます。
すなわち、距離の考慮も必要になります。

### 検索対象によって考慮すべき軸が異なる
これまでの仮説をまとめると、下記のように検索対象によって考慮すべき軸が異なる事がわかります。

* 有名なPOI (「椿山荘」 など)
    * 多くの人は「ホテル椿山荘東京」を期待
    * 「椿山荘」というアパートを目的地にする人は少ない
* チェーン店 (「セブンイレブン」 など)
    * 近いセブンイレブンを期待
    * 有名なセブンイレブンの店舗にはあまり興味がない

以上から、 POI の検索結果を構成する要素は下記の4つになり、これらを同時に考慮する必要があります。

* Famousness 有名度
* Precision 適合率
* Distance 距離
* Recall 再現率

## まとめ
POI データとその検索に対する工夫について解説しました。

これまでに述べた検索の要素のチューニングはもちろん、より高い検索 UX のためには様々な工夫を行う必要があります。
また、 POI 以外の検索を行う場合は、その検索対象に沿った工夫を行う必要があります。
ナビタイムジャパンでは、様々なデータに対する検索を日々研究開発しています。

様々なデータに対する検索の工夫については、 [検索技術勉強会][search-tech] がおすすめです。


明日は [NAVITIME JAPAN Advent Calendar 2019][adventcalendar] 2日目 Flutterをプロダクション導入した話 です。

[slideshare]: https://www.slideshare.net/NavitimeJapan/poi-141851184
[Wikipedia-POI]: https://ja.wikipedia.org/wiki/Point_of_interest
[github]: https://github.com/lasta
[chinzanso]: https://hotel-chinzanso-tokyo.jp/
[adventcalendar]: https://qiita.com/advent-calendar/2019/navitime_japan
[searchtech-2019-spring]: https://search-tech.connpass.com/event/126506/
[search-tech]: https://search-tech.connpass.com/