Encontrar nombres adecuados utilizando NLTK WordNet

¿Hay alguna forma de encontrar nombres propios usando NLTK WordNet? Es decir, ¿puedo etiquetar nombres posesivos usando nltk Wordnet?

No creo que necesites WordNet para encontrar nombres propios, sugiero que pos_tag etiquetador Part-Of-Speech pos_tag .

Para encontrar nombres adecuados, busque la etiqueta 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'] 

Es posible que no esté muy satisfecho, ya que Michael y Jackson se dividen en 2 tokens, entonces es posible que necesite algo más complejo, como el etiquetador de nombres de entidad.

Por derecho, como lo documenta el conjunto de penntreebank , para los nombres posesivos, simplemente puede buscar la etiqueta POS , http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html . Pero a menudo el etiquetador no etiqueta POS cuando es un NNP .

Para encontrar los Nombres Posesivos, busque str.endswith (“‘s”) o 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'"] 

Alternativamente, puedes usar ne_chunk pero no parece hacer mucho más a menos que estés preocupado sobre qué tipo de Nombre propio obtienes de la oración:

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

Usar ne_chunk es un poco detallado y no te da los posesivos.

Creo que lo que necesitas es un etiquetador , un etiquetador de parte de discurso. Esta herramienta asigna una etiqueta de parte del discurso (por ejemplo, nombre propio, pronombre posesivo, etc.) a cada palabra en una oración.

NLTK incluye algunos etiquetadores: http://nltk.org/book/ch05.html

También está el etiquetador de parte de habla de Stanford (código abierto también, mejor rendimiento).