geolonia/normalize-japanese-addresses

町丁目データにローカルファイルを使用すると Unicode の normalize 形式によって住所を正規化できないケースがある

kaznak opened this issue · 2 comments

便利なライブラリを作ってくださってありがとうございます。

先日このライブラリを使用して CSV データの住所を正規化するコマンドラインプログラムを作成しました1
本日パフォーマンス向上のため、町丁目データにローカルファイルを使用するようにしたところ、表題の現象が発生しましたので報告いたします。

  • 実行環境: Macbook Pro(intel) Catalina 10.15.7
  • node: 16.13.1

再現過程:

$ cat tmp/test.csv                                           
address
茨城県つくば市筑穂1丁目10−4 つくば市大穂体育館
$ uconv -x nfkd tmp/test.csv | normalize-japanese-addresses 1
address,pref.1,city.1,town.1,addr.1,lat.1,lng.1,level.1
茨城県つくば市筑穂1丁目10−4 つくば市大穂体育館,茨城県,,,つくば市筑穂1丁目10-4 つくば市大穂体育館,,,1
$ uconv -x nfkc tmp/test.csv | normalize-japanese-addresses 1
address,pref.1,city.1,town.1,addr.1,lat.1,lng.1,level.1
茨城県つくば市筑穂1丁目10−4 つくば市大穂体育館,茨城県,つくば市,筑穂一丁目,10-4 つくば市大穂体育館,36.136132,140.082148,3

pref.1, city.1, town.1, addr.1, lat.1, lng.1, level.1 はそれぞれ
<正規化結果の JSON のキー>.<正規化対象のフィールドインデックス>
となっており、ご覧の通り NFKD で正規化された住所はつくば市以降の住所の正規化に失敗しています。
このケースでは が NF(K)C と NF(K)D とで、と濁点で一つの文字になるか二つの文字になるか異なるため、正規化に失敗しているのだとおもわれます。

これ以外の現象として、 japanese-addresses-master/api/ja/茨城県/つくば市.json が見つからないというエラーが発生するケースも確認されています。 docker の ubuntu イメージで実行した際に発生したのですが、まだ再現手順は作成していません。このケースではデータは NFKC 正規化されたものでした。ファイル名を NFC で正規化するとエラーが発生しなくなりました。おそらく同種の問題かと思われます。

以上です。

Footnotes

  1. https://github.com/kaznak/normalize-japanese-addresses-cli

@kaznak ご指摘いただきありがとうございます!
Unicode 正規化のフォーマットの違いついても、本ライブラリで住所の正規化の前に吸収できればと思います。 #161 で修正作業を行なっています。

@kaznak こちら、リリースのタイミングが遅くなり申し訳ありません。
v2.5.7 のリリースで normalize 形式の違いを吸収する処理が追加されています。
お試しいただけますと幸いです。フィードバックをお寄せいただきありがとうございました!