为什么doc2vec给出了不同且不可靠的结果



我有一组20个小文档,其中讨论了一种特定的问题(训练数据(。现在,我想确定10K文档中的那些文档,它们正在讨论相同的问题。

为此,我使用了doc2vec实现:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize

# Tokenize_and_stem is creating the tokens and stemming and returning the list
# documents_prb store the list of 20 docs
tagged_data = [TaggedDocument(words=tokenize_and_stem(_d.lower()), tags=[str(i)]) for i, _d in enumerate(documents_prb)]
max_epochs = 20
vec_size = 20
alpha = 0.025
model = Doc2Vec(size=vec_size,
alpha=alpha, 
min_alpha=0.00025,
min_count=1,
dm =1)
model.build_vocab(tagged_data)
for epoch in range(max_epochs):
print('iteration {0}'.format(epoch))
model.train(tagged_data,
total_examples=model.corpus_count,
epochs=model.iter)
# decrease the learning rate
model.alpha -= 0.0002
# fix the learning rate, no decay
model.min_alpha = model.alpha
model.save("d2v.model")
print("Model Saved")
model= Doc2Vec.load("d2v.model")
#to find the vector of a document which is not in training data

def doc2vec_score(s):
s_list = tokenize_and_stem(s)
v1 = model.infer_vector(s_list)
similar_doc = model.docvecs.most_similar([v1])
original_match = (X[int(similar_doc[0][0])])
score = similar_doc[0][1]
match = similar_doc[0][0]
return score,match

final_data  = []
# df_ws is the list of 10K docs for which i want to find the similarity with above 20 docs
for index, row in df_ws.iterrows():
print(row['processed_description'])
data = (doc2vec_score(row['processed_description']))
L1=list(data)
L1.append(row['Number'])
final_data.append(L1)

with open('file_cosine_d2v.csv','w',newline='') as out:
csv_out=csv.writer(out)
csv_out.writerow(['score','match','INC_NUMBER'])
for row in final_data:
csv_out.writerow(row)

但是,我面临着一个奇怪的问题,结果非常不可靠(即使没有一点匹配,分数也是0.9(,而且分数每次都在以很大的差距变化。我正在运行doc2vec_score函数。有人能帮帮我这里出了什么问题吗?

First&最重要的是,尽量不要在自己的循环中使用多次呼叫train的反模式。

有关更多详细信息,请参阅此答案:经过多次循环训练,我的Doc2Vec代码是';t给出好的结果。可能出了什么问题?

如果修复后仍然存在问题,请编辑您的问题以显示更正的代码,以及您认为不可靠的输出的更清晰的示例。

例如,显示实际的文档ID&分数,并解释为什么你认为你正在测试的探测文档应该是";一点也不匹配";对于任何退回的文件。

请注意,如果一个文档真的与训练文档完全不同,例如使用训练文档中没有的单词,那么Doc2Vec模型就不可能检测到这一点。当它为新文档推断向量时,所有未知单词都被忽略。因此,您将得到一个只使用已知单词的文档,它将返回该文档单词子集的最佳匹配项。

更根本的是,Doc2Vec模型实际上只是在学习如何通过训练集和单词的共现来对比宇宙中的文档。如果呈现的文档中有完全不同的单词,或者单词的频率/共现率与以前完全不同,那么它的输出将基本上是随机的,与其他更典型的文档没有太多有意义的关系。(这可能很近,也可能很远,因为在某种程度上,对"已知宇宙"的训练往往会填满整个可用空间。(

因此,如果你也想识别负面例子,你就不想使用只训练Doc2Vec模型来识别你想要识别的东西的正面例子。相反,包括所有类型,然后记住与某些输入/输出决策相关的子集,并使用该子集进行下游比较,或者使用多个子集来提供更正式的分类或聚类算法。

最新更新