Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8691

IMI住所変換コンポーネントでいろんな住所を正規化してみた

$
0
0

先日、経済産業省から「IMIコンポーネントツール」というものが公開されました。

IMIコンポーネントツール
https://info.gbiz.go.jp/tools/imi_tools/

今回、この中の「(1) 住所変換コンポーネント」をいろいろ使ってみたので、そのことについて投稿したいと思います。

住所変換コンポーネントについて、以下のブログで詳しく解説されています。

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

住所変換コンポーネントは、簡単に言うとあいまいな住所表記を正規化してくれるツールと理解しています。
私は個人でLinked Open Addresses Japan(以下、住所LODと呼びます)という住所データをLinked Open Dataで公開するサイトを運営しています。

住所LODについて、以下のQiitaの投稿を参照してください。

緯度経度付き住所LODを作りました
https://qiita.com/uedayou/items/b6be807d36526593b4da

このサイトでも住所の正規化をしていますが、残念ながら不完全なもので、文字列としての住所からこの住所LODの当該住所のURLを取得しようとすると失敗してしまうことが多々ありました。
そこで、このIMIコンポーネントツールの住所変換コンポーネントで、さまざまな住所でどの程度、住所LODのURLが取得可能か試してみました。

使用する住所

ちょうど、DBpedia日本語版から取得した1万件ほどの住所(計10121件)を住所LODのURLに変換しようとしていましたので、このデータを使うことにしました。DBpediaのデータは、Wikipediaの編集データが元になっていますので、その多くが人手での入力であると思います。そのため住所の表記にもゆれが比較的あるデータになります。

都道府県別の変換対象住所数は以下のようになります(上位30件)。

住所件数住所件数住所件数
東京都870大阪府572北海道555
愛知県533兵庫県422神奈川県402
千葉県384福岡県381長野県271
広島県263京都府256埼玉県255
三重県250静岡県234新潟県225
富山県201福島県197岐阜県195
岩手県194宮城県185岡山県178
高知県174熊本県169山口県168
青森県160愛媛県156秋田県153
群馬県150奈良県141茨城県136

住所変換コンポーネントで住所LODのURLを取得するスクリプト

変換に使用したスクリプト(node)は以下のようなものです。

index.js
constfs=require('fs');constaxios=require('axios');constconvert=require('imi-enrichment-address');constgetLoaUri=async(adr)=>{consturl="http://uedayou.net/loa/"+encodeURI(adr);try{constres=awaitaxios.get(url);returnres.request.res.responseUrl;}catch(e){console.error(`${e.response.status}: ${e.response.statusText}`);}};constgetAddress=async(str)=>{constjsonld=awaitconvert(str);constobj=jsonld['住所'];letmetadata,address;if('メタデータ'injsonld){metadata=jsonld['メタデータ']['説明'];console.log(`説明: ${jsonld['メタデータ']['説明']}`);}if('都道府県'inobj){address=obj['都道府県']+(obj['市区町村']||"")+(obj['']||"")+(obj['町名']||"")+(obj['丁目']?obj['丁目']+"丁目":"")+(obj['番地']?obj['番地']+"番地":"")+(obj['']||"");}return{metadata,address};};(async()=>{constaddress="霞が関2";console.log(`入力: ${address}`);constnorm=awaitgetAddress(address);console.log(`正規化: ${norm.address}`);if(norm.address){consturi=awaitgetLoaUri(norm.address);console.log(`住所LOD: ${decodeURIComponent(uri)}`);}})();

スクリプトを動かすには axios と imi-enrichment-address をインストールする必要があります。

npm install axios
npm install https://info.gbiz.go.jp/tools/imi_tools/resource/imi-enrichment-address/imi-enrichment-address-2.0.0.tgz

node index.jsで実行すると以下のように住所「霞が関2」が正規化され、住所LODのURLを取得します。

入力: 霞が関2
正規化: 東京都千代田区霞が関2丁目
住所LOD: http://uedayou.net/loa/東京都千代田区霞が関二丁目

正規化・住所LOD URL取得精度

10121件の住所について、どれくらい正規化、住所LODのURLが取得できたかを集計しました。

