概要
地球上のあらゆる位置を、3つの単語の組み合わせで一意に特定することができるサービスである、what3words。what3wordsで使われている単語かどうかを判定したい場面があった。
状況
謎解き系のイベントにて、最終的にWhat3wordsで表される特定の位置が答えとなる問題を作成した。
その問題はざっくり言えば、回答者が送信するワードと正解となる単語を比較しWordleチックに判定を行い、回答者はその結果を元に正解となる単語を推測するというもの。
このシステムを実装するにあたり、回答者が入力するワードをwhat3wordsに存在するワードに絞る必要があった1。
しかし、What3wordsは使用されている単語のリストを公開していない。
対応
最初に断っておくと、今回の対応は、あくまでもWhat3wordsに存在しない単語を絶対に受け入れないことに主眼を置いた方法であり、What3wordsに存在する単語であっても拒否される可能性があると推測される。What3wordsに存在する単語を拒否してしまうことが問題になるユースケースでは、本対応を利用するべきではない。理由については後述。
ある文字列がWhat3wordsに存在するかどうかを判定するに当たっては、What3wordsが提供するAPIのうちの"Auto Suggest"を利用した。これは、2単語が完全入力された状態で、かつ3単語目を途中まで入力したときに、それらの組み合わせから推測されるwhat3wordsの候補を複数返却するという機能である。Google検索のサジェスト機能のような末尾までの入力をさぼるという使い方の他、似たような単語の入力間違いを防ぐといった使い方も想定されている。
ここで重要なのは、AutoSuggestは入力に対し最もよく類似する 実在する3単語の組み合わせ を返却するということである。
これは裏を返すと、実在する3単語の組み合わせをAutoSuggestに入力した場合、返却結果の1番目には入力した組み合わせそのものが含まれているということである。
したがって、ある単語がWhat3wordsに存在しているかどうかは、以下のようにして確認することができる。
- 確認したい単語を3つ並べたwhat3wordsライクな文字列を作成する(例:ふつか。ふつか。ふつか)
- 1で生成したwhat3wordsライクな文字列をAutoSuggestの引数としてAPIを実行する
- APIの返却結果の1番目を確認し、それが1で生成した文字列と一致するならば、その単語はwhat3wordsに確実に存在する。もし、1で生成した文字列と異なる場合は、what3wordsに存在しない可能性がある。
備考
ここまで、この方法ではwhat3wordsに存在しないとは断定できないと述べてきた。その理由は、what3wordsがどのように単語の組み合わせを生成し割り当てているかというアルゴリズムを公開していないことにある。ある単語を3つ並べた3単語の組み合わせが存在しないからといって、異なる単語と組み合わせた3単語の組み合わせも存在しないとは限らない。そのため、この方法では、実際にはwhat3wordsで使われる単語が弾かれる可能性がある。
脚注
-
Wordle的に判定するという仕様上、abcdefghijklm...のような単なるアルファベットの羅列を送信されると問題が簡単になってしまう。それを避けるため、なんらかの単語リストに存在するワードしか送信できないよう制約をかける必要があった(本家Wordleも同じ仕様だったはず)。そういう意味ではWhat3wordsに存在する単語で制約する必然性はなく、何らかの辞書に載っている単語、などでもよかったのだが、今回は最終的にwhat3wordsに存在する単語に制約した。 ↩