Непонимание вывода Doc2Vec

Итак, я начал с попыток изучить Doc2Vec, в частности вывод косинусного сходства. По сути, я получаю неожиданный результат при попытке сопоставить новое предложение со списком предложений, на которых я обучал свою модель. Если бы кто-нибудь мог помочь, это было бы потрясающе, вот мой код:

import gensim
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

import nltk
from nltk.tokenize import word_tokenize

data = [
        'I love machine learning'
        ,'I love coding in python'
        ,'I love building chatbots'
        ,'they chat amazingly well'
        ,'dog poops in my yard'
        ,'this is a stupid exercise'
        ,'I like math and statistics'
        ,'cox communications is a dumb face'
        ,'Machine learning in python is difficult'
        ]

tagged_data = [TaggedDocument(words = word_tokenize(d.lower()), tags = [str(i)]) for i, d in enumerate(data)]

max_epochs = 15
vec_size = 10
wndw = 2
alpha_num = 0.025

model = Doc2Vec(vector_size = vec_size
                ,window = wndw
                ,alpha = alpha_num
                ,min_alpha = 0.00025
                ,min_count = 1
                ,dm = 1)
  
model.build_vocab(tagged_data)

model = Doc2Vec(tagged_data, vector_size = 20, window = 2, min_count = 1, workers = 4, epochs = 100)

new_sent = 'machine learning in python is easy'.split(' ')

model.docvecs.most_similar(positive = [model.infer_vector(new_sent)])

Вывод, который я получаю, таков (и он также случайный каждый раз, когда я запускаю, поэтому я тоже не уверен в этом):

[('2', 0.4818369746208191),
 ('5', 0.4623863697052002),
 ('3', 0.4057881236076355),
 ('4', 0.3984462022781372),
 ('8', 0.2882154583930969),
 ('7', 0.27972114086151123),
 ('6', 0.23783418536186218),
 ('0', 0.11647315323352814),
 ('1', -0.12095103412866592)]

Это означает, что модель утверждает, что «я люблю программировать на питоне» больше всего похоже на «машинное обучение на питоне — это просто», тогда как я ожидаю, что «машинное обучение на питоне сложно» будет наиболее похожим. По крайней мере, я так это интерпретирую.


person justin    schedule 23.03.2021    source источник


Ответы (2)


Возможно, вы неправильно понимаете вывод. Цифры — это индексы обучающих векторов. Следовательно, он больше всего похож на вектор с индексом 2, т.е. I love building chatbots, и наименее похож на вектор с индексом 1, т.е. I love coding in python.

При этом не создавайте две модели, одну для создания векторов и одну для тестирования. Только модель, с которой вы создаете векторы, понимает векторы, а другая - нет.

Дурацкие результаты, вероятно, связаны с тем, что машине недостаточно данных, чтобы понять или разработать полезное встраивание слов. Случайность может быть связана с тем, что каждый раз, когда вы запускаете его, при создании векторов слов прокатывается другой ГСЧ. Попробуйте установить случайное состояние, если есть способ сделать это.

person sourvad    schedule 23.03.2021

Doc2Vec и подобные алгоритмы не работают с наборами данных игрушечного размера. Самым минимальным для демонстрации будет что-то с сотнями текстов и десятками тысяч обучающих слов — и для такого (все еще очень маленького) набора данных вы снова захотите уменьшить vector_size по умолчанию до чего-то небольшого, как ваши 10 -20 значений, а не 100 по умолчанию.

Итак, прежде всего, протестируйте больший набор данных. В оригинальной статье и в большинстве других нетривиальных демонстраций будут использоваться наборы текстов из десятков тысяч, каждый из которых состоит не менее чем из дюжины, а в идеале — из десятков или сотен слов.

Во-вторых, ваш текущий код создает начальный экземпляр Doc2Vec, затем вызывает для него .build_vocab(), затем... отбрасывает эту модель и создает совершенно новую модель во втором присваивании переменной model. Вам нужно только создать один, и он должен иметь только те параметры, которые вам действительно нужны, а не сочетание разных параметров в вашем текущем коде.

Включение ведения журнала на уровне INFO обеспечит выходные данные, которые помогут вам понять, какие шаги выполняются, и по мере того, как вы научитесь читать выходные данные, вы можете увидеть подтверждение хорошего прогресса или индикаторы проблем.

Наконец, min_count=1 почти всегда плохая идея - этим алгоритмам нужно несколько примеров использования слова, чтобы оно не мешало обучению, и обычно лучше отбрасывать одноэлементные (и очень редкие) слова, чтобы другие стали лучше. . (После того как вы используете большой набор данных, потеря слов, которые появляются только от 1 до нескольких раз, не должна быть большой проблемой.)

person gojomo    schedule 24.03.2021