Как выполнять эффективные запросы с Gensim doc2vec? - PullRequest
2 голосов
/ 14 мая 2019

Я работаю над алгоритмом подобия предложений со следующим вариантом использования: учитывая новое предложение, я хочу получить его n наиболее похожих предложений из заданного набора.Я использую Gensim v.3.7.1, и я обучил обе модели word2vec и doc2vec.Результаты последних превосходят результаты word2vec, но у меня возникают проблемы при выполнении эффективных запросов с моей моделью Doc2Vec.Эта модель использует реализацию распределенного пакета слов (dm = 0).

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

Я успешно использую расстояние перемещения слов для word2vec и doc2vec, но получаю лучшие результаты для doc2vec при использовании косинусного сходства.Как эффективно запросить новый документ к моему набору, используя модель PV-DBOW Doc2Vec и метод из class Схожесть ?

Я ищу подход, аналогичный тому, что я делаю сОМУ, но для сходства косинусов doc2vec:

# set_to_query contains ~10% of the training data + some future updates
set_to_query_tokenized = [sentence.split() for sentence in set_to_query]
w2v_model = gensim.models.Word2Vec.load("my_w2v_model")
w2v_to_query = gensim.similarities.WmdSimilarity(
               corpus = set_to_query_tokenized,
               w2v_model = w2v_model,
               num_best=10
              )
new_query = "I want to find the most similar sentence to this one".split()
most_similar = w2v_to_query[new_query]

1 Ответ

0 голосов
/ 20 мая 2019

Создание собственного подмножества векторов, например KeyedVectors, не так просто, как могло бы или должно быть.

Но вы должны иметь возможность использовать WordEmbeddingsKeyedVectors (даже если вы работаете с документами-векторами), который загружается только с интересующими векторами. Я не проверял это, но предполагая, что d2v_model это ваша Doc2Vec модель, а list_of_tags - это теги, которые вы хотите в своем подмножестве, попробуйте что-то вроде:

subset_vectors = WordEmbeddingsKeyedVectors(vector_size)
subset_vectors.add(list_of_tags, d2v_model.docvecs[list_of_tags])

Затем вы можете выполнять обычные операции, например most_similar() над subset_vectors.

...