Распознавание именованных сущностей для NLTK в Python.Идентификация NE - PullRequest
20 голосов
/ 19 апреля 2011

Мне нужно классифицировать слова по частям речи.Как глагол, существительное, наречие и т. Д. Я использовал

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. 

Результатом этого является дерево.Например,

>>> 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:\Python26\lib\site-packages\nltk\tree.py", line 139, in __getitem__
    return list.__getitem__(self, index)
IndexError: list index out of range

Iполучил вышеупомянутую ошибку.

То, что я хочу, чтобы получить вывод как 'NE', аналогичный предыдущему 'PRP', поэтому я не могу определить, какое слово является именованным объектом.Есть ли способ сделать это с NLTK в Python?Если это так, пожалуйста, отправьте команду.Или в библиотеке дерева есть функция для этого?Мне нужно значение узла 'NE'

Ответы [ 5 ]

14 голосов
/ 19 апреля 2011

Этот ответ может быть неосновным, и в этом случае я его удалю, так как у меня не установлен NLTK, чтобы попробовать его, но я думаю, что вы можете просто сделать:

   >>> sent3[2].node
   'NE'

sent3[2][0] возвращает первый дочерний элемент дерева, а не сам узел

Редактировать: Я попробовал это, когда вернулся домой, и это действительно работает.

4 голосов
/ 15 февраля 2013

Ниже мой код:

chunks = ne_chunk(postags, binary=True)
for c in chunks:
  if hasattr(c, 'node'):
    myNE.append(' '.join(i[0] for i in c.leaves()))
2 голосов
/ 28 августа 2017

Это будет работать

for sent in chunked_sentences:
  for chunk in sent:
    if hasattr(chunk, "label"):
        print(chunk.label())
1 голос
/ 11 апреля 2017

Теперь отправлено3 [2]. Узел устарел.

используйте send3 [2] .label () вместо

1 голос
/ 09 октября 2013

Я согласен с 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, и он работает нормально ..

...