如何使用python通过余弦相似性有效地检索顶级K-like文档?
作者:互联网
我正在处理十万(100,000)份文件(平均文件长度约为500个术语).对于每个文档,我想通过余弦相似性得到前k(例如k = 5)个相似文档.那么如何通过Python有效地做到这一点.
这是我做的:
>为每个文档,进行文本分割,删除停用词,计算术语频率(tf)
>所以我们得到tf矩阵,大约100,000个文档* 600000个术语
>做1 – pairwise_distances(tf_matrix,metric =“余弦”)
>为每个文件,获得前k个类似的文件.
我在i5-2.5GHz运行我的代码,12小时过去但它仍然有效.所以我想知道如何优化我的代码或过程.
这是我的想法:
>对于每个文档,进行特征选择,只保留其tf>的术语. 1
>首先进行聚类,然后计算每个聚类内的余弦相似度
>因为我只需要前k个类似的文档,我是否需要计算所有成对余弦相似度?
> python GPU编程还是并行编程?
那么,你有什么好主意吗?
非常感谢.
我知道有一个similar question,但那不是我想要的.
UPDATE1
感谢@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添加新的行和列.任何的想法?
解决方法:
如果您一次分配数据数组,Pandas DataFrames(以及底层numpy)的速度非常快. set_value需要调用矩阵中的每个单元格!
您可以执行dt_matrix = pd.DataFrame(cleaning_dict),并且您有一个带有一个函数调用的DataFrame(忽略Pandas内部调用).
尝试改为:
dt_matrix = pd.DataFrame()
for docid, f in enumerate(files):
dt_matrix_file = pd.DataFrame(cleaned_dict)
dt_matrix_file['docid'] = docid
dt_matrix = dt_matrix.append(dt_matrix_file)
这应该快几个数量级.
如果您需要NaN单元格为零,则可以执行dt_matrix.fillna(0)(同样,一次调用而不是潜在的n * m).
标签:python,algorithm,cosine-similarity,tf-idf,feature-selection 来源: https://codeday.me/bug/20190711/1432492.html