此解决方案将继续查看两个元素的对,直到它查看了所有对而没有过滤任何一个。这不是一个有效的解决方案,因为它将继续一遍又一遍地查看同一对,而且它也没有利用可能的传递性。但这只是个开始。在>>> from itertools import combinations
>>> def filterSimilar (d):
while True:
filteredOne = False
for s, t in combinations(d, 2):
if isSimilar(s, t):
d.remove(t)
filteredOne = True
break
if not filteredOne:
break
>>> d = ['asdf', 'asxf', 'foo', 'bar', 'baz']
>>> filterSimilar(d)
>>> d
['asdf', 'foo', 'bar']
isSimilar的一个可能的示例实现是使用两个字符串之间的Levenshtein距离:
^{pr2}$
(注意,我在这个例子中使用的Levenshtein距离不是传递性比较的例子)
使用compute_jaccard_index函数,isSimilar函数如下所示:def isSimilar (s, t):
return compute_jaccard_index(s, t) > .4
然后在示例数据中使用:>>> lst = [{'very','beauty','place'},{'very','good','place'},{'another','trigram','item'}]
>>> filterSimilar(lst)
>>> lst
[{'very', 'beauty', 'place'}, {'item', 'trigram', 'another'}]