• TOP
  • ブログ
  • R&Dが開発したPython用ジオコーディングツールを紹介

ホットリンク 公式ブログ

データから見えてくる注目のトピックスをとりあげます。

テック

R&Dが開発したPython用ジオコーディングツールを紹介

R&D部の榊です。 今回は、R&D部で開発したジオコーディングツール*1についての紹介記事となります。

*1 正確には既存ジオコーディングツールのPythonバインディング

皆様はジオコーディング(Geocoding)という技術をご存じでしょうか? ジオコーディングとは、 各種情報に対して、関連する地理座標(典型的には緯度・経度)を付加すること、およびこれに関する技術やソフトウェア*2 を意味します。 例えば、地図アプリで地名や住所を緯度経度に変換するのは、身近なジオコーディングの事例です。

*2 https://ja.wikipedia.org/wiki/ジオコーディング

ソーシャルメディアの投稿やユーザプロフィールに含まれる住所や地名・店舗名などを緯度経度に変換することができれば、それらの投稿を様々な地理情報サービスを紐付けることが可能となり、応用範囲が広がります。 例えば、店舗名を含むツイートに緯度経度情報を付与して大量に蓄積すれば、「現在地から1km以内にある、Twitter上で注目されている店舗を検索する」ということができるようになります。

このように、ソーシャルメディア解析の応用範囲を拡げる上で、ジオコーディングは重要な技術の一つとなります。 以下では、特に日本語テキスト(地名、住所)に対するジオコーダ(地名・住所→緯度経度変換)について述べます。

日本語テキストに対するジオコーディングのツールとして、代表的なものは下記があげられます。

  • Web API:地図APIサービスを提供する代表的なプラットフォームでは、。ジオコーディング機能が提供されています。
  • OSS:いくつかの非営利組織や学術機関、個人が独自開発したジオコーダをOSSとして配布しています。
    • ジオコーダDAMS
      • DAMS(Distributed Address Matching System)は、東京大学空間情報科学研究センターにより開発された、住所文字列を経緯度に変換する「ジオコーディング」機能を提供するソフトウェア。GeoNLPプロジェクトでも利用されている。
    • OpenStreetMAP*4
      • OSMはWebAPIも提供していますが、ローカルサーバに独自のOSM環境を構築することもできます。
    • DMGeoCoder
      • PHP製の日本国内用ジオコーダ。
  • 地図・住所データ:公共機関や学術組織、個人が公開している地図・住所データを利用すれば、独自にジオコーディングツールを作ることも可能です。本記事では詳細は省きます。

*3 GeoNLPは、地名情報処理に必要なデータ、ソフトウェア、サービスをオープンに構築するプロジェクト

*4 OpenStreetMapは、道路地図などの地理情報データを誰でも利用できるよう、フリーの地理情報データを作成することを目的としたプロジェクト

Web API形式で提供されているジオコーダは登録をすればすぐに使えるため、ジオコーダを試したり、少量(数百件程度)のデータを処理するには適しています。しかし、大量のデータを処理する場合にはコスト・速度が実用に耐え得るかを考慮する必要があります。

一方、OSS形式で提供されているジオコーダは、自身で環境をセットアップする必要があるので、気軽に試すのは難しい人も多いかと思います。しかし、自身のサーバで動作させることができるため、大量のデータを処理する場合にはコスト・速度の観点を考慮する必要性は低くなります。

ソーシャルメディアデータのように数百万〜数千万の情報を処理する上では、コスト・速度の観点から、OSS形式で提供されているジオコーダを使うことが望ましいです。 そのため、弊社では上述のDAMSを利用しています。

しかし、上記のDAMSはC++実装されているため、スクリプト言語から利用するためには、 各言語向けのバインディングが必要となります。 DAMSのページでは、PHP向けのバインディングは提供されていますが、それ以外のバインディングは提供されていません。

そこで、今回、弊社ではDAMSのPython向けバインディングpydamsを開発しましたので、それを下記の通りgithubで公開します。

pydams

概要

  • ジオコーダDAMS(Distributed Address Matching System)のPython向けバインディングです
  • 日本国内の住所文字列をジオコーディングすることができます
    • 正規化:都道府県、市区町村、…に分割した上で、代表表記に変換
    • 変換:住所を経緯度に変換
  • DAMSは、東京大学空間情報科学研究センターが提供する「CSVアドレスマッチングサービス」および「シンプルジオコーディング実験」にて開発されたソフトウェアです。高速・高精度なジオコーディングを実現します。

動作環境

  • Python 2.7.x/3.6.x での動作を確認済みです
  • 2.7.xの文字型はstr型ではなくunicode型を採用しています

インストール

  • まず、DAMSのインストールを行ってください
    • 本家からdams-*.tgzをダウンロードし、展開する
    • インストールの手順は,DAMSに同梱のREADMEを参照してください
    • 本packageでは、共有ライブラリ(dams.so) のみを使用します
    • ヘッダファイルおよび、DAMSに同梱のサンプルプログラムは使用しません
  • 次に、本packageのインストールを行ってください。手順は以下の通りです
git clone https://github.com/hottolink/pydams.git
cd pydams
# ビルド,テスト,インストールを実行
make all

使用方法

  • importしたジオコーダを初期化した上で,geocode() または 
  • geocode_simplify() に住所文字列を渡してください
    • geocode():住所階層(都道府県,市区町村,…)ごとに分割された住所構造を返却
    • geocode_simplify():全階層を連結した住所構造を返却
from pydams import DAMS
from pydams.helpers import pretty_print
DAMS.init_dams()
address = u"千代田区"
# geocode() method
geocoded = DAMS.geocode(address)
pretty_print(geocoded)
# geocode_simplify() method
geocoded = DAMS.geocode_simplify(address)
pretty_print(geocoded)
  • レスポンスは以下のようになります
# geocode() method
score: 3
candidates: 1
	candidate: 0, address level: 3
		address:東京都, lat:35.6894989014, long:139.691635132
		address:千代田区, lat:35.6939315796, long:139.753540039
# geocode_simplify() method
score: 3
candidates: 1
	candidate: 0, address level: 3
		address:東京都千代田区, lat:35.6939315796, long:139.753540039
  • 住所構造はdictionary形式になっています。dictionaryの内容は以下の通りです
score: ジオコーディングがどの程度成功したかを表すスコア.1~5の値
tail: クエリ文字列を先頭から住所として解析した結果、残った部分文字列
candidates: ジオコーディングにより得られた住所候補.複数の候補が存在する場合は2件以上を返す
candidates[i]: 住所要素リスト.都道府県->市区町村->...->街区 の順に格納
candidates[i][j]: 住所要素を表すdictionary
    name: 住所要素の名称.例:東京都
    level: 住所レベル.1~7の値.例:1
    x: 経度
    y: 緯度
# 住所要素の詳しい説明は,DAMSの公式ドキュメントを参照ください
http://newspat.csis.u-tokyo.ac.jp/geocode/modules/dams/index.php?content_id=4
  • pydams.helpers には補助関数が定義されています。docstringを確認の上、適宜ご利用ください

ライセンス

  • 本packageは Apache License Version 2.0 に準拠します
  • 本packageを使用する場合は、DAMSのライセンスに従う必要があります。別途ご確認ください

おわりに

当社R&D部では、自社のための研究開発を行うだけではなく、学術イベントのスポンサー・大学との共同研究の遂行・研究成果の対外発表/論文誌への投稿など、学術コミュニティへの貢献を積極的に行っています。

当社R&D部のアカデミックとの協力体制について

http://www.hottolink.co.jp/company/lab/