経産省発の npm モジュール!住所や電話番号の正規化、ジオコーディングなどができる IMI コンポーネントツールを試した!

Posted by miya on May 29, 2020 · 4 mins read

Photo by Luiz Centenaro on Unsplash

Code for Japan の関さんが SNS でシェアしてて知ったのですが、経産省さんがなにやらオープンソースで住所や電話番号の正規化などなどをするツールを公開したとのこと。

https://info.gbiz.go.jp/tools/imi_tools/

ぶっちゃけ当初はあまり期待していなかったのですが(笑)、試してみたらすばらしかったので紹介します。

IMI コンポーネントツール

まず、IMI ってなに?

IMI(Infrastructure for Multilayer Interoperability:情報共有基盤)は、電子行政分野におけるオープンな利用環境整備に向けたアクションプランの一環で、データに用いる文字や用語を共通化し、情報の共有や活用を円滑に行うための基盤です。文字情報基盤と共通語彙基盤により、行政サービスの相互運用性(Interoperability) 向上を図っています。

https://imi.go.jp/

ということだそうです。

今回紹介する IMI コンポーネントツールは、以下のツール類の総称で、それぞれ npm モジュールになっています。はい、ここが重要です。npm モジュールです。

  1. 住所変換コンポーネント
  2. 法人種別名の抽出コンポーネント
  3. 全角-半角統一コンポーネント
  4. データバリデーションコンポーネント
  5. 電話番号正規化パッケージ一式
  6. 日付型正規化パッケージ一式
  7. 産業分類候補生成パッケージ一式

配布元のページ を確認すると、それぞれのツールに src.tgztgz が用意されています。

どうやら 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番地」で試してみました。

おっ、おぅ。。。汗



Geolonia では、ウェブ地図や位置情報を利用したウェブアプリケーションや、モバイルアプリケーションの開発を承っています。

お問い合わせ