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?
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.
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).