【データベース】住所をユニーク情報として紐付けするのは難しすぎた話

ちょっとした病院検索サイトを開発していました。アグリゲーションサイトなので、いろんなサイトのデータをスクレイピングで取得します(著作権周りはクリアしている前提です)。問題はデータ同士の紐付け。というのも、病院名はユニーク情報ではありません。

例えば「佐藤病院」は全国に30件近く存在しており、単純に名前だけで紐付けしようとすると重複が発生します。そうなると、「病院名+ユニーク情報」を複合主キーにする必要があります。「郵便番号」「住所(緯度経度)」「電話番号」あたりでしょうか。

しかし、、、どれも一筋縄ではいかず、一ヶ月ぐらいスケジュールが遅れました。

タウンページは、あくまで電話帳

まず、病院情報のマスターデータを作成するにあたりiタウンページのデータを取得しようと思ったのですが、病院検索サイトとして使う場合だとゴミデータが多く諦めました。

タウンページは電話帳なので、「守衛室」や「緊急連絡先窓口」など、電話番号単位でデータが異なります。大きな病院などで電話番号が複数存在する場合、重複データを除去する作業がカオスです。代表番号を識別できないデータも多く、おすすめできません。

ということで、Yahoo!ヘルスケア あたりから病院情報を取得することになります。

Googleジオコーディング も Yahoo郵便番号検索API も万能ではない

ところで、Yahoo!ヘルスケアの病院情報には郵便番号が掲載されていません。掲載されている所から拾ってくる方法もありますが、世の中には住所から郵便番号や緯度経度に変換してくれる便利なAPIがありますね。まず試したのは Google Maps Geocoding API

これが結構雑な住所でも、かなりいい感じに整形してくれるので助かりました。しかし、これも万能ではありません。例えば京都の通り名や、大字などが含まれる住所なんかはエラーが出力されることも多いです。Yahooの郵便番号検索APIも同じような感じですね。

住所によってはなぜか英語で返却されたり、札幌市の住所でおなじみの「○条」が数値だったり漢字だったり統一されていないケースも多く、完璧な形にはなりませんでした。結局私は、「住所データ 分割 政令指定都市 市区郡」でお困りの方へ で作成した住所データをループしてLIKE検索し、漢字が違うなどで漏れた住所は手動で追加しました…。

郵便番号は複数の住所が存在している場合あり

ようやく全ての病院に郵便番号が付与されました。ただ、Yahoo!ヘルスケアの住所はミスや表記の例外が多かったので、郵便局のデータと統一させようと思いました。単純に郵便番号から住所を割り出せば良いかと思ったのですが、ここでも問題が…。

実は郵便番号は必ず1つの都道府県・町名に紐づいているわけではありません。複数の町名が紐付いてる郵便番号は現時点で3,500件近くあります。また、〒498-0000 を見てもらえれば分かりやすいですが、三重県と愛知県に同一の郵便番号が存在します。

つまり、郵便番号から正しい町名を割り出すことは完全はできず、もし郵便番号から住所が2件以上見つかった場合、手動でチェックする必要がありました…。

進捗があればちょこちょこ追記します。