【发布时间】: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