Python 3.x Python:如何更快地计算Jaccard相似性

Python 3.x Python:如何更快地计算Jaccard相似性,python-3.x,nlp,Python 3.x,Nlp,在lst\u测试中约有98000个句子(长度从5-100个单词),在lst\u测试中约有1000个句子(长度从5-100个单词)。对于lst\u test中的每个句子,我想找出它是否是从lst\u train中的一个句子剽窃的。如果句子是剽窃的,我应该在lst_train中返回id,否则为空 现在我想计算lst\u test中每个句子相对于lst\u train中每个句子的jaccard相似度。这是我的代码,b.JaccardSim计算两个句子的jaccard相似性: lst_all_p = [

lst\u测试中约有98000个句子(长度从5-100个单词),在
lst\u测试中约有1000个句子(长度从5-100个单词)。对于
lst\u test
中的每个句子,我想找出它是否是从
lst\u train
中的一个句子剽窃的。如果句子是剽窃的,我应该在lst_train中返回id,否则为空

现在我想计算
lst\u test
中每个句子相对于
lst\u 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_火车上,每一句话计算一个句子的时间超过1分钟。因为大约有1000个句子,完成它可能需要1000分钟。太长了


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

也许最好改变你的方法。Jaccard相似度在计算上并不是超级复杂的,但是如果你必须对数据集中的每个元素都这样做,那么任何非平凡的相似度计算都会很慢

如果你想发现剽窃,你应该研究近重复检测位置敏感哈希。这些都是很好的起点,图书馆也可能会有所帮助


请注意,对于许多应用程序,向量化句子和在向量空间中搜索封闭句子是有效的。然而,这是有效的,因为它能够理解同义词-因为你在寻找剽窃,你在寻找精确的副本,因此基于词向量的方法可能最终会与你的目标背道而驰。

正如polm23所建议的那样,datasektch库非常适合你的任务


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

基于文本的相似性度量非常缓慢。尝试对文本数据进行矢量化,并使用余弦相似性度量或基于它的一些方法。hi@CrazyElf,谢谢你的评论。现在我正在使用word2vec来做这件事。谢谢你的评论,我已经给你发了电子邮件,请检查一下。