2016-11-07 6 views
2

Мне нужно обучить Spacy NER, чтобы иметь возможность распознавать 2 новых класса для распознавания имен по имени, у всех есть файлы со списком элементов, которые должны быть в новых классах.Новый класс сущностей в Spacy

Например: Rolling Stones, Muse, Arctic Monkeys - художники Любая идея, как это можно сделать?

ответ

5

Это похоже на идеальный вариант использования для Matcher или PhraseMatcher (если вам интересно, производительность).

import spacy 

nlp = spacy.load('en') 

def merge_phrases(matcher, doc, i, matches): 
    ''' 
    Merge a phrase. We have to be careful here because we'll change the token indices. 
    To avoid problems, merge all the phrases once we're called on the last match. 
    ''' 
    if i != len(matches)-1: 
     return None 
    spans = [(ent_id, label, doc[start : end]) for ent_id, label, start, end in matches] 
    for ent_id, label, span in spans: 
     span.merge('NNP' if label else span.root.tag_, span.text, nlp.vocab.strings[label]) 


matcher = spacy.matcher.Matcher(nlp.vocab) 
matcher.add(entity_key='1', label='ARTIST', attrs={}, specs=[[{spacy.attrs.ORTH: 'Rolling'}, {spacy.attrs.ORTH: 'Stones'}]], on_match=merge_phrases) 
matcher.add(entity_key='2', label='ARTIST', attrs={}, specs=[[{spacy.attrs.ORTH: 'Muse'}]], on_match=merge_phrases) 
matcher.add(entity_key='3', label='ARTIST', attrs={}, specs=[[{spacy.attrs.ORTH: 'Arctic'}, {spacy.attrs.ORTH: 'Monkeys'}]], on_match=merge_phrases) 
doc = nlp(u'The Rolling Stones are an English rock band formed in London in 1962. The first settled line-up consisted of Brian Jones, Ian Stewart, Mick Jagger, Keith Richards, Bill Wyman and Charlie Watts') 
matcher(doc) 
for ent in doc.ents: 
    print(ent) 

Дополнительную информацию см. В документации. По моему опыту, с 400k объектами в Matcher потребуется почти секунда для соответствия каждому документу. PhraseMatcher намного быстрее, но немного сложнее использовать. Обратите внимание, что это «строгий» матчи, он не будет соответствовать никаким объектам, которые он не видел раньше.

+0

спасибо, я попробую, что –

+0

, но похоже, что мне нужно добавить все элементы моей новой сущности вручную? –

+0

Правильно, как я уже сказал. Если вы хотите совместить объекты, которые они не видели раньше, вам нужно сначала обучить его, что является более сложным и по-прежнему требует, чтобы у вас было много данных. –