首页 > 解决方案 > Doc2vec 文档与文档子集的最大相似度得分

问题描述

我是 doc2vec 的新手。我有一个包含两列的数据框:一列是 id ( patent_number),另一列是经过清理和标记化的文本 ( clean_description)。对于每个 id,我需要在第 3 列 () 中生成与名为 的列表中属于 id的子集max_similarity的相似度的最大值,该列表标识子数据帧。以下是数据框中 7528 个观察值的摘录:clean_descriptionclean_descriptionpatents_snow_banch

   clean_description                                         patent_number
0  ['detailed', 'description', 'preferred', 'embodied']          3930647
1  ['referring', 'first', 'fig', 'ski', 'comprise']              3930658
2  ['description', 'preferred', 'embodiments', 'solution']       3930659
...

patent_number我目前的方法是生成一个 7528X7528 相似度矩阵,并从由 标识的子集中提取每个的最大值patents_snow_banch,但我对其他方法完全开放

我已经使用 doc2vec 来测量数据帧clean_description中每个与另一个clean_descriptions的相似度,并生成一个 7528X7528 相似度矩阵。

sample = df[['clean_description', 'patent_number']]
class MyDataframeCorpus(object):
    def __init__(self, source_df, text_col, tag_col):
        self.source_df = source_df
        self.text_col = text_col
        self.tag_col = tag_col

    def __iter__(self):
        for i, row in self.source_df.iterrows():
            yield TaggedDocument(words=simple_preprocess(row[self.text_col]), 
                                 tags=[row[self.tag_col]])

corpus_for_doc2vec = MyDataframeCorpus(sample , 'clean_description', 'patent_number')

model = Doc2Vec(vector_size=100, window=20, min_count=5, workers=11,alpha=0.025, epochs=20)
model.build_vocab(corpus_for_doc2vec)
model.train(corpus_for_doc2vec,total_examples=model.corpus_count, epochs=model.epochs)

similarity_matrix = []
index = similarities.MatrixSimilarity(matutils.Dense2Corpus(model.wv.vectors.T))

for sims in index:
    similarity_matrix.append(sims)
similarity_array = np.array(similarity_matrix)

模型的训练似乎运行良好(据我所知),但结果矩阵 ( similarity_array) 是 16321X16321 而不是 7528X7528。

假设这个问题是可解决的,并且我可以得到一个适当的 7528X7528 矩阵,那么我需要为每个观察找到与在名为patents_snow_banch

关于如何完成的任何想法?提前致谢

标签: pythonpandassimilaritydoc2vec

解决方案


我建议不要使用SimilarityMatrix,也不要明确地尝试计算所有成对的相似性。相反,只需使用该gensim .most_similar()方法为您的每个感兴趣的项目请求一个最相似的项目。

例如,要获得与训练集中每个项目最相似的单个项目,请按照它们在训练集中出现的顺序排列在一个列表中:

most_similars = [model.docvecs.most_similar(doc.tags[0], topn=1) 
                 for doc in corpus_for_doc2vec]

这实际上将存储相似文档的标签及其相似度分数 -model.docvecs.most_similar(doc.tags[0], topn=1)[0]如果您只想要标签,则可以保存。

(虽然暂时,在 内部.most_similar(),所有成对相似性都将针对单个目标进行计算和排序,但您不会将所有那些不太好的相似性保留在一个大矩阵中。)

patent_number如果您想通过键而不是序号位置查找热门点击,您也可以将结果存储在字典中:

most_similars_by_key = {}
for doc in corpus_for_doc2vec:
    most_similars_by_key[doc.tags[0]] = model.docvecs.most_similar(doc.tags[0], topn=1)

推荐阅读