住所正規化APIをロケタッチでリリースしたよ!1

カテゴリ
ブックマーク数
このエントリーを含むはてなブックマーク はてなブックマーク - 住所正規化APIをロケタッチでリリースしたよ!1
このエントリーをはてなブックマークに追加
LINE が PC から使えるようになって、自社サービスなのに wktk しながらハックしてた大沢Yappo和宏です。こんにちわ。初めましての人は初めましてね。

今回は、先日ロケタッチの API に、住所正規化 APIを追加したので簡単な紹介をします。

ロケタッチ API って何?

ロケタッチ API は、ロケタッチのユーザーデータ、スポットデータ、チェックインデータ等にアクセスできる API です。
OAuth2 で実装されているので、どのような言語からも利用しやすくブラウザだけで完結するような JavaScript アプリケーション等にも気軽に導入する事が出来ます。

Perl の世界だと Amon2 という Web Application Framework の認証プラグインとしてAmon2::Auth::Site::Loctouchが CPAN にあるので、これを使うと簡単にロケタッチアプリケーションを書く事が出来ます。

住所正規化 API ってなに?

住所というのは人によって書き方が変わってくるものですが、この個人差がある住所を一定のルールに沿って正規化をする為に使える API です。

例えば東京都品川区大崎2-1-1 ThinkPark Tower 23階と言う住所は以下のようにも表現出来ます。

  • 東京都品川区大崎2丁目1番1号 ThinkPark Tower 23階(丁目以降の表記を漢字と数字で表す)
  • 東京都品川区大崎2の1の1 ThinkPark Tower 23階(- の変わりに の)
  • 東京都品川区大崎2−1−1 ThinkPark Tower 23階(数字部分が全角)
  • 東京都品川区大崎2-1-1ThinkPark Tower 23階(ビル名の区切りがわからない)
  • 品川区大崎2-1-1 ThinkPark Tower 23階(都道府県を省略)
  • 東京都大崎2-1-1 ThinkPark Tower 23階(自治体名を省略)
こういった自由な感じの住所を、足りない部分を補完しつつ数字部分の書式を統一して東京都品川区大崎2-1-1 ThinkPark Tower 23階と変換します。

使い方

単純な JSON API なので、単純に GET リクエストを飛ばすだけで良いです。
https://api.loctouch.com/v1/geo/address_normalize?address=[正規化処理したい住所]
という URL にアクセスすると正規化された住所を含んだ JSON が帰ってきます。

例えば札幌市役所の住所を変換する処理を Perl で書きたい場合には以下のように書きます。
use strict;
use warnings;
use 5.015;
use JSON;
use LWP::Simple;
use URI;

my $uri = URI->new('https://api.loctouch.com/v1/geo/address_normalize');
$uri->query_form(address => '札幌市中央区北1-西2');
my $json = get($uri);
my $data = decode_json($json);
say $data->{result}{address}; # 北海道札幌市中央区北一条西2丁目
戻ってくるデータとしては、正規化後の住所の自治体コード、郵便番号、○○県○○市などの自治体名、町域、丁目番地号などの数字部分、ビル名がそれぞれ別の項目として JSON に含めています。

ロケタッチ Developers サイトでは、 JSON API をブラウザで確認出来るAPI Explorer(要ロケタッチのログイン)があり、これを使って簡単に確認する事も出来ます。

49

その他の詳細はドキュメントをご覧下さい。

どうして作ったの?

ロケタッチでは様々なスポットデータが登録されています。そのスポットの属性として住所情報も登録されているのですが、基本的には利用者の皆様の手作業によって住所情報が埋められています。
人によって住所の書き方が違うと言うのは先ほど述べた通りですが、ロケタッチではスポットに登録されている住所を元にして(NDA)な事をやろうと計画しているため、住所表記の正規化は重要なミッションでした。

わかりやすい例だと、同じ住所のスポットがいくつかあった場合には重複したスポット同士の可能性があるので、それぞれのスポットをマーキングしておくことによってデータメンテナンスの効率が捗ります。
他にも、同一住所で同じビル名のスポットを集めておいて、おっと誰かが来たようだ。

本当はサービスの中だけで使う API として実装していたのですが、他の位置情報関係の API を見渡しても住所正規化に特化した API は見当たらなかったので「これは Open & Share したら有用なんじゃないか?」と言った意見が社内で出てきたのでロケタッチ API として出す事になりました。

どうやって作ったの?

「膨大な住所データベースを元に正規化しているんじゃないか?」と思う方も居るでしょうが、実際には住所データを元にした巨大な正規表現を使って処理しています。

都道府県が抜けた住所の補完や、東京都南青山などのように真ん中の部分が抜けた住所の穴を埋める為に、正規表現を駆使して妥当な候補を選んで、確実な候補だけを返すようにしています。

でかい正規表現としてもモジュールファイルのサイズとしては二桁メガバイトなのですが、 plackup してモジュールをロードした後のメモリ使用量は200MBを越えます。 use するだけでも数秒かかってしまう壮大なものになってますが、一度ロードされたら変換速度は速いのでロケタッチ API で使う分には十分だろうという事で公開に踏み切りました。

でかい正規表現の他にも、各地域の住所表記に合わせた泥臭い処理は多数入っていますけどね。。。

今は郵便番号を返す部分だけ手抜きして MySQL にクエリ投げちゃってるのですが、これもモジュールファイル化する予定なので、実質的には IO 処理が一切走らない実装になる予定です。

まとめ

最後にまとめると

  • 住所正規化 API をリリースしました
  • 住所正規化の重要性を簡単に説明しました
  • どのような仕組みで実装されているかの簡素な説明を行いました
  • 実装に関する基本的な考え方や基礎については、私の6年前の Shibuya.PM の資料5年前の YAPC::Asia の資料をご覧下さい
  • もっと詳しい内容に関しては、どこかのカンファレンスで Open & Sahre するかもしれません
といった内容のエントリを書かせて頂きました。

現在は、ロケタッチに登録されている住所に最適化されてる部分があるので、もし利用したときに気になった事、ご意見等がございましたらロケタッチ Developers Forumまで feedback をお寄せいただければ幸いです。


どうぞご利用下さい。