【问题标题】:Python: How to compute Jaccard Similarity more quicklyPython:如何更快地计算 Jaccard 相似度
【发布时间】:2018-06-09 04:14:27
【问题描述】:

lst_train 大约有 98,000 个句子(长度从 5 - 100 个单词),lst_test 大约有 1000 个句子(长度从 5 - 100 个单词)。对于lst_test中的每个句子,我想查找它是否抄袭lst_train中的句子。如果句子被抄袭,我应该返回lst_train中的id,否则返回null。

现在我想计算 lst_test 中每个句子相对于 lst_train 中每个句子的 jaccard 相似度。这是我的代码,b.JaccardSim 计算两个句子的 jaccard 相似度:

lst_all_p = []
for i in range(len(lst_test)):
    print('i:', i)
    lst_p = []
    for j in range(len(lst_train)):
        b = textSimilarity.TextSimilarity(lst_test[i], lst_train[j])
        lst_p.append(b.JaccardSim(b.str_a,b.str_b))
    lst_all_p.append(lst_p)

但是我发现lst_train中每个句子计算一个句子的时间超过1分钟。由于大约有 1000 个句子,因此可能需要大约 1000 分钟才能完成。太长了。

你们知道如何让计算速度更快或更好的方法来解决从lst_train中的句子中检测句子是否抄袭的问题吗?

【问题讨论】:

  • 基于文本的相似度指标非常慢。尝试对文本数据进行向量化,使用余弦相似度度量,或者一些基于它的方法。
  • hi@CrazyElf,感谢您的 cmets。现在我正在使用 word2vec 来做这件事。

标签: python-3.x nlp


【解决方案1】:

改变你的方法可能会更好。 Jaccard Similarity 的计算密集度不是很高,但如果您必须对数据集中的每个元素都执行此操作,那么任何非平凡的相似度计算都会很慢。

如果你想找出抄袭,你应该研究近乎重复检测局部敏感散列MinHashSimHash 是很好的起点,datasketch 库也可能会有所帮助。

请注意,对于许多应用程序而言,将句子向量化并在向量空间中搜索接近的句子是有效的。但是,这很有效,因为它能够理解同义词 - 因为您正在寻找抄袭,所以您正在寻找精确的副本,因此基于词向量的方法最终可能会与您的目标背道而驰。

【讨论】:

  • 感谢您的cmets,我已经给您发了邮件,请查收。
【解决方案2】:

根据 polm23 的建议,datasektch 库非常适合您的任务。

GitHub repo 显示了一个示例,其中 datasketch 提供的 LSH 实现用于计算文本文档之间的 Jaccard 相似度。

【讨论】:

    猜你喜欢
    • 2017-03-27
    • 2022-01-04
    • 2013-06-24
    • 1970-01-01
    • 2018-01-02
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多