我正在处理十万(100000)个文档(平均文档长度约为500个术语)。对于每个文档,我希望通过余弦相似度得到前k(例如k=5)个相似文档。那么如何通过Python来高效地实现这一点呢。在
以下是我所做的:对每个文档,进行文本分割,删除停止字,计算词频(tf)
所以我们得到了tf矩阵,大约100000个文档*600000个术语
do 1-pairwise_distances(tf_矩阵,metric=“余弦”)
对于每个文档,获取前k个相似文档。在
我用i5-2.5GHz运行我的代码,12小时过去了,但它仍在工作。所以我想知道如何优化我的代码或过程。在
我的想法是:对于每个文档,进行功能选择,只保留tf>;1的术语
首先进行聚类,然后计算每个聚类内的余弦相似度
既然我只需要top k个相似文档,我是否需要计算所有成对余弦相似度?在
PythonGPU编程还是并行编程?在
那么,你有什么好主意吗?在
非常感谢。在
我知道有一个similar question,但那不是我想要的。在
更新1
感谢@orange,在分析之后,我发现第2步是瓶颈!下面是示例代码:def construct_dt_matrix():
dt_matrix = pd.DataFrame(columns=['docid'])
docid = 0
for f in files:
# text segmentation for f
# remove stop words
# word count store in cleaned_dict = {'word': tf}
dt_matrix.loc[docid] = [0] * dt_matrix.shape[1] # add one row, init all 0
dt_matrix.set_value(docid, 'docid', docid)
for key, value in cleaned_dict.items():
if key not in dt_matrix.columns.values:
dt_matrix[key] = 0 # add one column, init all 0
dt_matrix.set_value(docid, key, value) # bottleneck
docid += 1
所以,瓶颈是向pandas添加新的行和列。有什么想法吗?在
面对100000个文档,通过余弦相似度找出每个文档的前k个最相似文档。目前使用TF矩阵和1-pairwise_distances计算导致耗时过长。考虑优化方案包括:特征选择、预聚类、避免全对计算,以及探索Python GPU编程或并行计算。更新指出,将清理后的字典添加到DataFrame中是瓶颈。
1万+

被折叠的 条评论
为什么被折叠?



