Python 中更快的相似性聚类



我收集了几千个字符串(DNA序列)。 我想通过排除非常相似的序列将其减少到几百个(确切的数字并不重要)。

我可以通过使用"Levenshtein"模块进行匹配来做到这一点。 它有效,但它很慢,我很确定一定有更快的方法。 这里的代码是相同的方法,但应用于单词,使其更易于测试;对我来说,这个截止时间大约需要 10 秒并收集 ~1000 个单词。

import Levenshtein as lev
import random
f = open("/usr/share/dict/words", 'r')
txt = f.read().splitlines()
f.close()
cutoff = .5
collected = []
while len(txt) > 0:
    a = random.choice(txt)
    collected.append(a)
    txt = filter( lambda b: lev.ratio(a,b) < cutoff, txt) 

我尝试了几种不同的变体和其他一些匹配模块(水母),但没有明显更快。

也许你可以使用局部敏感哈希。您可以将所有字符串哈希到存储桶中,以便一个存储桶中的所有字符串彼此非常相似。然后,您只能从每个存储桶中选择一个。

我个人从来没有用过这个(不知道它在你的情况下效果有多好),这只是一个想法。相关: 字符串相似性的 Python 摘要/哈希

我不太确定您的应用程序的目标是什么,但是在使用序列时,您可能需要考虑使用Biopython。计算两个DNA剪之间距离的另一种方法是使用比对分数(通过非恒定比对权重与Levenshtein相关)。使用biopython,您可以进行多序列比对并创建系统发育树。如果您想要更快的解决方案,请使用 BLAST 这是一种启发式方法。这将是一致的解决方案,而您的解决方案取决于输入序列的随机选择。

关于您最初的问题,没有"简单"的解决方案来加速您的代码。

最新更新