Photo by Luiz Centenaro on Unsplash
Code for Japan の関さんが SNS でシェアしてて知ったのですが、経産省さんがなにやらオープンソースで住所や電話番号の正規化などなどをするツールを公開したとのこと。
https://info.gbiz.go.jp/tools/imi_tools/
経産省が住所変換や法人種別名、電話番号の正規化に使えるIMIコンポーネントツールを公開しました。
— Hal Seki (@hal_sk) May 28, 2020
ソースコードも公開。README にも使い方が丁寧に書かれていました。https://t.co/fPbV00EgZP
素晴らしい動き。こういう... #NewsPicks https://t.co/bew0qGKMFE
ぶっちゃけ当初はあまり期待していなかったのですが(笑)、試してみたらすばらしかったので紹介します。
まず、IMI ってなに?
IMI(Infrastructure for Multilayer Interoperability:情報共有基盤)は、電子行政分野におけるオープンな利用環境整備に向けたアクションプランの一環で、データに用いる文字や用語を共通化し、情報の共有や活用を円滑に行うための基盤です。文字情報基盤と共通語彙基盤により、行政サービスの相互運用性(Interoperability) 向上を図っています。
ということだそうです。
今回紹介する IMI コンポーネントツールは、以下のツール類の総称で、それぞれ npm モジュールになっています。はい、ここが重要です。npm モジュールです。
配布元のページ を確認すると、それぞれのツールに src.tgz
と tgz
が用意されています。
どうやら src.tgz
はソースで、tgz
はビルド済みのもののようです。それぞれの README.md の「開発者向け情報」というところにビルド方法が書いてありますが、今回はビルド済みのものを使用してササッと動作確認してみました。
コマンドラインが使える方なら、ビルド済みのコンポーネントを試す手順は超簡単です。
$ curl https://info.gbiz.go.jp/tools/imi_tools/resource/imi-enrichment-address/imi-enrichment-address-2.0.0.tgz -o imi-enrichment-address-2.0.0.tgz
$ tar -xzvf imi-enrichment-address-2.0.0.tgz
$ cd package
$ npm install
$ npm start
以上で、Node.js のサーバーが起動します。
ブラウザで http://localhost:8080 を開いてください。
以下のスクリーンショットのようなページが開けば成功です。
さっそく 日付文字列
のフィールドに住所を入力してみましょう。(なんで「日付」? 笑)
まず弊社の住所を入れてみます。 curl
でも試せるようなのでそれでやってみましょう。
$ curl -X POST -H 'Content-Type: text/plain' -d '東京都千代田区岩本町2-10-6 川原ビル5F' http://localhost:8080/
コマンドの結果は以下の通り。
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "東京都千代田区岩本町2-10-6 川原ビル5F",
"都道府県": "東京都",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
"市区町村": "千代田区",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
"町名": "岩本町",
"丁目": "2",
"番地": "10",
"号": "6"
},
"地理座標": {
"@type": "座標型",
"緯度": "35.693526",
"経度": "139.776933"
}
}
なんとジオコーディングに対応しているようです。これに関しては後述しますね。
あと、住所の 2-10-6
の部分が 丁目
、番地
、号
にパースされています。すばらしいですね。
さらに、住所の正規化を試してみます。さっきと同じ住所で 東京都
の部分を削除してリクエストしてみましょう。
$ curl -X POST -H 'Content-Type: text/plain' -d '千代田区岩本町2-10-6 川原ビル5F' http://localhost:8080/
以下のように同じ結果が得られました。
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "千代田区岩本町2-10-6 川原ビル5F",
"都道府県": "東京都",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
"市区町村": "千代田区",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
"町名": "岩本町",
"丁目": "2",
"番地": "10",
"号": "6"
},
"地理座標": {
"@type": "座標型",
"緯度": "35.693526",
"経度": "139.776933"
}
}
筆者は、本州最南端という辺境の地に住んでいまして、たぶん日本で一番難解な漢字を使っている住所です。
(自分の住所をちゃんと漢字で書いたことが一度もありませんw)
$ curl -X POST -H 'Content-Type: text/plain' -d '和歌山県東牟婁郡串本町鬮野川' http://localhost:8080/
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "和歌山県東牟婁郡串本町鬮野川",
"都道府県": "和歌山県",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C30000",
"市区町村": "串本町",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C30428",
"町名": "鬮野川"
},
"地理座標": {
"@type": "座標型",
"緯度": "33.493026",
"経度": "135.784941"
}
}
次に 東牟婁郡
を取り除いてみましょう。
$ curl -X POST -H 'Content-Type: text/plain' -d '和歌山県串本町鬮野川' http:/localhost:8080/
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "和歌山県串本町鬮野川",
"都道府県": "和歌山県",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C30000",
"市区町村": "串本町",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C30428",
"町名": "鬮野川"
},
"地理座標": {
"@type": "座標型",
"緯度": "33.493026",
"経度": "135.784941"
}
}
東牟婁郡
ありでもなしでも同じ結果が得られました。正規化後の住所では 郡
は取り除かれるものなのですね。
上の方でちらっと書きましたが、このツールには住所から緯度経度を返してくれる機能もあります。ジオコーディングというやつですね。
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "東京都千代田区岩本町2-10-6 川原ビル5F",
"都道府県": "東京都",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
"市区町村": "千代田区",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
"町名": "岩本町",
"丁目": "2",
"番地": "10",
"号": "6"
},
"地理座標": {
"@type": "座標型",
"緯度": "35.693526",
"経度": "139.776933"
}
}
これに関しては、残念ながら Google の ジオコーディング API ほどの精度はなく、たぶん街区レベル位置参照情報を使っているのではないかと思われます。
なので、ユースケースによっては過剰な期待をしないほうがいいかもしれませんが、ライセンス的に制約がすくないのでユースケースは多そうです。
このコンポーネントは、残念ながら GitHub にも npm リポジトリにも登録されていません(5/29 現在)ので、npm モジュールとしてロードして自分たちのプロジェクトで使用するには、ややコツが必要です。
今回は、やや乱暴ですが npm スクリプトの postinstall
を使って取り込むようにしてみました。
以上で、自分のプロジェクト内で npm install
と叩けば勝手にいい感じでやってくれると思います。
Twitter で指摘があって、普通に yarn add
とか npm install
で .tgz
を指定すれば行けるよとのことで試してみたら行けました!
$ npm install https://info.gbiz.go.jp/tools/imi_tools/resource/imi-enrichment-address/imi-enrichment-address-2.0.0.tgz
まじかー、知りませんでした。 @ykzts さんご指摘くださってありがとうございます!
このモジュールを使った最もシンプルなサンプルは以下のような感じになるのではないかと思います。
#!/usr/bin/env node
const enrichment = require("imi-enrichment-address")
enrichment('東京都千代田区霞が関1-3-1').then(json => {
console.log(JSON.stringify(json));
});
これを index.js
というファイルに保存して実行してみましょう。出力は JSON なので jq
コマンドで整形しています。
$ node index.js | jq .
{
"@context": "https://imi.go.jp/ns/core/context.jsonld",
"@type": "場所型",
"住所": {
"@type": "住所型",
"表記": "東京都千代田区霞が関1-3-1",
"都道府県": "東京都",
"都道府県コード": "http://data.e-stat.go.jp/lod/sac/C13000",
"市区町村": "千代田区",
"市区町村コード": "http://data.e-stat.go.jp/lod/sac/C13101",
"町名": "霞が関",
"丁目": "1",
"番地": "3",
"号": "1"
},
"地理座標": {
"@type": "座標型",
"緯度": "35.673944",
"経度": "139.752558"
}
}
AWS の API Gateway + Lambda でいい感じの API を簡単につくることができそうですね。
せっかくの npm モジュールなのに GitHub にも npm リポジトリにも登録されていないところが超残念ではありますが、政府組織ならではの難しさもあるでしょうから、そういう部分をバイパスしてとりあえず公開してくれたという意味では、前向きに評価してもいいのではないかと思いました。
完璧を求めるあまり、結果的に何もしないということはよくありますからね。
とはいえめんどくさいのは事実なので、少しでも早く npm install xxx
で使えるようになる日をお待ちしています。
勝手な妄想ですが npm install @imi/enrichment-address
のようにインストールできるように名前空間をつけて公開するとかっこいいかも!
(この名前空間が開いてるかどうかは調べてないw)
コードのクオリティは高いなと思いました。 mocha
を使ったテストも書かれていて、内部的には CI をやっているのかもしれませんね。
なんにしろ経産省からこういうものがリリースされる時代が来るとはすばらしいですね。正直言ってこういうことは日本では10年以上無いだろうなーと思っていました。
今回の記事では、住所変換コンポーネントを試しただけですが、後日他のコンポーネントも試してみたいと思います!
京都市役所の住所「京都市中京区寺町通御池上る上本能寺前町488番地」で試してみました。
おっ、おぅ。。。汗