2015-08-05 2 views
8

Я использовал NLTK-х ne_chunk для извлечения именованных объектов из текста:NLTK Названное Распознавание объектов в список Python

my_sent = "WASHINGTON -- In the wake of a string of abuses by New York police officers in the 1990s, Loretta E. Lynch, the top federal prosecutor in Brooklyn, spoke forcefully about the pain of a broken trust that African-Americans felt and said the responsibility for repairing generations of miscommunication and mistrust fell to law enforcement." 


nltk.ne_chunk(my_sent, binary=True) 

Но я не могу понять, как сохранить эти объекты в список? Например. -

print Entity_list 
('WASHINGTON', 'New York', 'Loretta', 'Brooklyn', 'African') 

Спасибо.

+0

Что делает 'ne_chunk()' вернуть вместо этого? Что именно вы застряли? – lenz

+0

Возможный дубликат [Именованное распознавание сущностей с регулярным выражением: NLTK] (http://stackoverflow.com/questions/24398536/named-entity-recognition-with-regular-expression-nltk) – alvas

+0

Когда я запускаю свой код, я получаю IndexError – MERose

ответ

18

nltk.ne_chunk возвращает вложенную nltk.tree.Tree объект, так что вы должны пройти через Tree объект, чтобы добраться до НЭ.

Посмотрите на Named Entity Recognition with Regular Expression: NLTK

>>> from nltk import ne_chunk, pos_tag, word_tokenize 
>>> from nltk.tree import Tree 
>>> 
>>> def get_continuous_chunks(text): 
...  chunked = ne_chunk(pos_tag(word_tokenize(text))) 
...  prev = None 
...  continuous_chunk = [] 
...  current_chunk = [] 
...  for i in chunked: 
...    if type(i) == Tree: 
...      current_chunk.append(" ".join([token for token, pos in i.leaves()])) 
...    elif current_chunk: 
...      named_entity = " ".join(current_chunk) 
...      if named_entity not in continuous_chunk: 
...        continuous_chunk.append(named_entity) 
...        current_chunk = [] 
...    else: 
...      continue 
...  return continuous_chunk 
... 
>>> my_sent = "WASHINGTON -- In the wake of a string of abuses by New York police officers in the 1990s, Loretta E. Lynch, the top federal prosecutor in Brooklyn, spoke forcefully about the pain of a broken trust that African-Americans felt and said the responsibility for repairing generations of miscommunication and mistrust fell to law enforcement." 
>>> get_continuous_chunks(my_sent) 
['WASHINGTON', 'New York', 'Loretta E. Lynch', 'Brooklyn'] 
4

Как вы получаете tree в качестве возвращаемого значения, я думаю, вы хотите, чтобы выбрать те поддеревьев, которые помечены NE

Вот простой пример, чтобы собрать всех тех, кто в списке:

import nltk 

my_sent = "WASHINGTON -- In the wake of a string of abuses by New York police officers in the 1990s, Loretta E. Lynch, the top federal prosecutor in Brooklyn, spoke forcefully about the pain of a broken trust that African-Americans felt and said the responsibility for repairing generations of miscommunication and mistrust fell to law enforcement." 

parse_tree = nltk.ne_chunk(nltk.tag.pos_tag(my_sent.split()), binary=True) # POS tagging before chunking! 

named_entities = [] 

for t in parse_tree.subtrees(): 
    if t.label() == 'NE': 
     named_entities.append(t) 
     # named_entities.append(list(t)) # if you want to save a list of tagged words instead of a tree 

print named_entities 

Это дает:

[Tree('NE', [('WASHINGTON', 'NNP')]), Tree('NE', [('New', 'NNP'), ('York', 'NNP')])] 

или в виде списка списков:

[[('WASHINGTON', 'NNP')], [('New', 'NNP'), ('York', 'NNP')]] 

Также смотрите: How to navigate a nltk.tree.Tree?

2

Tree является список. Куски - это поддеревья, а не chunked слова - регулярные строки. Итак, давайте спустимся по списку, извлеките слова из каждого фрагмента и присоединитесь к ним.

>>> chunked = nltk.ne_chunk(my_sent) 
>>> 
>>> [ " ".join(w for w, t in elt) for elt in chunked if isinstance(elt, nltk.Tree) ] 
['WASHINGTON', 'New York', 'Loretta E. Lynch', 'Brooklyn'] 
2

Вы также можете извлечь label каждого имени Сущности в тексте с помощью этого кода:

import nltk 
for sent in nltk.sent_tokenize(sentence): 
    for chunk in nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sent))): 
     if hasattr(chunk, 'label'): 
     print(chunk.label(), ' '.join(c[0] for c in chunk)) 

Выход:

GPE WASHINGTON 
GPE New York 
PERSON Loretta E. Lynch 
GPE Brooklyn 

Вы можете увидеть Washington, New York и Brooklyn являются GPE означает геополитические субъекты

Loretta E. Lynch и является PERSON

0

использование tree2conlltags из nltk.chunk. Кроме того, ne_chunk требует пометки тегов, которые помещают токены (таким образом, требуется word_tokenize).

from nltk import word_tokenize, pos_tag, ne_chunk 
from nltk.chunk import tree2conlltags 

sentence = "Mark and John are working at Google." 
print(tree2conlltags(ne_chunk(pos_tag(word_tokenize(sentence)) 
"""[('Mark', 'NNP', 'B-PERSON'), 
    ('and', 'CC', 'O'), ('John', 'NNP', 'B-PERSON'), 
    ('are', 'VBP', 'O'), ('working', 'VBG', 'O'), 
    ('at', 'IN', 'O'), ('Google', 'NNP', 'B-ORGANIZATION'), 
    ('.', '.', 'O')] """ 

Это даст вам список кортежей: [(маркер, pos_tag, name_entity_tag)] Если этот список не совсем то, что вы хотите, это, конечно, проще разобрать список, который вы хотите из этого списка затем nltk tree.

Код и информация от this link; проверить это для получения дополнительной информации

Редактировать Добавлен выход строку документации

Смежные вопросы