python3(nltk/numpy/etc):计算和查找相似字符串对的高效方法

python3(nltk/numpy/etc):计算和查找相似字符串对的高效方法,python,string,numpy,nltk,similarity,Python,String,Numpy,Nltk,Similarity,我有一个N个字符串的列表。我的任务是找到所有足够相似的字符串对。也就是说,我需要(I)一个相似性度量,它将产生一个预定义范围内的数字(比如0到1之间),用于测量两个字符串的相似程度;(ii)一种快速遍历O(N^2)对的方法,以找到那些高于某种阈值的值(如果度量为更相似的字符串提供了更大的数字,那么>=0.9)。我现在所做的是相当缓慢的(正如人们可能预期的)为一个大N: import difflib num_strings = len(my_strings) for i in range(num

我有一个N个字符串的列表。我的任务是找到所有足够相似的字符串对。也就是说,我需要(I)一个相似性度量,它将产生一个预定义范围内的数字(比如0到1之间),用于测量两个字符串的相似程度;(ii)一种快速遍历O(N^2)对的方法,以找到那些高于某种阈值的值(如果度量为更相似的字符串提供了更大的数字,那么>=0.9)。我现在所做的是相当缓慢的(正如人们可能预期的)为一个大N:

import difflib

num_strings = len(my_strings)
for i in range(num_strings):
    s_i = my_strings[i]

    for j in range(i+1,num_strings):
        s_j = my_strings[j]
        sim = difflib.SequenceMatcher(a=s_i, b=s_j).ratio()
        if sim >= thresh:
            print("%s\t%s\t%f" % (s_i,s_j,sim))
问题:

  • 有什么好方法可以矢量化这个双循环来加速它 可能使用NLTK、numpy或任何其他库
  • 你会推荐一个比difflib的比率更好的指标吗(同样,来自NLTK、numpy等)

  • 谢谢

    如果您想要最佳解决方案,您必须是O(n^2),如果您想要最佳解决方案的近似值,您可以选择阈值并删除具有公平相似比的对。
    我建议您使用另一个度量,因为您正在使用difflib的比率增加复杂性(它取决于字符串的长度)。这些比率可以是熵或曼哈顿/欧几里得距离

    我不太明白你的第一句话。我需要做O(N^2)相似性计算,即使我提出了一些快速的启发式方法来快速识别相似性非常低或非常高的配对。问题是我是否能比上面的双循环做得更快。(ii)你能推荐一个具体的指标来代替比率吗?我的第一句话认为,为了找到“足够满意”的一对,你不必将每个元素与列表中的所有元素进行比较。至于另一个指标,你可以使用汉明距离:
    scipy.space.distance.hamming(u,v)
    如果u和v应该是表示字符串的字符列表,那么这对不同长度的字符串不起作用,我不能排除这一点,因此你可以看看Levenshtein距离Levenshtein给出了一个以记号(字符、单词等)为单位的距离。我正在寻找一个预定义范围内的规范化度量(例如,0和1之间),以便我可以尝试以下方法:您可以发布您想要处理的字符串的完整列表吗?