web-dev-qa-db-fra.com

Recherche de noms appropriés à l'aide de NLTK WordNet

Existe-t-il un moyen de trouver des noms appropriés en utilisant NLTK WordNet? C'est-à-dire, puis-je marquer des noms possessifs en utilisant nltk Wordnet?

26
Backue

Je ne pense pas que vous ayez besoin de WordNet pour trouver les noms appropriés, je suggère d'utiliser le baliseur Part-Of-Speech pos_tag.

Pour trouver des noms propres, recherchez la balise 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']

Vous pouvez ne pas être très satisfait car Michael et Jackson est divisé en 2 jetons, alors vous pourriez avoir besoin de quelque chose de plus complexe, comme le tagueur d'entité de nom.

À droite, comme indiqué par le jeu de balises penntreebank, pour les noms possessifs, vous pouvez simplement rechercher la balise POS, http://www.mozart-oz.org/mogul /doc/lager/brill-tagger/penn.html . Mais souvent, le tagueur ne marque pas POS lorsqu'il s'agit d'un NNP.

Pour trouver des noms possessifs, recherchez str.endswith ("'s") ou 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'"]

Vous pouvez également utiliser NLTK ne_chunk mais il ne semble pas faire grand chose d'autre à moins que vous ne soyez préoccupé par le type de nom propre que vous obtenez de la phrase:

>>> 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']

En utilisant ne_chunk est un peu bavard et ne vous procure pas les possessifs.

48
alvas

Je pense que ce dont vous avez besoin est un tagueur , un tagueur de partie de discours. Cet outil attribue une balise de partie de discours (par exemple, nom propre, pronom possessif, etc.) à chaque mot d'une phrase.

[~ # ~] nltk [~ # ~] inclut quelques marqueurs: http://nltk.org/book/ch05.html

Il y a aussi le Stanford Part-Of-Speech Tagger (open source aussi, meilleures performances).

2
turdus-merula