1

Ich benutze die Python-API von Vowpal Wabbit, um Named Entity Recognition-Klassifizierer zu trainieren, um Namen von Personen, Organisationen und Standorten aus kurzen Sätzen zu erkennen. Ich habe ein IPython Notebook mit Details über die Daten, wie Modelle trainiert werden und Entitäten in Auswertungssätzen zusammengestellt. Trainingsdaten stammen aus den Datensätzen ATIS und CONLL 2003.Benannte Entitätserkennung mit Vowpal Wabbit scheint Trainingsdaten zu speichern

Das Setup meines Vowpal Wabbit SearchTask Klasse (basierend auf this tutorial):

class SequenceLabeler(pyvw.SearchTask): 
    def __init__(self, vw, sch, num_actions): 
     pyvw.SearchTask.__init__(self, vw, sch, num_actions) 

     sch.set_options(sch.AUTO_HAMMING_LOSS | sch.AUTO_CONDITION_FEATURES) 

    def _run(self, sentence): 
     output = [] 
     for n in range(len(sentence)): 
      pos,word = sentence[n] 
      with self.vw.example({'w': [word]}) as ex: 
       pred = self.sch.predict(examples=ex, my_tag=n+1, oracle=pos, condition=[(n,'p'), (n-1, 'q')]) 
       output.append(pred) 
     return output 

Model Training:

vw = pyvw.vw(search=num_labels, search_task='hook', ring_size=1024) 
#num_labels = 3 ('B'eginning entity, 'I'nside entity, 'O'ther) 

sequenceLabeler = vw.init_search_task(SequenceLabeler)  
sequenceLabeler.learn(training_set) 

Das Modell benannten Entitäten führt gut (exakte Zeichenfolge entspricht), die in der Trainingsdaten, aber verallgemeinert schlecht auf neue Beispiele, die die gleiche Struktur verwenden. Das heißt, Klassifikatoren werden Entitäten identifizieren, die in Sätzen von den Trainingsdaten vorhanden sind, aber wenn ich NUR die Namen ändere, tun sie es schlecht.

sample_sentences = ['new york to las vegas on sunday afternoon', 
        'chennai to mumbai on sunday afternoon', 
        'lima to ascuncion on sunday afternoon'] 

Der Ausgang dieses bei der Klassifikator laufen:

new york to las vegas on sunday afternoon 
locations - ['new york', 'las vegas'] 

chennai to mumbai on sunday afternoon 
locations - [] 

lima to ascuncion on sunday afternoon 
locations - [] 

Dies zeigt, dass, obwohl der Satz gleich bleibt: ‚a-b am Sonntag Nachmittag‘, das Modell die neuen Standorte nicht identifizieren kann vielleicht, weil es die Trainingsbeispiele auswendig gelernt hat?

Ähnliche Ergebnisse gelten für die Klassifikatoren organisation und person. Diese können in meinem Github gefunden werden.

Meine Fragen sind -

  1. Was bin ich falsch hier?
  2. Gibt es andere Parameter für das Modell, die ich variieren kann? Oder kann ich bestehende besser verwenden wie ring_size und search_task?
  3. Alle Vorschläge, die Sie anbieten könnten, um die Generalisierbarkeit der Modelle zu verbessern?

Antwort

2
  1. Sie keine gazetteers verwenden, keine orthographisch Merkmale (z --spelling oder --affix), Ihre Daten werden alle kleingeschrieben, so dass die einzigen Merkmale, die Unigramm- sind helfen können und BigRAM Identitäten. Es ist keine Überraschung, dass Sie die Trainingsdaten überfrachten. Theoretisch könnten Sie Ihre Trainingsdaten mit künstlich benannten Entitäten verstärken, die den Mustern folgen (x bis y am Sonntag), aber wenn dies helfen könnte, wäre es einfacher, einen regelbasierten Klassifikator zu erstellen.

  2. Es gibt viele Parameter, z.B. -l (Lernrate) und --passes. Siehe die tutorial und eine list of options. Beachten Sie, dass ring_size die Vorhersagequalität nicht beeinflusst, Sie müssen sie nur so hoch setzen, dass Sie keine Warnungen erhalten (d. H. Höher als die längste Sequenz).

  3. siehe 1

Verwandte Themen