nltk StanfordNERTagger: Como obter nomes próprios sem letras maiúsculas
Estou tentando usar o StanfordNERTagger e o nltk para extrair palavras-chave de um pedaço 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
isso me dá
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')]
tão claramente, coisas comoShort
eTerm
foram marcados comoNNP
. Os dados que eu tenho contêm muitas instâncias em quenãoNNP
as palavras são maiúsculas. Isso pode ser devido a erros de digitação ou talvez sejam cabeçalhos. Eu não tenho muito controle sobre isso.
Como posso analisar ou limpar os dados para detectar um nãoNNP
prazo, embora possa ser capitalizado?Eu não quero termos comoShort
eTerm
para ser categorizado comoNNP
Além disso, não sei por queJohn Donk
foi capturado como pessoa, masBrian Jones
não foi. Poderia ser devido a outras não capitalizadasNNP
está nos meus dados? Isso poderia ter um efeito sobre como oStanfordNERTagger
trata todo o resto?
Atualização, uma solução possível
Aqui está o que eu pretendo fazer
Pegue cada palavra e converta para minúsculasMarque a palavra em minúsculaSe a tag forNNP
então sabemos que a palavra original também deve ser umaNNP
Caso contrário, a palavra original foi colocada em maiúsculaAqui está o que eu tentei fazer
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
mas isso me dá erro
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
Eu tentei várias abordagens, mas sempre aparece algum erro.Como posso marcar uma única palavra?
Eu não quero converter toda a seqüência de caracteres para minúsculas e depois Tag. Se eu fizer isso, oStanfordPOSTagger
retorna uma string vazia