2016-11-07 5 views
2

Ich muss Spacy NER trainieren, um 2 neue Klassen für die Erkennung benannter Entitäten erkennen zu können. Ich habe nur Dateien mit einer Liste von Elementen, die in neuen Klassen sein sollen.Neue benannte Entitätsklasse in Spacy

Zum Beispiel: Rolling Stones, Muse, Arctic Monkeys - Künstler Irgendeine Idee, wie dies getan werden kann?

Antwort

5

Dies scheint wie ein perfekter Anwendungsfall für Matcher oder PhraseMatcher (wenn Sie Wert auf Leistung legen).

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) 

Weitere Informationen finden Sie in der Dokumentation. Aus meiner Erfahrung würde es bei 400k-Entitäten in einem Matcher fast eine Sekunde dauern, um jedes Dokument zu vergleichen. PhraseMatcher ist viel schneller, aber ein wenig komplizierter zu verwenden. Beachten Sie, dass es sich um einen "strikten" Matcher handelt, der keine Entitäten enthält, die er zuvor noch nicht gesehen hat.

+0

danke, ich werde versuchen, dass –

+0

aber es sieht so aus, dass ich alle Elemente meiner neuen Entität manuell hinzufügen müssen? –

+0

Richtig, wie ich schon sagte. Wenn Sie Entitäten, die es vorher nicht gesehen hat, abgleichen wollen, müssen Sie es zuerst trainieren, was komplizierter ist und immer noch eine Menge Daten erfordert. –