Распознавание именованных сущностей для NLTK в Python. Выявление нэ
мне нужно классифицировать слова по их частям речи. Как глагол, существительное, наречие и т. д.. Я использовал
nltk.word_tokenize() #to identify word in a sentence
nltk.pos_tag() #to identify the parts of speech
nltk.ne_chunk() #to identify Named entities.
выход из этого-дерево. Например!--5-->
>>> sentence = "I am Jhon from America"
>>> sent1 = nltk.word_tokenize(sentence )
>>> sent2 = nltk.pos_tag(sent1)
>>> sent3 = nltk.ne_chunk(sent2, binary=True)
>>> sent3
Tree('S', [('I', 'PRP'), ('am', 'VBP'), Tree('NE', [('Jhon', 'NNP')]), ('from', 'IN'), Tree('NE', [('America', 'NNP')])])
при доступе к элементу в этом дереве я сделал это следующим образом:
>>> sent3[0]
('I', 'PRP')
>>> sent3[0][0]
'I'
>>> sent3[0][1]
'PRP'
но при доступе к именованному объекту:
>>> sent3[2]
Tree('NE', [('Jhon', 'NNP')])
>>> sent3[2][0]
('Jhon', 'NNP')
>>> sent3[2][1]
Traceback (most recent call last):
File "<pyshell#121>", line 1, in <module>
sent3[2][1]
File "C:Python26libsite-packagesnltktree.py", line 139, in __getitem__
return list.__getitem__(self, index)
IndexError: list index out of range
Я получил вышеуказанную ошибку.
то, что я хочу, это получить вывод как "NE", похожий на предыдущий "PRP", поэтому я не могу определить, какое слово является именованной сущностью. Есть ли способ сделать это с NLTK в python?? Если да, пожалуйста, отправьте команду. Или есть функция в библиотеке дерева, чтобы сделать это? Мне нужно значение узла 'NE'
5 ответов
этот ответ может быть вне базы, и в этом случае я удалю его, так как у меня нет nltk, чтобы попробовать его, но я думаю, что вы можете просто сделать:
>>> sent3[2].node
'NE'
sent3[2][0]
возвращает первый дочерний элемент дерева, а не сам узел
Edit: я попробовал это, когда вернулся домой, и это действительно работает.
Ниже приведен мой код:
chunks = ne_chunk(postags, binary=True)
for c in chunks:
if hasattr(c, 'node'):
myNE.append(' '.join(i[0] for i in c.leaves()))
Это будет работать
for sent in chunked_sentences:
for chunk in sent:
if hasattr(chunk, "label"):
print(chunk.label())
Я согласен с bdk
sent3[2].node
O / P - 'NE'
Я думаю, что в nltk нет функции для этого.Выше решение будет работать, но для справки вы можете проверить здесь
для проблемы цикла вы можете сделать : -
for i in range(len(sent3)):
if "NE" in str(sent3[i]):
print sent3[i].node
Я выполнил это в nltk, и он отлично работает..