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

时间:2015-12-24 03:44:39

标签: python algorithm tf-idf feature-selection cosine-similarity

我正在处理十万(100,000)份文件(平均文件长度约为500个术语)。对于每个文档,我想通过余弦相似性得到前k(例如k = 5)个相似文档。那么如何有效通过 Python 来做到这一点。

这是我做的:

  1. 对于每个文档,进行文本分割,删除停用词,计算术语频率(tf)
  2. 所以我们得到tf矩阵,大约100,000个文档* 600000个术语
  3. 做1 - pairwise_distances(tf_matrix,metric ="余弦")
  4. 对于每个文档,获得前k个类似的文档。
  5. 我在i5-2.5GHz上运行我的代码,12小时过去但仍然有效。所以我想知道如何优化我的代码或程序。

    以下是我的想法:

    1. 对于每个文档,进行特征选择,只保留其tf>的术语。 1
    2. 首先进行聚类,然后计算每个聚类内的余弦相似度
    3. 因为我只需要前k个相似的文件,我是否需要计算所有成对余弦相似度?
    4. python GPU编程还是并行编程?
    5. 那么,你有什么好主意吗?

      非常感谢。

      我知道有一个similar question,但这不是我想要的。

      UPDATE1

      感谢@orange,经过剖析,我发现第2步是瓶颈!以下是示例代码:

      XMLHttpRequest

      因此,瓶颈是向pandas添加新的行和列。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您一次分配数据数组,Pandas DataFrames(和底层numpy)真的很快。 set_value需要调用矩阵中的每个单元格! 您可以执行dt_matrix = pd.DataFrame(cleaned_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)。