如何在python中有效地进行数百万条记录的文本搜索和相似度计算

时间:2016-07-01 10:44:56

标签: python performance full-text-search similarity processing-efficiency

我有两个表,每个表包含200万条记录。一个具有项目名称和其他项目描述以及其他属性。我必须将表1中的每个项目与表2中的每个描述相匹配,以找到最大相似性匹配。所以基本上,对于200万件物品中的每件物品,我必须扫描另一张表以找到最佳匹配。这使得200万* 200万次计算!我如何有效地在python中做到这一点?就目前而言,计算需要数年时间。

现在我正在遵循的方法是正则表达式搜索,将每个项目名称拆分为列表中的单词,然后检查该单词是否包含在描述中。如果是,那么我将匹配计数增加1并使用该我计算相似度。

所以我的问题是:

  1. 如何让我的计算更快?使用多线程,拆分 数据或类似的东西?

  2. 任何其他可在此处使用的相似度算法?请注意 我在另一方面有描述,因此余弦相似性等等 因不同的词数而工作。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Distance包来计算相似度的Levenshtein距离。

来自文档:

  

比较字符串列表对计算也很有用   文章或文章中句子,段落等之间的相似之处   书籍,抄袭识别:

>>> sent1 = ['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']
>>> sent2 = ['the', 'lazy', 'fox', 'jumps', 'over', 'the', 'crazy', 'dog']
>>> distance.levenshtein(sent1, sent2)
3

python-Levenshtein包:

>>> distance('Levenshtein', 'Lenvinsten')
4

>>> distance('Levenshtein', 'Levensthein')
2
>>> distance('Levenshtein', 'Levenshten')
1
>>> distance('Levenshtein', 'Levenshtein')
0

答案 1 :(得分:0)

你也可以使用NLTK。

from nltk import *
reference = 'DET NN VB DET JJ NN NN IN DET NN'.split()
test    = 'DET VB VB DET NN NN NN IN DET NN'.split()
print(accuracy(reference, test))
print edit_distance("rain", "shine")