ケンオール通信第7号: 日本の住所の構造と郵便番号データ

ケンオール通信第4号では、郵便番号データの処理方法の最初の一歩として、複数行の結合について紹介しました。データ処理の続きを説明する前に、まず日本の住所とはどういう構造になっているかを紹介します。

日本の住所の構造

日本の住所は、領域の大きい地域名から小さい地域に向かって書いていくという構造です。この大から小という構造は、日本の他に中国や韓国、台湾などが用いており、東アジア諸国では一般的な記法ですが、世界的には小さい領域から大きい領域に向かって書いていくという記法が一般的です。 余談ですが、東アジア以外の全ての国が小から大という表記ではなく、ハンガリーなど一部の国で大から小という表記形式を採用しています。

さて、日本の住所構造を詳しくみていくことにします。以下の図は、今尾恵介著「番地の謎」(光文社知恵の森文庫)より引用させていただいた、地名の階層構造です。この「番地の謎」は大変素晴らしい内容ですので、日本の住所に興味のある方は是非読んでください。

「東京23区」「政令指定市」「区」「市」「郡」「町村」に相当する部分が、地方自治法第1条の3で定義される地方公共団体となります。これらの名称およびIDについては全国地方公共団体コードで定義されており、構造ゆれや表記ゆれ等は存在しません。

この次の階層に登場するのが、「町または大字」です。ここで表記される「町」は、地方公共団体としての「町」とは異なるものですので注意が必要です。 「町または大字」の下には「丁目」や「字あるいは小字」が続きます。 大字・小字とありますが、これはもともと小字の方が古来から存在していた住所単位です。大字は1889年(明治22年)の市町村合併、いわゆる明治の大合併時に生まれたもので、合併前の旧町村名を大字としなさいという内務大臣の訓令(内務大臣訓令第352号、明治21年6月13日)によるものでした。*1 *2 *3なお、この合併による大字の新設は1953年(昭和28年)から始まる昭和の大合併でも実施されています。

ここからさらに下の住所階層としては、地番や街区符号などが登場しますが、郵便番号データとしてはここまで理解していれば十分なので説明は省略します。

郵便番号データの住所構造

以上を踏まえた上で、あらためて郵便番号データの住所表記について見てみることにします。日本郵便様が提供している郵便番号データの説明を読むと、住所表記に関するカラムは以下の3つが存在します。

  • 都道府県名
  • 市区町村名
  • 町域名

一見シンプルなようですが、町域名以下の部分はかなり複雑です。

先程の実際の住所構造を参考に、郵便番号データの住所構造を描いてみたものが以下の図です。

都道府県と市区町村については、先述の通り、全国地方公共団体コードでも明確に定義されている表記のため、この部分については問題ありません。

京都の通り名

町域以下ですが、先述の住所構造と違う部分がいくつかあります。

日本の住所構造としては正規の構造としてあまり扱われない、京都の通り名が郵便番号データには記載されています。ただし、通り名を記載する場合は、同一行政区に同一町名が存在した場合などに限るため、京都市内の全ての郵便番号に通り名が記載されているわけではありません。なお、同一行政区同一町名は109組260町存在します(2021年5月31日現在)。

また、京都市の住所表記は通り名+町名が一般的ですが、さらに丁目を持つ地域もあります。以下はその一例です。

6028064: 京都府 京都市上京区 一町目(上長者町通堀川東入、東堀川通上長者町上る、東堀川通中立売通下る)
6028134: 京都府 京都市上京区 一町目(大宮通椹木町下る、大宮通丸太町上る、椹木町通大宮西入、丸太町通大宮東入)
6028103: 京都府 京都市上京区 一町目(松屋町通出水下る、松屋町通下立売上る)

地割

次に、地割(じわり)の存在です。地割は、岩手県に存在する特殊な地名単位です。住所構造上は丁目と同レベルで存在します。

0282402: 岩手県 宮古市 川井(第9地割~第11地割)
0285102: 岩手県 岩手郡葛巻町 葛巻(第40地割「57番地125、176を除く」~第45地割)
0295523: 岩手県 和賀郡西和賀町 越中畑64地割~越中畑66地割
0240341: 岩手県 和賀郡西和賀町 杉名畑44地割(湯田ダム管理事務所、後口山、当楽)

