nltk StanfordNERTagger: Cómo obtener nombres propios sin mayúsculas
Estoy tratando de usar StanfordNERTagger y nltk para extraer palabras clave de un fragmento de texto.
docText="John Donk works for POI. Brian Jones wants to meet with Xyz Corp. for measuring POI's Short Term performance Metrics."
words = re.split("\W+",docText)
stops = set(stopwords.words("english"))
#remove stop words from the list
words = [w for w in words if w not in stops and len(w) > 2]
str = " ".join(words)
print str
stn = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
stp = StanfordPOSTagger('english-bidirectional-distsim.tagger')
stanfordPosTagList=[word for word,pos in stp.tag(str.split()) if pos == 'NNP']
print "Stanford POS Tagged"
print stanfordPosTagList
tagged = stn.tag(stanfordPosTagList)
print tagged
esto me da
John Donk works POI Brian Jones wants meet Xyz Corp measuring POI Short Term performance Metrics
Stanford POS Tagged
[u'John', u'Donk', u'POI', u'Brian', u'Jones', u'Xyz', u'Corp', u'POI', u'Short', u'Term']
[(u'John', u'PERSON'), (u'Donk', u'PERSON'), (u'POI', u'ORGANIZATION'), (u'Brian', u'ORGANIZATION'), (u'Jones', u'ORGANIZATION'), (u'Xyz', u'ORGANIZATION'), (u'Corp', u'ORGANIZATION'), (u'POI', u'O'), (u'Short', u'O'), (u'Term', u'O')]
tan claramente, cosas comoShort
yTerm
fueron etiquetados comoNNP
. Los datos que tengo contienen muchos de esos casos dondenoNNP
las palabras están en mayúscula. Esto podría deberse a errores tipográficos o tal vez son encabezados. No tengo mucho control sobre eso.
¿Cómo puedo analizar o limpiar los datos para poder detectar un noNNP
plazo a pesar de que puede ser capitalizado?No quiero términos comoShort
yTerm
para ser categorizado comoNNP
Además, no estoy seguro de por quéJohn Donk
fue capturado como persona peroBrian Jones
no estaba. ¿Podría ser debido a la otra no capitalizadaNNP
s en mis datos? ¿Podría eso tener un efecto sobre cómoStanfordNERTagger
trata todo lo demás?
Actualización, una posible solución
Esto es lo que planeo hacer
Toma cada palabra y conviértela a minúsculasEtiquetar la palabra en minúsculaSi la etiqueta esNNP
entonces sabemos que la palabra original también debe ser unNNP
Si no, entonces la palabra original estaba en mayúsculaEsto es lo que intenté hacer.
str = " ".join(words)
print str
stp = StanfordPOSTagger('english-bidirectional-distsim.tagger')
for word in str.split():
wl = word.lower()
print wl
w,pos = stp.tag(wl)
print pos
if pos=="NNP":
print "Got NNP"
print w
pero esto me da error
John Donk works POI Jones wants meet Xyz Corp measuring POI short term performance metrics
john
Traceback (most recent call last):
File "X:\crp.py", line 37, in <module>
w,pos = stp.tag(wl)
ValueError: too many values to unpack
He intentado múltiples enfoques, pero siempre aparece algún error.¿Cómo puedo etiquetar una sola palabra?
No quiero convertir toda la cadena a minúsculas y luego a Etiqueta. Si hago eso, elStanfordPOSTagger
devuelve una cadena vacía