3

これが私の問題です。さまざまな html ページをクロールしてテキスト データを保存するサンプル テキスト ファイルがあります。このテキストには、さまざまなイベントとその時間と場所に関する情報が含まれています。これらの場所の座標を取得したい。Pythonでそれを行う方法がわかりません。このサンプル テキストでは、名前付きエンティティを認識するために nltk を使用しています。コードは次のとおりです。

import nltk

with open('sample.txt', 'r') as f:
    sample = f.read()

sentences = nltk.sent_tokenize(sample)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
chunked_sentences = nltk.batch_ne_chunk(tagged_sentences, binary=True)

#print chunked_sentences
#print tokenized_sentences
#print tagged_sentences

def extract_entity_names(t):
    entity_names = []

    if hasattr(t, 'node') and t.node:
        if t.node == 'NE':
            entity_names.append(' '.join([child[0] for child in t]))
        else:
            for child in t:
                entity_names.extend(extract_entity_names(child))

    return entity_names

entity_names = []
for tree in chunked_sentences:
    # Print results per sentence
    # print extract_entity_names(tree)

    entity_names.extend(extract_entity_names(tree))

# Print all entity names
#print entity_names

# Print unique entity names
print set(entity_names)

サンプル ファイルは次のようなものです。

コベントガーデンのラ・ボエーム

日時: 2013 年 1 月 18 日 (さまざまな日付)、午後 7 時 30 分 場所: ロンドン、コベント ガーデン、プッチーニのラ ボエームのジョン コプリーによるロイヤル オペラの長年の人気作品が、今シーズン 2 回のうちの 1 回、クリスマス期間に適切に復活します。サー・マーク・エルダーがロドルフォ役のロランド・ビリャソンとミミ役のマイヤ・コヴァレフスカを指揮。ミミは詩人ロドルフォ (ドミトロ・ポポフが 1 月 5 日と 18 日にその役を歌う) と出会う寒いクリスマス・イブ、パリのカルチェラタンで。彼女のろうそくが消えた後、暗闇の中を手探りして、彼らは恋に落ちます. ロドルフォは、哲学者のコリーヌ (1 月 18 日のナウエル ディ ピエロ/キム ジフン)、音楽家のショナール (デヴィッド ビジック)、ムゼッタ (ステファニア ドヴァン) を愛する画家のマルチェロ (オーダン イヴェルセン) の 3 人の若者と暮らしています。

このテキストからロンドンのコベント ガーデンの座標を取得したいと思います。どうすればできますか?

4

3 に答える 3

6

2013 年 9 月以降、Google Maps API v2は動作しなくなりました。これは、API v3 で動作する素晴らしい @jimhark のコードの更新バージョンです (__main__一部を省略しました)。

import urllib
import simplejson

googleGeocodeUrl = 'http://maps.googleapis.com/maps/api/geocode/json?'

def get_coordinates(query, from_sensor=False):
    query = query.encode('utf-8')
    params = {
        'address': query,
        'sensor': "true" if from_sensor else "false"
    }
    url = googleGeocodeUrl + urllib.urlencode(params)
    json_response = urllib.urlopen(url)
    response = simplejson.loads(json_response.read())
    if response['results']:
        location = response['results'][0]['geometry']['location']
        latitude, longitude = location['lat'], location['lng']
        print query, latitude, longitude
    else:
        latitude, longitude = None, None
        print query, "<no results>"
    return latitude, longitude

パラメータの完全なリストと追加情報については、公式ドキュメントを参照してください。

于 2014-03-14T08:30:54.337 に答える
5

本当に 2 つの質問があります。

  1. 場所のテキスト (または潜在的な場所のテキスト) を抽出する方法。
  2. 位置テキストを使用してジオコーディング サービスを呼び出して位置 (緯度、経度) を取得する方法。

2 番目の質問についてはお手伝いできます。(ただし、最初の質問のヘルプについては、以下の編集を参照してください。)

古い Google Maps API (まだ機能しています) を使用すると、ジオコーディングを 1 行 (見苦しい 1 行) にすることができます。

def geocode(address):
    return tuple([float(s) for s in list(urllib.urlopen('http://maps.google.com/maps/geo?' + urllib.urlencode({'output': 'csv','q': address})))[0].split(',')[2:]])

Google Maps API ジオコーディングのドキュメントをご覧ください:

読み取り可能な 7 行のバージョンといくつかのラッパー コードを次に示します (コマンド ラインから呼び出す場合は、アドレスを引用符で囲むことを忘れないでください)。

import sys
import urllib

googleGeocodeUrl = 'http://maps.google.com/maps/geo?'

def geocode(address):
    parms = {
        'output': 'csv',
        'q': address}

    url = googleGeocodeUrl + urllib.urlencode(parms)
    resp = urllib.urlopen(url)
    resplist = list(resp)
    line = resplist[0]
    status, accuracy, latitude, longitude = line.split(',')
    return latitude, longitude

def main():
    if 1 < len(sys.argv):
        address = sys.argv[1]
    else:
        address = '1600 Amphitheatre Parkway, Mountain View, CA 94043, USA'

    coordinates = geocode(address)
    print coordinates

if __name__ ==  '__main__':
    main()

CSV 形式を解析するのは簡単ですが、XML 形式の方がエラー レポートが優れています。

編集 - 最初の質問のヘルプ

をのぞいてみましたnltk。些細なことではありませんが、Natural Language Toolkit のドキュメント、CH 7 - Extracting Information from Text、具体的には7.5 Named Entity Recognition. セクションの最後で、彼らは次のように指摘しています。

NLTK は、関数 nltk.ne_chunk() でアクセスして、名前付きエンティティを認識するようにトレーニング済みの分類器を提供します。パラメータ binary=True を設定すると、名前付きエンティティは単に NE としてタグ付けされます。それ以外の場合、分類子は PERSON、ORGANIZATION、GPE などのカテゴリ ラベルを追加します。

を指定Trueしていますが、おそらくカテゴリ ラベルが必要なので、次のようにします。

chunked_sentences = nltk.batch_ne_chunk(tagged_sentences)

これにより、有望と思われるカテゴリ ラベル (名前付きエンティティ タイプ) が提供されます。しかし、テキストと場所を含むいくつかの簡単なフレーズでこれを試してみると、さらに多くのルールが必要であることが明らかになりました。詳細については、ドキュメントを参照してください。

于 2013-01-29T11:37:24.660 に答える
1

実行する操作は、ジオコード操作と呼ばれます。もちろん、テキスト情報のブロック内で「位置」情報を自分で抽出する必要があります。

次のサービスを使用して実行できます。

ユースケースに応じて適用される可能性のあるライセンスを検討する必要があることに注意してください。

于 2013-01-29T11:08:27.973 に答える