【问题标题】:Doc2vec maximum similarity score of a document to a subset of documentsDoc2vec 文档与文档子集的最大相似度得分
【发布时间】:2020-06-20 14:10:41
【问题描述】:

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

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

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

我使用 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 的列表中标识的矩阵中的 id 子集的最大相似度得分

关于如何做到这一点的任何想法? 提前致谢

【问题讨论】:

    标签: python pandas similarity doc2vec


    【解决方案1】:

    我建议不要使用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)
    

    【讨论】:

    • 谢谢,这肯定是领先一步(它简化了很多)。但是,我还没有完全做到。在我的理解中 most_similar() 识别出考虑整个训练模型的最相似的专利,我需要提取与训练模型的子集最相似的专利。我已经使用 most_similar_to_given() 部分解决了这个问题,但这只会返回最相似的标签,而不是我需要的相似度分数。你知道一种提取相似度分数的方法吗?
    • 我想我已经整理好了。我使用了 most_similar_to_given,然后使用提取的标签关联计算了二元相似度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2012-03-17
    相关资源
    最近更新 更多