Pythonの乱雑な地名を明確にする(できればローカルマシン上)


8

Flickrのプロフィールに由来する数百万の地名のリストがあります。ユーザーはこれらの地名をフリーテキストで提供したため、次のようになります。

Roma, Italy
Kennesaw, USA
Saginaw, MI
Rucker, Missouri, USA
Melbourne, Australia
Madrid, Spain
live in Sarnia / work in London, Canada
Valladolid, España
Italia
West Hollywood, United States

これらの地名を明確にしたいと思います。この解決策は簡単ではない場合があることは承知していますが、いくつかの場所については、いくつかの誤った曖昧性をなくし、「回答なし」で対応したいと考えています。場所名が複数の都市の名前に対応している場合は、対応する最大の都市にその場所を割り当てます。

YahooのプレイスファインダーAPIはこの問題の良い解決策ですが、私のリストを通過するには多くのAPI呼び出しを行う必要があるため、ローカルソリューション(つまり、リモートAPIに依存しないもの)が欲しいのですが。 。このようなことをするPythonライブラリ、または他のローカルソリューションを知っている人はいますか?

(私はまた、stackoverflowでこの質問をしました。)

回答:


8

Pythonライブラリgeodictを試すことができます。これには、ダウンロードしてデータベースにインポートできるデータセットがあります。リストチェックして、データでうまく機能するかどうかを確認できます。これは2つのステップで機能します。

  1. 名前の抽出
  2. リスト内の場所に名前を一致させる

詳細(およびコメント内の別のオンラインオプション)はこちら


2

私はあなたの最良の推測はファジーアルゴリズムを使用することだと思います。

場所の名前と行政単位のローカル辞書を取り、この単語に対して各単語と各コンマ区切りのテキストブロックを比較します。各試合にスコアを割り当てます。正規化された検索を使用して、スペルミスを説明し、「live」、「work」、「in」などの単語の「無視リスト」を作成することができます。管理ユニットのスコアを、この管理ユニット内にあるマッチ内のより小さなユニットまたは地名のスコアに追加します。

満足するまで、結果を使用してスコアリング関数を調整します。最高のスコアリングマッチを取る。

e.g.: Roma, Italy 
Roma matches 8 places (score according to size)
Roma matches 23 more places with normalization (lower score according to size)
Italy matches 4 places + 2 administrative units (COUNTRY, DISTRICT) (score acconding to size)
Italy matches 14 more places and units with normalization (lower score according to size)
One of the Romas lies in one of your units. -> combine scores

チューニングが良ければ、ほとんどのポイントをイタリアの首都に与えたことになります。


1

同じためにジオテキスト Pythonライブラリを使用できます。

pip install geotext

このライブラリをインストールするだけです。使い方は簡単です:

from geotext import GeoText
places = GeoText("London is a great city")
places.cities

結果は「ロンドン」になります

このライブラリでカバーされている都市のリストは広範囲ではありませんが、良いリストがあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.