2016-11-07 5 views
2

네임 엔티티 인식을위한 2 개의 새로운 클래스를 인식 할 수 있도록 Spacy NER를 교육해야합니다. 새 클래스에 있어야하는 항목 목록이있는 파일 만 있습니다.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) 

자세한 내용은 설명서를 참조하십시오. 필자의 경험에 따르면, Matcher의 400k 엔티티를 사용하면 각 문서와 일치시키는 데 거의 1 초가 걸릴 것입니다. PhraseMatcher는 훨씬 빠르지 만 사용하기가 약간 까다 롭습니다. 이것은 "엄격한"매처이며 이전에는 보지 못했던 엔티티와 일치하지 않습니다.

+0

고마워, 내가 그걸 시도 할게 –

+0

하지만 수동으로 내 새 엔티티의 모든 요소를 ​​추가해야 할 것 같아? –

+0

내가 말했듯이. 이전에 보지 못했던 엔티티와 일치 시키려면 먼저 교육해야하며, 더 복잡하고 많은 양의 데이터가 필요합니다. –