Чтобы most_similar()
возвращал только один наиболее похожий документ, это так же просто, как указать topn=1
.
Однако, чтобы узнать, какой из миллионов документов наиболее похож на один целевой вектор, необходимо рассчитать и отсортировать сходство со всеми всеми кандидатами. (Если бы хотя бы один документ был пропущен, он мог бы быть первым!)
Убедившись, что не происходит подкачки виртуальной памяти, можно гарантировать, что сравнение методом перебора выполняется как можно быстрее, все в ОЗУ, но с миллионами документов это все равно займет много времени.
То, что вы пытаетесь сделать, - это довольно простая самопроверка того, привело ли обучение к самосогласованной модели: создает ли повторный логический вывод документа вектор, очень близкий к тому же вектору документа, оставшемуся от массового обучения. Если это не так, это укажет на серьезные проблемы в подготовке документации или обучении, но это не настоящий показатель точности модели для любой реальной задачи, и ценность модели лучше всего оценивать с точки зрения предполагаемого использования.
Кроме того, поскольку эта самопроверка повторного вывода - это всего лишь грубая проверка работоспособности, в действительности нет необходимости делать это для каждого документа. Выбор тысячи (или десяти тысяч, или чего-то еще) случайных документов даст вам репрезентативное представление о том, обладают ли большинство повторно выведенных векторов этим качеством или нет.
Точно так же вы можете просто проверить сходство повторно выведенного вектора с одним вектором в модели для того же идентификатора документа и проверить, достаточно ли они похожи. (Это будет намного быстрее, но также может быть выполнено на случайной выборке документов.) Не существует подходящего волшебного порога для достаточно похожего; вам нужно будет выбрать тот, который, кажется, соответствует вашим другим целям. Например, используя cosine_similarity()
scikit-learn
для сравнения двух векторов:
from sklearn.metrics.pairwise import cosine_similarity
# ...
inferred_vector = model.infer_vector(doc_words)
looked_up_vector = model.dv[doc_id]
self_similarity = cosine_similarity([inferred_vector], [looked_up_vector])[0]
# then check that value against some threshold
(Вы должны заключить отдельные векторы в списки в качестве аргументов для cosine_similarity()
, а затем получить доступ к 0-му элементу возвращаемого значения, потому что он обычно предназначен для работы с большими списками векторов.)
С помощью этого расчета вы не узнаете, например, некоторые из других хранимых-doc-векторов немного ближе к предполагаемой цели, но это может быть не так уж важно. Документы могут быть действительно похожи! И хотя исходная самопроверка, наиболее близкая к самой себе, потерпит неудачу при наличии серьезных дефектов в обучении, даже хорошо обученная модель, вероятно, будет иметь некоторые случаи, когда естественное дрожание модели предотвращает появление ближайшего к себе для каждого документа. (При большем количестве документов внутри того же количества измерений или определенных корпусах с множеством очень похожих документов это стало бы более распространенным ... но не тревожным индикатором каких-либо проблем с моделью.)
person
gojomo
schedule
26.07.2020