地割を含むレコードは50件あります。

特定の番地に割り当てられた郵便番号

ほとんどの郵便番号データには番地以下の情報は含まれていませんが、一部の町域では特定の番地のみを指定して郵便番号を割り振っているケースがあります。

9420083: 新潟県 上越市 大豆(1の2、3の2~6、4の2・4・6、11の1番地)
0482402: 北海道 余市郡仁木町 大江(1丁目、2丁目「651、662、668番地」以外、3丁目5、13-4、20、678、687番地)
0285233: 岩手県 二戸郡一戸町 中山(新田17-2、37番地、東火行1番地)
2892614: 千葉県 旭市 江ケ崎(12~22、127~140、1709、1723-3、1728-4番地)
8996602: 鹿児島県 霧島市 牧園町三体堂(1824-2、1824-9、1824-41、1835-81、1835-108、1835-109 、1835-228、1835-238、1835-253、2003-5、2003-9、2003-14、2003-17、2003-18、2057-8)

このようなレコードは約242件ほど存在します。 番地と書いているものもあれば、数字だけ並んでいるものもあり、正確にカウントすることは容易ではありません。上記の数字はあくまで目安です。

ビルに割り当てられた郵便番号

そして最後に、ビルの存在です。郵便番号データは、大きなオフィスビルなどに対しては階層ごとに個別の郵便番号を付与していることがあります。これは、申請式の個別事業所番号とは異なります。

9806190: 宮城県 仙台市青葉区 中央アエル(地階・階層不明)
9806101: 宮城県 仙台市青葉区 中央アエル(1階)
9806102: 宮城県 仙台市青葉区 中央アエル(2階)

郵便番号データに登録されているビルは84棟あります。

ビル郵便番号については、別の記事にて詳しく紹介していきます。

このように、郵便番号データに含まれる住所の構造を把握することで、ようやく郵便番号データの整形処理のための準備をすることができます。

PyData.Osaka に登壇します

2021/7/3(土) にオンライン開催される PyData.Osaka にて、@shiumachi が登壇いたします。上記のような話を紹介しますので、興味ある方はご参加ください。

www.meetup.com

ケンオールについて

「かゆいところにケンオール」

ケンオールは、郵便番号住所検索APIをはじめとした、システム開発を加速する高品質で安全なAPIサービスです。

サービスを試してみたい方はこちらから: kenall.jp

この記事はShodoで執筆されました

*1:「番地の謎」p.43、今尾恵介、光文社知恵の森文庫。ただし原著では「内務省訓令」と記述されている

*2:「明治22年新町村名の研究」井戸庄三、地理学評論、1976年

*3:市町村合併の状況総務省

ケンオール郵便番号逆引き検索機能のベータリリース

ケンオールに、住所から郵便番号を検索できる、郵便番号逆引き検索機能が追加されました。

(このデモはこちらでお試しいただけます。)

例えば、京都市上長者町通堀川東入一町目という住所を検索してみます。この住所クエリは、上京区という文字が抜けている、不完全な住所になっています。

http://api-beta.kenall.jp/v1/postalcode/?q=city:京都市+AND+kyoto_street:上長者町通堀川東入+AND+town:一町目

上記のような部分検索であっても正しい郵便番号を検索できます。

{
    ...
    "postal_code": "6028064",
    ...
    "prefecture": "京都府",
    "city": "京都市上京区",
    "town": "一町目",
    "koaza": "",
    "kyoto_street": "上長者町通堀川東入",
    ...
}

個別事業所番号にももちろん対応しています。

http://api-beta.kenall.jp/v1/postalcode/?q=corporation:国会図書館

検索すると、国立国会図書館国立国会図書館 関西館の2件の結果が表示されます。

[{
    ...
    "postal_code": "1008924",
    ...
    "prefecture": "東京都",
    "city": "千代田区",
    "town": "永田町",
    ...
    "corporation":{
        "name": "国立国会図書館",
        "name_kana": "コクリツコツカイトシヨカン",
        "block_lot": "1丁目10-1",
        "post_office": "銀座",
        ...
}},
{
    ...
    "postal_code": "6190287",
    ...
    "prefecture": "京都府",
    "city": "相楽郡精華町",
    "town": "精華台",
    ...
    "corporation":{
        "name": "国立国会図書館 関西館",
        "name_kana": "コクリツコツカイトシヨカン カンサイカン",
        "block_lot": "8丁目1-3",
        "post_office": "山城木津",
        ...
}}]

