Копирование вложений для gensim word2vec - PullRequest
0 голосов
/ 14 июня 2019

Я хотел посмотреть, смогу ли я просто установить новые веса для Word2Vec от gensim без обучения. Я получил набор данных 20 News Group из scikit-learn (из sklearn.datasets import fetch_20newsgroups) и обучил его экземпляру Word2Vec:

model_w2v = models.Word2Vec(sg = 1, size=300)
model_w2v.build_vocab(all_tokens)
model_w2v.train(all_tokens, total_examples=model_w2v.corpus_count, epochs = 30)

Здесь all_tokens - это токенизированный набор данных. Затем я создал новый экземпляр Word2Vec без обучения

model_w2v_new = models.Word2Vec(sg = 1, size=300)
model_w2v_new.build_vocab(all_tokens)

и установите вложения нового Word2Vec равным первому

model_w2v_new.wv.vectors = model_w2v.wv.vectors

Большинство функций работают должным образом, например,

model_w2v.wv.similarity( w1='religion', w2 = 'religions')
> 0.4796233
model_w2v_new.wv.similarity( w1='religion', w2 = 'religions')
> 0.4796233

и

model_w2v.wv.words_closer_than(w1='religion', w2 = 'judaism')
> ['religions']
model_w2v_new.wv.words_closer_than(w1='religion', w2 = 'judaism')
> ['religions']

и

entities_list = list(model_w2v.wv.vocab.keys()).remove('religion')

model_w2v.wv.most_similar_to_given(entity1='religion',entities_list = entities_list)
> 'religions'
model_w2v_new.wv.most_similar_to_given(entity1='religion',entities_list = entities_list)
> 'religions'

Однако, Most_s Similar не работает:

model_w2v.wv.most_similar(positive=['religion'], topn=3)
[('religions', 0.4796232581138611),
 ('judaism', 0.4426296651363373),
 ('theists', 0.43141329288482666)]

model_w2v_new.wv.most_similar(positive=['religion'], topn=3)
>[('roderick', 0.22643062472343445),
> ('nci', 0.21744996309280396),
> ('soviet', 0.20012077689170837)]

Что мне не хватает?

Отказ от ответственности. Я разместил этот вопрос на datascience.stackexchange , но не получил ответа, надеясь получить здесь удачу.

1 Ответ

1 голос
/ 14 июня 2019

Как правило, ваш подход должен работать.

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

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

Если это именно то, что произошло, просто сброс кешированных значений должен привести к тому, что следующий most_similar() обновит их должным образом, а затем вы получите ожидаемые результаты:

model_w2v_new.wv.vectors_norm = None
...