Doc2Vec获取最相似的文档

Clo*_*ave 32 python nlp gensim doc2vec

我正在尝试构建一个文档检索模型,该模型返回按查询或搜索字符串的相关性排序的大多数文档.为此,我使用gensim中的模型训练了一个doc2vec模型Doc2Vec.我的数据集采用pandas数据集的形式,每个文档都将每个文档存储为字符串.这是我到目前为止的代码

import gensim, re
import pandas as pd

# TOKENIZER
def tokenizer(input_string):
    return re.findall(r"[\w']+", input_string)

# IMPORT DATA
data = pd.read_csv('mp_1002_prepd.txt')
data.columns = ['merged']
data.loc[:, 'tokens'] = data.merged.apply(tokenizer)
sentences= []
for item_no, line in enumerate(data['tokens'].values.tolist()):
    sentences.append(LabeledSentence(line,[item_no]))

# MODEL PARAMETERS
dm = 1 # 1 for distributed memory(default); 0 for dbow 
cores = multiprocessing.cpu_count()
size = 300
context_window = 50
seed = 42
min_count = 1
alpha = 0.5
max_iter = 200

# BUILD MODEL
model = gensim.models.doc2vec.Doc2Vec(documents = sentences,
dm = dm,
alpha = alpha, # initial learning rate
seed = seed,
min_count = min_count, # ignore words with freq less than min_count
max_vocab_size = None, # 
window = context_window, # the number of words before and after to be used as context
size = size, # is the dimensionality of the feature vector
sample = 1e-4, # ?
negative = 5, # ?
workers = cores, # number of cores
iter = max_iter # number of iterations (epochs) over the corpus)

# QUERY BASED DOC RANKING ??
Run Code Online (Sandbox Code Playgroud)

我正在努力的部分是找到与查询最相似/相关的文档.我使用了infer_vector但后来意识到它将查询视为文档,更新模型并返回结果.我尝试使用most_similar和most_similar_cosmul方法,但我得到的话和相似度得分(我猜)作为回报.我想要做的是当我输入搜索字符串(查询)时,我应该得到最相关的文档(ID)以及相似性得分(余弦等).我该如何完成这部分?

Ero*_*ock 45

您需要使用infer_vector获取新文本的文档向量 - 这不会改变基础模型.

这是你如何做到的:

tokens = "a new sentence to match".split()

new_vector = model.infer_vector(tokens)
sims = model.docvecs.most_similar([new_vector]) #gives you top 10 document tags and their cosine similarity
Run Code Online (Sandbox Code Playgroud)

编辑:

以下是底层模型在infer_vec调用后不会发生变化的示例.

import numpy as np

words = "king queen man".split()

len_before =  len(model.docvecs) #number of docs

#word vectors for king, queen, man
w_vec0 = model[words[0]]
w_vec1 = model[words[1]]
w_vec2 = model[words[2]]

new_vec = model.infer_vector(words)

len_after =  len(model.docvecs)

print np.array_equal(model[words[0]], w_vec0) # True
print np.array_equal(model[words[1]], w_vec1) # True
print np.array_equal(model[words[2]], w_vec2) # True

print len_before == len_after #True
Run Code Online (Sandbox Code Playgroud)

  • 在doc2vec论文中明确指出,在推理时,模型的所有参数都是固定的.因此该模型肯定不会更新. (5认同)
  • 像训练这样的`infer_vector`具有非确定性元素.每次通话都会得到不同的向量.在Gensim的邮件列表上有很多讨论,他们的问题登录github.这是一个很好的例子:https://github.com/RaRe-Technologies/gensim/issues/447.此外,您可以测试模型是否更改.看我的编辑. (3认同)