ケンオール通信第9号:(その他)の処理

今回は、郵便番号データ内の(その他)を含むレコードの処理について紹介します。

データは、記載がない限り2021-05-31のデータを用いています。

ケンオールでどのようにパースされているかは、こちらのデモから試してみてください。

前回の記事はこちらです。

(その他)の処理

ケンオールでは、括弧書きで小字が含まれている郵便番号レコードについて、原則として小字なしのレコードを出力しています。 例えば、1030028 は、郵便番号データには以下のように記載されています。

1030028: 東京都 中央区 八重洲(1丁目)

これは、ケンオールでは以下のように2つのレコードとして出力されます。

1030028: 東京都 中央区 八重洲
1030028: 東京都 中央区 八重洲 1丁目

ケンオールでは、郵便番号データのパースを可能な限り高精度に行っていますが、複雑な番地情報など、解析が困難な割にあまり活用頻度が高くない情報は削除しています。そのため、検索時に意図しない小字・丁目が表示されてしまう可能性があります。そのような場合に小字を含まないレコードを出力できる(フォールバックできる)ように、小字を含まないレコードも出力するようにしています。

しかし、以下のように郵便番号レコード自体に(その他)というレコードが含まれている場合、フォールバック先を間違えないように、小字なしのレコードは出力しないようにする必要があります。

1690052: 東京都 新宿区 戸山(3丁目18・21番)
1620052: 東京都 新宿区 戸山(その他)

(その他)を含むレコードは564件あります。 (その他)を複数含む町は存在しません。

(その他)を含む町のうち、(その他)以外のレコードを含む町は545件あります。これらについては、先述の方針通り、小字なしのレコードを出力しないようにします。 しかし、(その他)しか含まない町が19件存在します。これらの町については、小字なしのレコードを出力する必要があります。

よって、以下の方針でパースをしていくことになります。

  • 括弧つきの町域が存在する場合(レコード1)、まず括弧なしの部分を仮の町名して取りだす
  • レコード1より後に連続するレコードのうち、町名が同じもので括弧つきのものを検索。後に存在するレコードがない場合はそのレコードしか存在しないため処理を行わない→最終的に小字なしのフォールバックレコードを出力する
  • その中に(その他)があった場合、その同一町域においては小字なしのフォールバックレコードを出力しない

パース後の住所は以下のようになります。

1690052: 東京都 新宿区 戸山 3丁目
1620052: 東京都 新宿区 戸山

ケンオールについて

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

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

kenall.jp

Shodoで執筆されました

ケンオール通信第8号: ビル名の処理

今回は、郵便番号データ内のビル名の処理について紹介します。 データは、記載がない限り2021-05-31のデータを用いています。 ケンオールでどのように郵便番号を処理しているかは、こちらのデモから確認してみてください。

前回はこちらです。

PyData Osaka Meetupの発表スライドと動画はこちらです。

ビル郵便番号

郵便番号データの大半は、ある郵便区画に対して番号を割り当てたレコードとなっていますが、実は一部の高層ビルには階層ごとに郵便番号が割り振られています。 ここでは、このような郵便番号をビル郵便番号と呼びます。

1066101: 東京都港区六本木六本木ヒルズ森タワー(1階)

なお、このビル郵便番号は、個別事業所番号とは別のものであることに注意してください。

このようなビルは、郵便番号データ内には84棟存在し、このようなビルが存在する町域は34地域存在します。 上記の住所のうち、ビル名に相当する部分はどこからどこまでになるでしょうか?

正解は、六本木ヒルズ森タワーです。 最初の六本木は町名となります。六本木ヒルズ森タワーの住所は東京都港区六本木6-10-1です。

町名とビル名を分割する

このように、ビル郵便番号の町域は、町名 + ビル名 + 階層という構造を取っているため、構造化されたデータに変換するにはこの文字列をパースして分割しなければいけません。 しかし、この文字列だけでは、先程の例のように、町名とビル名を分割することはできません。どちらかの名称を外部から与える必要があります。

このデータを遡っていくと、以下のようなレコードを発見できます。

1060032: 東京都 港区 六本木(次のビルを除く)

この郵便番号は、東京都港区六本木に属する住所のうち、これより下のビル郵便番号に記載されているもの以外の全ての住所に対して用いる郵便番号です。 この郵便番号レコードを使えば、町名六本木を取得することができます。

ただし、以下の2地域は例外的に、(次のビルを除く)が存在しません。

東京都 港区 海岸
愛知県 名古屋市中村区 名駅

この地域に関しては明示的に町名を付与する必要があります。(パターン1)

次に、ビル郵便番号の文字列パターンを見てみます。

1066190: 東京都 港区 六本木 六本木ヒルズ森タワー(地階・階層不明)
1066101: 東京都 港区 六本木 六本木ヒルズ森タワー(1階)

ビル郵便番号の町域は、以下の2パターンになっています。(パターン2)

  • XX(地階・階層不明)
  • XX(N階)
    • N: 全角数字で表されている階数

よって、ビル郵便番号の存在する地域及びビル郵便番号のパースは、以下の方針で実施することができます。

  • パターン2に該当する町域を持っていたらビル郵便番号であると判断できる (レコード1)
  • レコード1がパターン1にマッチする地域に属していた場合は、それに対応する町名を取得する
  • レコード1から遡って、最も近い(次のビルを除く)と記載されているレコードを発見する。(レコード2)
  • レコード2の町域から(次のビルを除く)を取り除いて町名を取得する
  • 取得した町名を使って、レコード1の町域を町名とビル名、階層に分割する

階層と郵便番号

先程登場した階層情報ですが、実は文字列をパースしなくても情報を取得することができます。 郵便番号の下2桁は以下のルールによって付与されています。

もう一度、先程の例を見てみましょう。このルールに基づいて郵便番号と階層情報が対応していることが分かります。

1066190: 東京都 港区 六本木 六本木ヒルズ森タワー(地階・階層不明)
1066101: 東京都 港区 六本木 六本木ヒルズ森タワー(1階)

現在、日本一階数の多いオフィスビル横浜ランドマークタワー(高さ日本一はあべのハルカス)で、地上70階まで存在します。もちろん、郵便番号データにも記載されています。

2208170: 神奈川県 横浜市西区 みなとみらい ランドマークタワー(70階)

しかし、世界では90階を超えるビルはいくつも存在します。 日本で90階を超えるオフィスビルが誕生したとき、郵便番号は一体どのように割り振られるのか、楽しみですね。

ケンオールについて

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

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

kenall.jp

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

PyData Osaka Meetupでケンオールについての講演を行いました

2021年7月3日、PyData Osaka Meetupにてケンオールについての講演を行いました。

この講演では、以下のような内容について発表しました。

  • 住所と郵便番号
  • 郵便番号データの複雑さ
  • ケンオールの紹介と、技術アーキテクチャ概要

スライドはこちらです。 docs.google.com

発表の動画はこちらです。 www.youtube.com

ケンオールについて

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

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

kenall.jp

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

ケンオール通信第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で執筆されました