プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

GoogleのGeocodingAPIで住所の正規化をする

こんにちは。
何の処理もされていない各々が入力した、揺らぎまくりの住所録データを使ったシステムを作ることになってどうしたもんか試していたところ
Google Maps PlatformのGeocoding APIを使えばいい感じにフォーマットしてくれたので、メモとして残しておきます。

今回の目的としては以下になります。 - 住所の単純な正規化(半角全角など) - 建物名以降は除外

Geocoding APIとは

住所→座標および座標→住所(逆Geocoding)の変換を行うAPIです。
使い方などの詳しいことは、以下の公式のドキュメントを読んでください。

developers.google.com

応答などのドキュメント

developers.google.com

実装(Python

シンプルにAPIを使う場合

import pandas as pd
# 住所録ファイル読み込み
df = pd.read_excel('./sample.xlsx')

import googlemaps

# GoogleMapsAPI用に取得したAPIキー
Key = "取得したAPIキー"

# GoogleMapsAPI用にAPIキーを返す
gmaps = googlemaps.Client(key=Key)

# 結果格納用
result = []

for i in range(len(df)):
    # 各行のデータを取得
    row = df.iloc[i]
    # ジオコーディング
    geocode_result = gmaps.geocode(row[0], language='ja')
    result.append(geocode_result)

返ってきた結果から、フォーマットされた住所を抽出する

formatResult = []

# 以下でフォーマットされた住所を抽出
for r in result:
    # 元データが不正だったのか、たまに空のケースあるので条件分岐
    if r != []:
        data = r[0]
        #"formatted_address"に入ってる。" "でsplitすると、[1]に丁目番地まで、[2]以降に建物名などが入ってくる
        formatResult.append(data["formatted_address"].split(" ")[1])
    else:
        formatResult.append(['None'])
# dfに変換
dfsavedata = pd.DataFrame(formatResult)
# xlsxファイルに保存
dfsavedata.to_excel('./output.xlsx')

以上で、ばらばらだった住所録のデータを丁目番地以降削除した状態でフォーマットできます。

問題

建物名が含まれた住所で、時々丁目番地も一緒に消された結果が返ってくることがあります。
前処理でどうにかなるのかもしれませんが、今回は面倒くさかったので生データをそのまま入れた結果です。
まぁ少数なので、その部分は手で直せばよいかなという感じです。