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
возвращает пустую строку