加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何使用python通过余弦相似性有效地检索顶级K-like文档?

发布时间:2020-12-20 13:09:08 所属栏目:Python 来源:网络整理
导读:我正在处理十万(100,000)份文件(平均文件长度约为500个术语).对于每个文档,我想通过余弦相似性得到前k(例如k = 5)个相似文档.那么如何通过 Python有效地做到这一点. 这是我做的: 为每个文档,进行文本分割,删除停用词,计算术语频率(tf) 所以我们得到tf矩阵,
我正在处理十万(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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读