Подтвердить что ты не робот

Поиск подходящих существительных с использованием NLTK WordNet

Есть ли способ найти правильные имена, используя NLTK WordNet? То есть, могу ли я пометить принадлежащие существительные с помощью nltk Wordnet?

4b9b3361

Ответ 1

Я не думаю, что вам нужна WordNet для поиска правильных существительных, я предлагаю использовать тегатор Part-Of-Speech 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']

Возможно, вы не очень довольны, так как Michael и Jackson разделены на 2 токена, тогда вам может понадобиться нечто более сложное, например 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 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 немного многословно и не дает вам владельцев.

Ответ 2

Я думаю, что вам нужен тег tagger, тег-метка части речи. Этот инструмент присваивает каждому слову в предложении тег части речи (например, собственное имя существительное, потенциальный местоимение и т.д.).

NLTK включает некоторые метки: http://nltk.org/book/ch05.html

Там также Стэнфордская часть речевого Tagger (с открытым исходным кодом тоже, более высокая производительность).