日本の住所の表記ゆれ vs 正規化を阻む住所
こんにちは!スマートキャンプ株式会社のcruiseです。この記事はスマートキャンプ株式会社のアドベントカレンダー 2025 の11日目です。
同一の住所か判定したい
みなさんご存知の通り、日本の住所はかなりの表記ゆれがあることで知られています。
例えば、弊社オフィスの住所はコーポレートサイトによると、次のように記載されています。
〒108-0014 東京都港区芝5-29-11 G-BASE田町 13階
しかし、以下の表記であっても、弊社オフィスを指す住所ですよね...?
- 東京都港区芝5-29-11 G-BASE田町13階
- 東京都港区芝5-29-11-13F
- 東京都港区芝5丁目29-11 G-BASE田町 13階
- 東京都港区芝5丁目29番11号 G-BASE田町 13階
- 東京都港区芝5の29の11 G-BASE田町 13階
これらに加え、半角数字、全角数字、漢数字、ハイフンの違いなどなど、言い出せば無数の表記ゆれが存在しそうです。
無数の表記ゆれを正規化し、一致判定ができるようにしました。
その過程で正規化処理を阻んだ日本各地の地名をご紹介しようと思います。
※筆者は特殊な訓練を受けており、正規表現で意図せずヒットする住所をすぐに思いつくことができます。
Let's正規化
方針として、以下のような表記を目指すこととしました。基本的に全てハイフンにします。
東京都港区芝5-29-11
STEP1: 基本の処理
まずは基本的なところから。
全角数字、全角アルファベットなどはすべて半角に変換しましょう。
同様に、半角カタカナは全角にしておきます。
address = address.tr('0-9', '0-9') # 全角数字を半角数字に変換
.tr('A-Za-z', 'A-Za-z') # 全角アルファベットを半角アルファベットに変換
.gsub(/([--ー―─−‐])/, '-') # ハイフン類を半角ハイフンに統一
ちなみにハイフンっぽい文字だけでこんなにありました。もちろん全て半角ハイフン (-)に変換します。
| 記号 | 名称(Unicode) | Unicode コードポイント | 主な用途 |
|---|---|---|---|
| - | HYPHEN-MINUS | U+002D | 半角のハイフン、マイナス記号(最も一般的) |
| - | FULLWIDTH HYPHEN-MINUS | U+FF0D | 全角のハイフン・マイナス |
| ー | KATAKANA-HIRAGANA PROLONGED SOUND MARK | U+30FC | 長音符(カタカナの音を伸ばす) |
| ― | HORIZONTAL BAR | U+2015 | 全角ダッシュ(文章の区切り、強調) |
| ─ | BOX DRAWINGS LIGHT HORIZONTAL | U+2500 | 罫線(単線) |
| − | MINUS SIGN | U+2212 | 数学的マイナス記号(正式な減算記号) |
| ‐ | HYPHEN | U+2010 | ハイフン(非区切り、特殊用途) |
STEP2: 漢数字の処理
漢数字は n丁目 の部分で使われていることが多いです。
漢数字 > 半角数字の変換処理は正規表現で置き換え、とはいかないので愚直にひとつずつ書きました。
def kanji_to_number(kanji)
case kanji
when '一' then 1
when '二' then 2
when '三' then 3
when '四' then 4
when '五' then 5
when '六' then 6
when '七' then 7
when '八' then 8
when '九' then 9
when '十' then 10
else kanji
end
end
STEP3: n丁目の処理
5丁目29-11 > 5-29-11 のように変換しましょう。
STEP4: n番n号の処理
以下のような表記をすべて半角ハイフンに変換します。
- 29番11号
- 29番地11号
- 29番の11
- 29番地の11
処理を阻んだ住所たち
それではお待ちかね、各地の住所を紹介していきましょう!!
Lv.1 〒106-0045 東京都港区麻布十番
n番n号 > n-n の処理にて、シンプルに 番 をマッチさせると 麻布十- になってしまいます。
対策
半角数字+番でマッチさせて置き換えましょう。
Lv.2 〒590-0985 大阪府堺市堺区戎島町3丁
n丁目n-n > n-n-n の変換でマッチしません。
堺市の旧市街にある住所で、意味はn丁目と同じなのですが、なぜか「目」を省略したものが正式名になっています。
対策
n丁目n-n > n-n-nとは別に、n丁n-n > n-n-nの処理を追加しましょう。
Lv.3 〒104-0032 東京都中央区八丁堀
STEP2で 漢数字 + 丁目 > 半角数字 + 丁目 の変換をしていますが、Lv.2の対応を加えるとあら不思議、中央区八丁堀 > 中央区8-堀となってしまいました。
対策
漢数字 + 丁目n > 半角数字 + 丁目nでマッチさせましょう。
Lv.4 〒060-0005 札幌市北区北6条西4丁目
北海道の各都市で見られる「条丁目制」による住所表記です。
「6条」の部分で漢数字と半角数字が見られますが、多くは半角数字で表記されてるように思います。(筆者の偏見です)
これも統一したいですが、次のLv.5に阻まれることになります。
Lv.5 〒604-8301 京都市中京区二条通堀川西入二条城町
「漢数字 + 条」が住所に含まれるパターンです。
大阪市西区九条 や 奈良市二条大路南、新潟県三条市など、各地に存在します。
対策
これらを漢数字で維持するため、Lv.4も合わせて漢数字で統一することにしました。
最後に
このような愚直なチューニングを続けた結果、住所の一致率は 10% -> 64% と大幅にヒットさせることができました。
なお、今回は検証の意味も含めて手作業で実装しましたが、突き詰めるとこれ1つでサービス化できるような内容です。
もっと正確な住所正規化が必要な方々は、素直にサービスを契約しましょう。
Discussion