web-dev-qa-db-ja.com

NLTK WordNetを使用して適切な名詞を見つける

NLTK WordNetを使用して適切な名詞を見つける方法はありますか?つまり、nltk Wordnetを使用して所有名詞にタグ付けできますか?

26
Backue

適切な名詞を見つけるためにWordNetが必要だとは思わない。品詞タガーpos_tagを使用することをお勧めする。

固有名詞を見つけるには、NNPタグを探します:

from nltk.tag import pos_tag

sentence = "Michael Jackson likes to eat at McDonalds"
tagged_sent = pos_tag(sentence.split())
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('likes', 'VBZ'), ('to', 'TO'), ('eat', 'VB'), ('at', 'IN'), ('McDonalds', 'NNP')]

propernouns = [Word for Word,pos in tagged_sent if pos == 'NNP']
# ['Michael','Jackson', 'McDonalds']

MichaelJacksonが2つのトークンに分割されているため、あまり満足できない場合があります。その場合、Name Entity taggerなどのより複雑なものが必要になる場合があります。

右、penntreebankタグセットで文書化されているように、所有名詞については、単にPOSタグ、 http://www.mozart-oz.org/mogulを探すことができます。 /doc/lager/brill-tagger/penn.html 。ただし、タグ付けプログラムは、POSの場合にNNPをタグ付けしないことがよくあります。

所有名詞を見つけるには、str.endswith( "'s")またはstr.endswith( "s'"):を探します。

from nltk.tag import pos_tag

sentence = "Michael Jackson took Daniel Jackson's hamburger and Agnes' fries"
tagged_sent = pos_tag(sentence.split())
# [('Michael', 'NNP'), ('Jackson', 'NNP'), ('took', 'VBD'), ('Daniel', 'NNP'), ("Jackson's", 'NNP'), ('hamburger', 'NN'), ('and', 'CC'), ("Agnes'", 'NNP'), ('fries', 'NNS')]

possessives = [Word for Word in sentence if Word.endswith("'s") or Word.endswith("s'")]
# ["Jackson's", "Agnes'"]

別の方法として、NLTK ne_chunkを使用することもできますが、文からどのような固有名詞が得られるかを心配しない限り、他のことはほとんど行われないようです。

>>> from nltk.tree import Tree; from nltk.chunk import ne_chunk
>>> [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]
[Tree('PERSON', [('Michael', 'NNP')]), Tree('PERSON', [('Jackson', 'NNP')]), Tree('PERSON', [('Daniel', 'NNP')])]
>>> [i[0] for i in list(chain(*[chunk.leaves() for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]))]
['Michael', 'Jackson', 'Daniel']

ne_chunkの使用は少し冗長であり、所有格を取得しません。

48
alvas

必要なのは、品詞タガーであるtaggerです。このツールは、品詞タグ(固有名詞、所有代名詞など)を文の各単語に割り当てます。

[〜#〜] nltk [〜#〜]にはいくつかのタガーが含まれます: http://nltk.org/book/ch05.html

Stanford Part-Of-Speech Tagger (オープンソースも、パフォーマンスが向上)もあります。

2
turdus-merula