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

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

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

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

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


[経産省発の npm モジュール！住所や電話番号の正規化、ジオコーディングなどができる IMI コンポーネントツールを試した！](https://blog.geolonia.com/2020/05/29/imi-tools.html)

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

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

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

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

## 使用する住所

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

※ 追記
以下の住所は、[緯度経度付き鉄道オープンデータ提供サイト公開しました](https://qiita.com/uedayou/items/b5131b5ca930fe0bef69) で紹介している[鉄道駅LOD](https://uedayou.net/jrslod/)でに使用するためにDBpediaから取得した住所になります。なので、日本全国の鉄道駅の住所です。


都道府県別の変換対象住所数は以下のようになります(上位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)は以下のようなものです。

```javascript:index.js

const fs = require('fs');
const axios = require('axios');
const convert = require('imi-enrichment-address');

const getLoaUri = async (adr) => {
  const url = "http://uedayou.net/loa/"+encodeURI(adr);
  try {
    const res = await axios.get(url);
    return res.request.res.responseUrl;
  } catch (e) {
    console.error(`${e.response.status}: ${e.response.statusText}`);
  }
};

const getAddress = async (str) => {
  const jsonld = await convert(str);
  const obj = jsonld['住所'];
  let metadata, address;
  if ('メタデータ' in jsonld) {
    metadata = jsonld['メタデータ']['説明'];
    console.log(`説明: ${jsonld['メタデータ']['説明']}`);
  }
  if ('都道府県' in obj) {
    address = obj['都道府県']+(obj['市区町村']||"")
      +(obj['区']||"")+(obj['町名']||"")
      +(obj['丁目']?obj['丁目']+"丁目":"")
      +(obj['番地']?obj['番地']+"番地":"")
      +(obj['号']||"");
  }
  return {metadata,address};
};

(async()=>{
  const address = "霞が関2";
  console.log(`入力: ${address}`);
  const norm = await getAddress(address);
  console.log(`正規化: ${norm.address}`);
  if (norm.address) {
    const uri = await getLoaUri(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が取得できたかを集計しました。

 |件数|適合率
---|---|---
正規化|9554|94.4%
URL変換|6750|70.7%
※URL変換の割合の分母は正規化に成功した数(9554)です。

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

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

 |件数
---|---
URL変換<br>(正規化あり)|6750
URL変換<br>(正規化なし)|4880

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

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

 |件数
---|---
正規化|9554
位置情報|9302

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

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

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

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

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

都道府県|件数|適合率
---|---|---
北海道| 162| 29.2%(162/555)
京都府| 41| 16.0%(41/256)
愛知県| 39| 7.3%(39/533)
奈良県| 33| 23.4%(33/141)
大阪府| 29| 5.1%(29/572)
岐阜県| 26| 13.3%(26/195)
高知県| 23| 13.2%(23/174)
長野県| 23| 8.5%(23/271)
埼玉県| 21| 8.2%(21/255)
福岡県| 12| 3.1%(12/381)
愛媛県| 11| 7.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」ページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62575/82ff4ea4-c01e-d4fa-132f-66d12b86249d.jpeg)