最終更新日:2023年6月12日

R&D部の榊です。 今回は、R&D部で開発したジオコーディングツール*1についての紹介記事となります。
*1 正確には既存ジオコーディングツールのPythonバインディング
皆様はジオコーディング(Geocoding)という技術をご存じでしょうか? ジオコーディングとは、 各種情報に対して、関連する地理座標(典型的には緯度・経度)を付加すること、およびこれに関する技術やソフトウェア*2 を意味します。 例えば、地図アプリで地名や住所を緯度経度に変換するのは、身近なジオコーディングの事例です。
*2 https://ja.wikipedia.org/wiki/ジオコーディング
ソーシャルメディアの投稿やユーザプロフィールに含まれる住所や地名・店舗名などを緯度経度に変換することができれば、それらの投稿を様々な地理情報サービスを紐付けることが可能となり、応用範囲が広がります。 例えば、店舗名を含むツイートに緯度経度情報を付与して大量に蓄積すれば、「現在地から1km以内にある、Twitter上で注目されている店舗を検索する」ということができるようになります。
このように、ソーシャルメディア解析の応用範囲を拡げる上で、ジオコーディングは重要な技術の一つとなります。 以下では、特に日本語テキスト(地名、住所)に対するジオコーダ(地名・住所→緯度経度変換)について述べます。
日本語テキストに対するジオコーディングのツールとして、代表的なものは下記があげられます。
- Web API:地図APIサービスを提供する代表的なプラットフォームでは、。ジオコーディング機能が提供されています。
- OSS:いくつかの非営利組織や学術機関、個人が独自開発したジオコーダをOSSとして配布しています。
- 地図・住所データ:公共機関や学術組織、個人が公開している地図・住所データを利用すれば、独自にジオコーディングツールを作ることも可能です。本記事では詳細は省きます。
*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部のアカデミックとの協力体制について
https://www.hottolink.co.jp/company/lab/