件数割合
正規化955494.4%
URL変換675070.7%

※URL変換の割合の分母は正規化に成功した数(9554)です。

住所変換コンポーネントでの正規化についてはかなり高い割合で成功しました。また、その正規化したデータから70% 住所LODのURLが取得できました。

住所変換コンポーネントによる正規化をせずに住所LODのURL取得をした結果と比較すると

件数
URL変換
(正規化あり)
6750
URL変換
(正規化なし)
4880

と正規化により、これまで失敗していた住所もたくさんURL取得できできるようになったことがわかりました。

住所変換コンポーネントで正規化すると、その住所の位置情報(緯度経度)も付与されます。どの程度付与されるかも調べてみました。

件数
正規化9554
位置情報9302

正規化された住所のほとんどに位置情報が付与されましたが、ごく一部付与されないものもありました。

最後に住所の正規化でのエラーメッセージをまとめました。

エラーメッセージ件数
該当する町名が見つかりません467
該当する地名が見つかりません38
該当する市区町村名が見つかりません31
該当する丁目が見つかりません21
該当する地名が複数あります6
地名コードに対応するインスタンスがありません4

正規化・URL取得に失敗する場合

正規化できなかった住所の都道府県上位10件を集計しました。

住所件数割合
北海道16229.2%(162/555)
京都府4116.0%(41/256)
愛知県397.3%(39/533)
奈良県3323.4%(33/141)
大阪府295.1%(29/572)
岐阜県2613.3%(26/195)
高知県2313.2%(23/174)
長野県238.5%(23/271)
埼玉県218.2%(21/255)
福岡県123.1%(12/381)
愛媛県117.1%(11/156)

割合として、北海道、奈良、京都が比較的高い印象があります。京都は通り名がついた特殊な住所は正規化し難いことが影響しているのかも、と思いますが、北海道、奈良は詳細を見ないとよくわかりません。単純に書き間違いが多いのかもしれません。

住所LODのURL取得の失敗は以下の通りです。

住所件数
北海道272
長野県171
青森県135
福岡県133
千葉県111
岩手県109
福島県108
愛知県108
新潟県105
静岡県101
三重県96

正規化失敗より数が多くなっています。これは、住所LODは住所に「郡」を含めるのに対し、住所変換コンポーネントは郡を削除してしまうことが大きく、ランキングに大都市圏が少ない理由はそのあたりが影響しているようです。このあたりは住所LOD側での工夫が必要だと思います。

「京都府相楽郡精華町精華台1」を変換した結果
{
  '@context': 'https://imi.go.jp/ns/core/context.jsonld',
  '@type': '場所型',
  '住所': {
    '@type': '住所型',
    '表記': '京都府相楽郡精華町精華台1',
    '都道府県': '京都府',
    '都道府県コード': 'http://data.e-stat.go.jp/lod/sac/C26000',
    '市区町村': '精華町',
    '市区町村コード': 'http://data.e-stat.go.jp/lod/sac/C26366',
    '町名': '精華台',
    '丁目': '1'
  },
  '地理座標': { '@type': '座標型', '緯度': '34.752484', '経度': '135.786199' }
}

IMI住所変換コンポーネントを使ってみて

人手で入力された住所について、そのほとんど(94%)が正規化に成功し、高い確率で位置情報の取得もできました。当初の目的の住所LODのURL取得についても取得割合を大きく向上できました。
少しコードがかければその扱いも比較的容易ですし、今後多方面で活用できるツールになるのかなと思いました。

住所LODにIMI住所変換コンポーネントを組み込んでみた

早速、住所LODの表記ゆれ修正部分に住所変換コンポーネントを組み込んでみました。
今までよりも少しだけレスポンスに時間がかかりますが、これまでNot Foundになっていた住所が住所LODの該当ページに転送できるようになりました。

例えば、「霞が関2」ではこれまでは、住所LODのページは見れませんでしたが、IMI住所変換コンポーネントにより、http://uedayou.net/loa/東京都千代田区霞が関二丁目に転送されるようになりました。

住所LOD「霞が関2」ページ


Viewing all articles
Browse latest Browse all 8691

Trending Articles