2016-11-07 2 views
2

J'ai besoin de former Spacy NER pour être capable de reconnaître 2 nouvelles classes pour la reconnaissance d'entités nommées, tout ce que j'ai sont des fichiers avec une liste d'éléments qui sont supposés être dans de nouvelles classes. Par exemple: Rolling Stones, Muse, Arctic Monkeys - artistes Une idée de comment cela peut-il être fait?Nouvelle classe d'entité nommée dans Spacy

Répondre

5

Cela semble être un cas d'utilisation parfait pour Matcher ou PhraseMatcher (si vous vous souciez de la performance).

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) 

Voir la documentation pour plus de détails. D'après mon expérience, avec 400k entités dans un Matcher, il faudrait presque une seconde pour faire correspondre chaque document. PhraseMatcher est beaucoup plus rapide mais un peu plus difficile à utiliser. Notez que ceci est "strict", il ne correspondra à aucune des entités qu'il n'a pas vues auparavant.

+0

merci, je vais essayer que –

+0

mais il semble que j'ai besoin d'ajouter tous les éléments de ma nouvelle entité manuellement? –

+0

Juste, comme je l'ai dit. Si vous voulez faire correspondre des entités que vous n'aviez pas vues auparavant, vous devez d'abord l'entraîner, ce qui est plus compliqué et nécessite encore beaucoup de données. –