我知道近似字符串搜索和Levenshtein距离等相关技术,但我想做的是快速挑选出任何相似的匹配对(例如,1个Damerau-Levenshtein距离之内)的大量字符串列表。就像这样:
l = ["moose", "tiger", "lion", "mouse", "rat", "fish", "cat"]
matching_strings(l)
# Output
# [["moose","mouse"],["rat", "cat"]]
我只会使用R和Python,如果您的解决方案能够轻松地在其中一种语言中实现,那就更好了。
更新:
在Collapsar的帮助下,这是一个Python的解决方案。
import numpy
import functools
alphabet = {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x': 23, 'z': 25}
l = ["moose", "tiger", "lion", "mouse", "rat", "fish", "cat"]
fvlist=[]
for string in l:
fv = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
for letter in string:
fv[alphabet[letter]]+=1
fvlist.append(fv)
fvlist.sort (key=functools.cmp_to_key(lambda fv1,fv2: numpy.sign(numpy.sum(numpy.subtract(fv1, fv2)))))
然而,排序后的向量按以下顺序返回: "rat" "cat" "lion" "fish" "moose" "tiger" "mouse" 我认为这是次优的,因为我希望moose和mouse在彼此附近。我知道无论如何排序这些单词,都无法让所有单词都与它们最接近的对出现在一起。然而,我仍然愿意尝试其他解决方案。