我正在尝试构建一个文档检索模型,它可以按照与查询或搜索字符串相关性最高的顺序返回大多数文档。为此,我使用 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 ??
我遇到的难点在于找到与查询最相似/相关的文档。我使用了infer_vector
,但意识到它将查询视为文档,更新模型并返回结果。我尝试使用most_similar
和most_similar_cosmul
方法,但得到的结果是单词及其相似度分数(我猜是相似度分数)。我想要做的是,在输入搜索字符串(即查询)时,应返回最相关的文档(ID),以及相似度得分(余弦等)。我该怎么做才能完成这一部分呢?
model.docvecs.most_similar()
。 - umuttosentence_tag
你是指我们在 LabeledSentence 中传递的标签吗?如果是这样,那么我已经使用文档 ID(基本上是一个数字1、2、3...num_docs)作为标签。我使用了infer_vector
,但它并没有帮助我,因为它将查询视为文档,更新模型权重并返回相似的文档。我不想每次传递查询时都更新模型。 最后,可以使用model.docvecs.most_similar()
,但它需要一个向量来查找最相似的文档。 - Clock Slave