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 -
- Was bin ich falsch hier?
- Gibt es andere Parameter für das Modell, die ich variieren kann? Oder kann ich bestehende besser verwenden wie
ring_size
undsearch_task
? - Alle Vorschläge, die Sie anbieten könnten, um die Generalisierbarkeit der Modelle zu verbessern?