Open1

住所の表記ゆれを整えるツールを試してみる

grafumografumo

目的

住所を正規化するツールを検討
条件1) インストールしやすい:ライブラリのインポート程度
条件2) ライセンスがゆるい:できればMIT

候補

  1. https://github.com/t-sagara/jageocoder
  2. https://github.com/geolonia/normalize-japanese-addresses
  3. https://github.com/digital-go-jp/abr-geocoder
    全てMITライセンス

とりあえずgeoloniaさんのを試してみた

環境は
OS: Windows
shell: Powershell

公式の方法: JavaScript/node

  1. nodeがインストールされていない場合はインストール.参照: Microsoft推奨方法

git clone https://github.com/geolonia/normalize-japanese-addresses.git
cd normalize-japanese-addresses
npm install
npm run build
import { normalize } from '@geolonia/normalize-japanese-addresses';
// ESMを利用しない場合は下記
// const { normalize } = require('@geolonia/normalize-japanese-addresses');

normalize('北海道札幌市西区24-2-2-3-3').then(result => {
  console.log(result);
  // {
  //   "pref": "北海道", // 都道府県名
  //   "city": "札幌市西区", // 市区町村名
  //   "town": "二十四軒二条二丁目", // 大字・丁目名
  //   "addr": "3-3", // 街区符号・住居符号または地番
  //   "level": 8, // 正規化レベル
  //   "point": {
  //     "lat": 43.074206115, // 緯度
  //     "lng": 141.315540696, // 軽度
  //     "level": 8 // 位置情報データレベル
  //   },
  //   "other": "" // 正規化できなかった文字列
  // }
})

ありがたすぎる😭

余談

JavaScript初心者の私はESMって何?って思ったのですが,ざっくり言うと,ESM(ES Module)は export/ importで別ファイルの機能をインポートするが,ESMじゃない場合(CommonJSなど)はconst=インポート先のファイルみたいな形で行うみたいです.
詳細は以下を参照.

Pythonライブラリ

python版も有志の方が書いてくれている😭🙌
詳細参照: https://pypi.org/project/normalize-japanese-addresses/

pip install normalize-japanese-addresses
from normalize_japanese_addresses import normalize
print(normalize("北海道札幌市西区24-2-2-3-3", level=1))

住所情報をgeoloniaさんのWebAPIではなく,ローカルファイル参照にする方法

今までの方法では,毎回geoloniaさんに住所情報のリクエストを送っているのですが,正規化する住所の量が多くなると,おそらくgeoloniaさんのサーバに迷惑をかけてしまうので,ローカルで実行する方法も検証したい.

まずは住所情報をダウンロード

Invoke-WebRequest -URI https://github.com/geolonia/japanese-addresses/archive/refs/heads/master.tar.gz -OutFile master.tar.gz

wslが入っていれば:

wsl tar -xzf master.tar.gz

wslなければ:
手動で解凍

pythonライブラリではできたが

print(normalize("北海道札幌市西区24-2-2-3-3", endpoint="file://現在のディレクトリまでのPATH/japanese-addresses-master/api/ja"))

jsでのやり方は分からなかった...
jsだとconfig.japaneseAddressesApi: stringをどこで指定し直せばいいのか?
src/config.ts内のjapaneseAddressesApiを変更してみたけどダメだでした.
恐らく変更場所が違うのでしょう...

export const currentConfig: Config = {
  //japaneseAddressesApi: defaultEndpoint,
  japaneseAddressesApi: 'file://C:/Users/.../normalize-japanese-addresses/japanese-addresses-master/api/ja',
  cacheSize: 1_000,
}