Я использую API Python Vowpal Wabbit для обучения классификаторов распознавания именованных объектов для определения имен людей, организаций и местоположений из коротких предложений. Я составил блокнот IPython с подробными данными, как модели обучаются, и объекты, идентифицированные в оценочных предложениях. Данные обучения поступают из ATIS и CONLL 2003 наборы данных.
Настройка моего класса Vowpal Wabbit SearchTask (на основе этого учебник):
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
Обучение модели:
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)
Модель хорошо работает с именованными сущностями (точные совпадения строк), представленными в обучающих данных, но плохо обобщается на новые примеры, использующие ту же структуру. То есть классификаторы будут идентифицировать сущности, присутствующие в предложениях, из обучающих данных, но когда я ТОЛЬКО меняю имена, они работают плохо.
sample_sentences = ['new york to las vegas on sunday afternoon',
'chennai to mumbai on sunday afternoon',
'lima to ascuncion on sunday afternoon']
Вывод этого при запуске классификатора:
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 - []
Это указывает на то, что хотя предложение остается прежним: «с a
по b
в воскресенье днем», модель не может идентифицировать новые местоположения, возможно, потому, что она запомнила обучающие примеры?
Аналогичные результаты справедливы для классификаторов organisation
и person
. Их можно найти на моем Github.
Мои вопросы -
- Что я здесь делаю неправильно?
- Есть ли другие параметры модели, которые я могу изменить? Или мне лучше использовать существующие, такие как
ring_size
иsearch_task
? - Какие-либо предложения, которые вы могли бы предложить, чтобы улучшить обобщаемость моделей?