Learning2Search (vowpal-wabbit) для NER дает странные результаты

Мы пытаемся использовать Learning2Search из vowpal-wabbit для NER. Мы используем набор данных ATIS.

В ATIS имеется 127 объектов (включая категорию "Другие"). В учебном наборе 4978, а в тесте 893 предложения.

Как бы то ни было, когда мы запускаем его на тестовом наборе, он отображает все: либо класс 1(название авиакомпании), либо класс 2 (код аэропорта), который подключен.

введите описание изображения здесь

Мы попробовали другой набор данных ( https://github.com/glample/tagger/tree/master/dataset), то же самое поведение.

Похоже, я не правильно использую это. Любые указатели будут очень полезны.

Фрагмент кода:

with open("/tweetsdb/ner/datasets/atis.pkl") as f:
    train, test, dicts = cPickle.load(f)

idx2words = {v: k for k, v in dicts['words2idx'].iteritems()}
idx2labels = {v: k for k, v in dicts['labels2idx'].iteritems()}
idx2tables = {v: k for k, v in dicts['tables2idx'].iteritems()}


#Convert the dataset into a format compatible with Vowpal Wabbit
training_set = []
for i in xrange(len(train[0])):
    zip_label_ent_idx = zip(train[2][i], train[0][i])
    label_ent_actual = [(int(i[0]), idx2words[i[1]]) for i in zip_label_ent_idx]
    training_set.append(label_ent_actual)


# Do like wise to get test chunk

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 3 --search_task hook --ring_size 1024")

Код для обучения модели:

#Training
sequenceLabeler = vw.init_search_task(SequenceLabeler)
for i in xrange(3):
    sequenceLabeler.learn(training_set[:10])

Код для предсказания:

pred = []
for i in random.sample(xrange(len(test_set)), 10):
    test_example = [ (999, word[1]) for word in test_set[i] ]
    test_labels  = [ label[0] for label in test_set[i] ]
    print 'input sentence:', ' '.join([word[1] for word in test_set[i]])
    print 'actual labels:', ' '.join([str(label) for label in test_labels])
    print 'predicted labels:', ' '.join([str(pred) for pred in sequenceLabeler.predict(test_example)])

Чтобы увидеть полный код, пожалуйста, обратитесь к этой записной книжке: https://github.com/nsanthanam/ner/blob/master/vowpal_wabbit_atis.ipynb

1 ответ

Я также новичок в этом алгоритме, но недавно провел несколько экспериментальных исследований.

Для вашей проблемы ответ заключается в том, что вы установили неправильный параметр в

vw = pyvw.vw("--search 3 --search_task hook --ring_size 1024")

Здесь поиск должен быть установлен как '127', и таким образом, vw будет использовать ваши 127 тегов.

vw = pyvw.vw("--search 127 --search_task hook --ring_size 1024")

Кроме того, я чувствую, что VW не очень хорошо работает с таким количеством тегов. Я могу ошибаться, пожалуйста, дайте мне знать ваш результат:)

Другие вопросы по тегам