spanish - wordnet python
Encontrar los nombres adecuados utilizando NLTK WordNet (2)
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 partes de habla de Stanford (código abierto también, mejor rendimiento).
¿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 de parte de discurso 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.