Итак, я начал с попыток изучить 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)]
Это означает, что модель утверждает, что «я люблю программировать на питоне» больше всего похоже на «машинное обучение на питоне — это просто», тогда как я ожидаю, что «машинное обучение на питоне сложно» будет наиболее похожим. По крайней мере, я так это интерпретирую.