アーキテクチャ

ケンオールは、パースした郵便番号データをSQLiteに格納し、Dockerコンテナの起動時にSQLiteファイルをダウンロードしてからデプロイする形でサービスを提供しています。

郵便番号を元に住所を検索する場合、検索クエリ空間は約12万件のため、RDBMSで運用することに問題はありませんでした。 しかし、住所を元に郵便番号を検索する場合、検索クエリは自然言語となるため、郵便番号と1:1で対応しません。

そこで、今回逆引き検索機能を提供するにあたり、全文検索エンジンを新たに導入しました。

新たな郵便番号データが到着すると、ケンオールのシステムはデータをパースし、SQLiteファイルと全文検索エンジンのインデックスをそれぞれ作成します。 この新たなデータを元に、コンテナと検索エンジンがデプロイされます。

ユーザーは、API上はほとんど変わりませんが、検索するときに二種類のクエリを送信します。

  • 従来の郵便番号検索( /postalcode/<郵便番号> ): コンテナ配下のDBにSQL問い合わせを行います。
  • 新機能の郵便番号逆引き検索( /postalcode/?q=<検索クエリ>): 検索エンジンに問い合わせを行います。

図にすると以下のような流れです。

ロードマップ

全文検索エンジンを導入したことで、検索機能の拡張性を手に入れることができました。 リリース時までに予定しているのは、形態素解析を利用した、フリーテキストの住所クエリによる検索です。

例えば、以下のようなクエリが実行できるようになることを目指しています。(2021/05/25時点ではこの機能はリリースしていません)

http://api-beta.kenall.jp/v1/postalcode/?t=京都市上京区上長者町通堀川東入一町目

郵便番号逆引き検索機能について

郵便番号逆引き検索機能はパブリックベータです。

アカウントをお持ちの方は、どなたでも自由にご利用いただけます。

アカウントを持っていない方は、こちらから登録してください。

郵便番号逆引き検索機能のドキュメントはこちらです。

フィードバックはこちらからお願いします。

郵便番号逆引き検索機能は、今後リリース予定の上位プランの一部となる予定です。

この上位プランでは、郵便番号逆引き検索の他にも様々な便利なAPIを提供していく予定ですので、今後のアップデートを楽しみにしてください。

この記事はShodoで執筆されました

Nature株式会社様でケンオールが採用されました

Nature 株式会社様が、2021年3月に、Natureスマート電気住所登録ページの郵便番号住所検索としてケンオールを採用されました。 Natureスマート電気は、同社のスマートリモコンNature Remoとの連携など、スマートな電気の利用を提案する電力小売サービスです。

お客様の言葉: お客様への連絡用住所の登録ページにてケンオールを利用しています。利用しやすいライセンスであったこと、自分で郵便番号データをパースをする必要がないことが採用の決め手になりました。

ケンオールについて

「かゆいところにケンオール」

ケンオールは、郵便番号住所検索APIをはじめとした、システム開発を加速する高品質で安全なAPIサービスです。

サービスを試してみたい方はこちらから: kenall.jp

この記事はShodoで執筆されました

ケンオール通信第6号

ケンオール開発チームです。

今回は、郵便番号データの更新と、株式会社エス・エム・エス様の導入事例を紹介します。

前号はこちらです。

郵便番号データの更新

2021/04/30(金)に、日本郵政様の郵便番号データの更新に伴い、ケンオールのデータも更新しました。

事例紹介: エス・エム・エス

株式会社エス・エム・エス様が、2021年4月に管理栄養士・栄養士のコミュニティ エイチエ にケンオールを導入されました。 エイチエは先日サイトのリニューアルを実施しまして、リニューアルの舞台裏を技術ブログに掲載しています。 こちらも是非お読みください。

https://tech.bm-sms.co.jp/entry/2021/04/20/120000

お客様のコメント:

会員登録時の住所入力システムでケンオールを採用しています。高精度なために正確な住所を補完できてユーザーのストレスを減らせることと、法人運営による安心感があることが採用の決め手になりました。

ケンオールについて

