nltk StanfordNERTagger: как получить правильные существительные без заглавных букв

Я пытаюсь использовать StanfordNERTagger и nltk для извлечения ключевых слов из фрагмента текста.

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

это дает мне

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

так ясно, такие вещи, какShort а такжеTerm были помечены какNNP, Данные, которые у меня есть, содержат много таких случаев, когданеNNP слова пишутся с большой буквы, Это может быть связано с опечатками или, возможно, они являются заголовками. Я не имею большого контроля над этим.

Как я могу разобрать или очистить данные, чтобы я мог обнаружить неNNP срок, даже если он может быть написан с большой буквы?Я не хочу такие термины, какShort а такжеTerm быть отнесенным к категорииNNP

Кроме того, не уверен, почемуJohn Donk был захвачен как личность, ноBrian Jones не было. Может ли это быть связано с другой заглавнойNNPв моих данных? Может ли это повлиять на то, какStanfordNERTagger ко всему остальному относится?

Обновление, одно из возможных решений

Вот что я планирую сделать

Взять каждое слово и преобразовать в нижний регистрПометить строчные словаЕсли тегNNP тогда мы знаем, что оригинальное слово также должно бытьNNPЕсли нет, то оригинальное слово было написано неправильно

Вот что я пытался сделать

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

но это дает мне ошибку

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

Я пробовал несколько подходов, но всегда появляется какая-то ошибка.Как я могу пометить одно слово?

Я не хочу конвертировать всю строку в нижний регистр, а затем тег. Если я это сделаю, тоStanfordPOSTagger возвращает пустую строку

Ответы на вопрос(2)

Ваш ответ на вопрос