python - Doc2vec 文档与文档子集的最大相似度得分
问题描述
我是 doc2vec 的新手。我有一个包含两列的数据框:一列是 id ( patent_number
),另一列是经过清理和标记化的文本 ( clean_description
)。对于每个 id,我需要在第 3 列 () 中生成与名为 的列表中属于 id的子集max_similarity
的相似度的最大值,该列表标识子数据帧。以下是数据框中 7528 个观察值的摘录:clean_description
clean_description
patents_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
关于如何完成的任何想法?提前致谢
解决方案
我建议不要使用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)
推荐阅读
- swift - 使用基于协议的 Enum 时遇到的问题
- python-3.x - Seaborn:在同一图中绘制散点图超过线图
- java - Kotlin - 作为尾随 Lambda 的接口
- python - 如何在 Python 中使用 K-Means 聚类划分数据
- javascript - 返回具有以下格式的数组:[lowestKey,highestKey]
- sql-server - SSIS 从 Excel 单元格中提取链接以加载到 SQL
- eclipse - 最新的 Eclipse 的 xdoclet 构建器有 StackOverflowError
- python - 用户选择参数值的 Tkinter 小部件,但如何存储这些值?
- jquery - jQuery Css 速度实现
- html - 想让 Nav-Item 与 Nav-Bar 高度相同