「かゆいところにケンオール」

ケンオールは、郵便番号住所検索APIをはじめとした、システム開発を加速する高品質で安全なAPIサービスです。

サービスを試してみたい方はこちらから: kenall.jp

この記事はShodoで執筆されました

ケンオール通信第5号

ケンオール開発チームです。

今回は、トップページの刷新と、クラウド型業務・経営管理システム boardへの導入事例を紹介します。

前号はこちらです。

トップページ刷新

ケンオールのトップページが新しくなりました。

イラストレーターのshigureniさん描き下ろしの、サメの絵がチャームポイントです!

新しいページはこちらからご確認ください。

事例紹介:クラウド型業務・経営管理システム board

クラウド型業務・経営管理システムのboardに、ケンオールが導入されました。

請求書などの書類作成時における、顧客登録時の住所入力機能にケンオールを導入していただきました。 「常に最新のデータを使えるだけでなく、町名とビル名などの異なる要素が分離して提供されているので、住所入力の精度を向上させることができました」というコメントをいただいています。 boardのニュースでも、ケンオールの導入を紹介していただいていますので、是非そちらもお読みください。

ケンオールについて

ケンオールは、多くの開発者にとって悩みだった郵便番号住所検索機能をメンテナンス不要で簡単に使えるようにするためのAPIサービスです。

サービスを試してみたい方はこちらから: kenall.jp

この記事はShodoで執筆されました

ケンオール通信第4号

ケンオール開発チームです。

今回は、郵便番号データの更新、新機能の市区町村API、郵便番号10桁化対応、郵便番号データの複数レコード結合処理を紹介します。

前号はこちらです。

郵便番号データの更新

2021/03/31(水)に、日本郵政様の郵便番号データの更新に伴い、ケンオールのデータも更新しました。

新機能: 市区町村API

都道府県以下の市区町村を取得するAPIの提供を開始しました。

このAPIの利用には、総務省の提供する全国地方公共団体コードが必要になります。 全国地方公共団体コードは、都道府県コード2桁、市区町村コード3桁で構成されている、日本の地方公共団体に付与されたコードです。総務省の提供するデータでは、最後にチェックディジットが加わっているため、6桁のコードとなっています。 都道府県コードは、JIS X 0401で定義されている他、 国土交通省等の各種公的機関でもデータが公開されているため、すぐに取得可能です。

ケンオールのドキュメントでも、都道府県コードをJSON形式で公開しています。

以下のAPI例では、東京都(都道府県コード13)の市区町村の一覧を取得できます。

https://api.kenall.jp/v1/cities/13

このAPIリクエストからは、以下のようなレスポンスが返ってきます。

