Header image

クラッソーネの開発者がエンジニアリングに関することもそうでないことも綴っています!

日本の住所を解析できるGem JapaneseAddressParserを紹介したい!

日本の住所を解析できるGem JapaneseAddressParserを紹介したい!

こんにちは、クラッソーネで Rails エンジニアをしている山口拓弥(@yamat47)です。

今年のバレンダインデーは大量のチョコをおともに SUPER BOWL を楽しみました。
しびれるシーソーゲームでしたね、とても楽しい試合でした!

https://twitter.com/nfl/status/1493057660836462594?s=12

さて今日は、私が最近作った Gem の紹介をします。
日本の住所を解析していい感じに構造化してくれるライブラリ、JapaneseAddressParser です!

https://github.com/yamat47/japanese_address_parser

そのライブラリを使うとどんなことができるの?

住所の文字列を入力すると、「都道府県」「市区町村」「町域」の3つを抽出して構造化したデータを返してくれます。
例えばこんな感じです:

address = JapaneseAddressParser.call('東京都港区芝公園4-2-8')

address.class #=> JapaneseAddressParser::Models::Address

prefecture = address.prefecture
prefecture.attributes #=> {:code=>"13", :name=>"東京都", :name_kana=>"トウキョウト", :name_romaji=>"TOKYO TO"}

city = address.city
city.attributes #=> {:code=>"13103", :formatted_code=>"13103", :prefecture_code=>"13", :name=>"港区", :name_kana=>"ミナトク", :name_romaji=>"MINATO KU"}

town = address.town
town.attributes #=> {:name=>"芝公園四丁目", :name_kana=>"シバコウエン 4", :name_romaji=>"SHIBAKOEN 4", :nickname=>nil, :latitude=>"35.656459", :longitude=>"139.74764"}

都道府県や市区町村、町域のデータはふりがなの情報も持っています。
そこで、こんな感じでふりがなデータにアクセスすることもできます:

address = JapaneseAddressParser.call('東京都港区芝公園4-2-8')
address.furigana #=> "トウキョウトミナトクシバコウエン 4"

また、このライブラリの動作を試すための簡単な Rails アプリを公開しています。
フォームから送信される値などのデータは一切保存していませんので、安心して色々試してみてください:

https://japanese-address-parser-demo.herokuapp.com/

このライブラリは MIT で公開しています。
ぜひ気軽に使ってみてください!

余談:技術的に工夫したところ

そもそも、こうした「日本の住所の解析」についてはすでに様々な OSS プロジェクトが存在します。
その中の一つが geolonia/normalize-japanese-addresses で、今回紹介したライブラリと同様のことができる npm のライブラリです。

https://github.com/geolonia/normalize-japanese-addresses

しかしこれは npm のライブラリなので、当然 Rails アプリから利用するのは難しいです。
「クライアント側の JavaScript から呼び出せばいいじゃん」といえば確かにそうなのですが...
サーバーの処理の中で呼び出したいというのが元々の動機だったため、Ruby からアクセスできるものを作ることにしました。

Ruby から npm (Node.js) にアクセスをするためには Shopify/schmooze を利用すると便利です。

https://github.com/Shopify/schmooze

今回作ったライブラリでも ライブラリ内に package.json を持ちつつnode_modules をライブラリのソースコードに含める という手法で geolonia/normalize-japanese-addresses を利用しています。

この辺りの実装方針はいただいたプルリクをきっかけに大きく軌道修正した内容でした。
コントリビューション、ありがとうございました!

https://github.com/yamat47/japanese_address_parser/pull/30

さらに余談:実際の Rails アプリでの使用例を紹介

私たちが運営する クラッソーネ というサービスは Ruby on Rails で作られていて、HTML の生成も含めてサーバー側で行なっている昔ながらな構成のアプリです。

日々運営担当のメンバーがお客様のサポートをする中で、「お申し込みいただいた建物の住所が読めずにコミュニケーションがまごつく」という課題がありました。
難読地名 とされるところはまだしも、自分が暮らしている地域以外の地名はなかなか読みづらいものです。
ありがたいことに全国様々な地域の方々にサービスを使っていただいていること、またそのサポート手段のメインがお電話であることも相まって、これがかなり深刻な課題になってしまっていました。

そこで運営担当向けの管理画面にて、今回作ったライブラリを使って住所の解析をし、ふりがなを表示するようにしました。
誰の手を煩わせることもなくそこそこいい精度で表示してくれるようになり、毎日のサポート業務の効率を上げることができました。

運営向けの管理画面に住所のふりがなを表示している様子

まとめ

「住所の解析をしたい!」というシンプルな用途のライブラリですが、解析自体がとても複雑で大変だからか、これまで存在していなかった種類のものでした。
きっかけは「住所の読み方を自動で解析できないか」というものでしたが、「ユーザーが入力した住所が妥当かどうか保存前に検証する」など他にも色々と応用ができそうです。

バグ報告や機能の提案など、コントリビュートはいつでも誰でも大歓迎です。
少しでも気になったことがあればいつでもご提案ください!(スターしてくれると嬉しいな)

https://github.com/yamat47/japanese_address_parser

クラッソーネでは、ソフトウェアの力で業務の効率化をしたいエンジニアを大募集しています。
ここまで読んでくださった皆さま、ぜひ私とカジュアル面談でお話ししましょう!


クラッソーネで Ruby on Rails を使ってサービス開発をしています。週末はアメフトのコーチをしたり選手もしたり、たまに審判もしたりしてます。エビ中もすき。