{
  "version": "2021-03-31",
  "data": [
    {
      "jisx0402": "13101",
      "prefecture_code": "13",
      "city_code": "101",
      "prefecture_kana": "トウキョウト",
      "city_kana": "チヨダク",
      "prefecture": "東京都",
      "city": "千代田区"
    },
    ...
}

市区町村APIは、こちらのデモページですぐに試すことができます。

詳細は、ドキュメントをご参照ください。

郵便番号データ処理の秘密(1)複数行のレコードの結合処理

日本郵便様が公開している郵便番号データを利用しやすい形にするためには、複雑な加工処理が必要になります。 今回は、そのうちの1つ、複数レコードの結合処理を紹介します。

郵便番号データの説明のページには、以下のように記載されています。

全角となっている町域名の文字数が38文字を超える場合、また、半角カタカナとなっている町域名のフリガナが76文字を越える場合には、複数レコードに分割しています。

郵便番号データを一般的なテーブル形式で扱うためには、まずこの複数レコードを結合する必要があります。

例として、郵便番号 9218046 (石川県金沢市大桑町、および三小牛町の一部)の町名部分を取り出してみましょう。この郵便番号は、以下の6行で構成されています。

大桑町(ア、イ、ヰ、ウ、上野、ヲ、オ乙、鐘搗山、上川原、上猫下、
ク、ケ、御所谷、小寺山、シ、下上野、下西欠、平、チ、ツ乙、ツ丙、テ、ト、
中上野、中尾山、中平、中ノ大平、西ノ山、猫シタイ、ノ、ハ、開、
法師山、坊山、マ、鱒川淵、ム、元末、元涌波庚、ヤ、リ、ル、レ乙、
レ甲、ロ乙、ロ甲、和)
三小牛町(ヘ)

このデータを結合するためには、レコードの前後を見て、同じ郵便番号のレコードであることを確認する必要があります。 しかし、それだけではうまく結合できません。 この郵便番号は、単に1つのレコードが複数レコードになっているだけでなく、2つのレコード(大桑町と三小牛町)に同じ郵便番号を付与しているという特徴があります。よって、そのまま全て結合してしまうと、2つの町が1つのレコードで表されてしまいます。

この問題に対する解決方法はいくつかありますが、ケンオールでは現在のところ以下の仮説を採用しています。

  • 全データを確認したところ、町域名が38文字を超える場合は、括弧が開いていて、括弧が閉じていないケースのみ
  • よって、括弧が閉じるまでのレコードを結合すれば、町名を正しく分割可能

この仮説は、括弧なしで38文字を超える町域名が生まれた場合は成り立ちません。その場合は別の方式を採用する必要があるでしょう。

ケンオールでこの郵便番号をどう処理したかを見たい場合は、こちらのデモ で郵便番号 9218046 を入力して試してみてください。

レコードの結合が完了したら、いよいよ本格的なデータ処理が始まります。 その話はまた別の機会に紹介します。

新機能?? 郵便番号10桁化対応

※4/2 0:15追記: 本機能は4/1のエイプリルフールにあたりご提示していたものであり、お客様の実運用を前提としてご提供していたものではありません。実サービスの提供に影響がないよう入念に注意を払って準備したものであり、実績値としても影響はございませんでしたが、不備があった場合には細かい点でも結構ですのでお問い合わせフォームよりお知らせください。謹んでご意見を賜ります。

日本の郵便番号は、郵便物数の増加に伴う業務量増加への対応として、1998年に5桁から7桁に拡張されました。しかし、インターネットの普及に伴い、郵便物の通数は2001年の262億通を境に減少に転じ、2017年には172億通と、大きく数を減らしています *1

しかし、郵便番号が用いられているのは郵便物だけではありません。宅配便の取扱個数は、同様にECの普及により取扱個数を大きく伸ばしており、1998年の18億万個から2019年には43億万個と、およそ2.3倍増加しています *2

こうした状況を背景に、郵便番号はサービス品質の向上を目的として、再び桁数を拡張することが予想されます。ケンオールは、独自の調査により、将来的に郵便番号は10桁になるとの情報を入手しました。

他のいかなる郵便番号検索サービスよりも先にお客様に価値をお届けしたいとの想いから、水面下で開発を続けてきましたが、新年度の始まる本日4月1日に郵便番号10桁化対応機能をリリースいたします。

なお、以前の7桁の郵便番号と10桁の郵便番号は互換性があり、7桁郵便番号の左を0で埋めて10桁にすることで10桁化することができます。 (例: 1000001→0001000001)

本サービスのエンドポイントは以下となります。

https://api.kenall.jp/v999/postalcode/10桁郵便番号

このAPIリクエストからは、以下のようなレスポンスが返ってきます。

{
  "version": "2021-03-31",
  "data": [
    {
      "jisx0402": "13102",
      "old_code": "1046001",
      "postal_code": "0001046001",
      "prefecture_kana": "トウキョウト",
      "city_kana": "チュウオウク",
      "town_kana": "ハルミオフィスタワーX",
      "town_kana_raw": "ハルミオフィスタワーX(1カイ)",
      "prefecture": "東京都",
      "city": "中央区",
      "town": "晴海",
      "koaza": "",
      "kyoto_street": "",
      "building": "オフィスタワーX",
      "floor": "1階",
      "town_partial": false,
      "town_addressed_koaza": false,
      "town_chome": false,
      "town_multi": false,
      "town_raw": "晴海オフィスタワーX(1階)",
      "corporation": null
    }
  ]
}

APIがみなさまの将来のシステム更改に備えるための礎石となることを願ってやみません。

※本機能は4/1バージョンのため、ドキュメントはご用意しておりません。また、突然存在を消すことがあります。

ケンオールについて

ケンオールは、多くの開発者にとって悩みだった郵便番号住所検索機能をメンテナンス不要で簡単に使えるようにするためのAPIサービスです。

以下のリンクからサービスを利用することができます。

kenall.jp

この記事はShodoで執筆されました

ケンオール通信第3号

ケンオール開発チームです。

今回は、ケンオールグッズの紹介と、Swiftクライアントの紹介、そしてケンオールが取り扱う「郵便番号」とは何か、を紹介します。

前号はこちらです。

ケンオールグッズ

すでにTwitterなどでご存じの方もいらっしゃるとは思いますが、ケンオールグッズが完成しました!以下のサイトで購入できます。

https://suzuri.jp/kenall

このグッズはケンオールファンの皆様のために作ったものなので、実費のみをいただいて提供しております。弊社の利益は一切発生しません。(将来的に変更する可能性はあります)

エコシステムツール紹介

今回は、 @woxtuさんが開発した、Swiftクライアントを紹介します。 https://github.com/woxtu/swift-kenall

インストール方法と使い方がREADMEに簡潔に書かれていて、簡単に使えるようになっています。公式ドキュメントへのリンクも貼っています。

郵便番号データの処理が難しい理由

郵便番号データは、気軽にダウンロードして利用できるオープンデータで、プログラミング学習の練習などにもよく使われます。しかし、業務で活用しようと思うと、かなり複雑なデータであることに気づきます。なぜ、これほどまでに処理が難しいデータになっているのでしょうか。郵便番号の正体から紐解いてみましょう。

日本郵便様のサイトには、郵便番号導入の目的を以下のように記載しています。

郵便番号の導入は郵便物処理の機械化の範囲を拡大し、人力に依存する割合の極めて高い郵便事業の効率化を推進することによって、将来にわたってなるべく安い料金で良質な郵便サービスを安定的に御利用いただくことを目的とします。

この記述から、郵便番号はあくまで郵便事業、つまり、物品の配達を目的として導入された仕組みであることがわかります。 これだけを読むと当たり前のように聞こえるかもしれませんが、このことは、「郵便番号は住所を正確に記述することを目的とした仕組みではない」ことを意味しています。

そして、郵便番号のルールのページを見ると、以下のように記載されています。

郵便番号は、町域(特別区又は市町村区域内の町又は字の区域をいいます。ただし、原則として、町の名称に「丁目」を使用している場合は、○丁目を除く部分が同一の区域とし、大字と小字に分かれている場合は、大字の区域とします。)および超高層ビルに設定します。

小字又は通称には原則として、郵便番号は設定しません。ただし、当該小字又は通称が実質的に大字又は公称町名として扱われ、郵便物への記載が多い等必要な場合は、郵便番号を設定することがあります。

この記述から、以下のことがわかります。

1つ目のポイントは、郵便番号は、区域ごとに割り当てられた番号であるということです。これは、特にジオコーディング(住所を緯度経度に変換する処理)に郵便番号を活用するときは注意する必要があります。目的に合ったジオコーディングを行うには、郵便番号が示すエリアのうち、どこを代表点として取るかを慎重に検討する必要があります。

2つ目のポイントは、郵便番号と区域の対応は、住所記述の郵便物への記載量などによって決定されるということです。先述の郵便番号の目的に記載の通り、郵便番号はあくまで郵便業務の効率化のために導入された仕組みです。

ケンオールのように、郵便番号データをシステムとして用いる場合、ユーザが期待するのは「郵便番号を入力したら正しい住所が記載されてほしい」というものですが、以上のことから、本来の郵便番号は「郵便物を効率的に送り届ける」ことを目的としているものである、ということが分かります。

郵便局様に電話して住所の確認を行う作業を始めた頃、以下のような問答をよくしてしまいました。

「○○ですが、これは正しい住所でしょうか?」 「この住所でも届きますよ」

これは、郵便局様からすれば正しい回答で、我々の方が質問の仕方を間違っていたことに後から気づきました。

郵便番号データは、処理が難しいオープンデータとして有名なものの一つですが、それにはきちんとした理由があるのです。

ケンオールについて

ケンオールは、多くの開発者にとって悩みだった郵便番号住所検索機能をメンテナンス不要で簡単に使えるようにするためのAPIサービスです。

以下のリンクからサービスを利用することができます。

kenall.jp

この記事はShodo (https://shodo.ink) で執筆されました。