匹配2个字符串并允许5%的不匹配率

时间:2014-06-13 11:54:29

标签: python python-2.7 bioinformatics

我有2个大约100,000,000行的文件需要相互比较。如标题中所述,我想比较文件中的每一行。我有下面的代码,它的工作非常好,但是我希望对它进行调整,以便在长时间匹配期间发生不匹配时,它会被接受,错误级别为5%。

下面是我用来匹配文件行的函数。

ret1 = []
merging = {} 
def slide_merge(seq1, seq2):
    for i in xrange(min(len(seq1), len(seq2))):
        if seq1[i] == 'N':
            ret1.append(seq1[i])
            print (''.join(ret1))
        elif seq2[i] == 'N':
            ret1.append(seq1[i])
            print (''.join(ret1))
        elif seq1[i] != seq2[i]:
            break
        else:
            ret1.append(seq1[i])
            print (''.join(ret1))
    print ("strings share a longest common prefix of length:", len(ret1), "out of:", len(seq1))
    ret1len = len(ret1)
    merging[''.join(ret1)] = ret1len # Adds details to dictionary
    return merging

以下代码是代码中如何使用上述函数以及如何获得最长匹配。

while len(rc1u) >= 50: # So matches of 8 are included
    slide_merge(rc1u, rc2wr)      ### rc1u all cut up here so of no further use
    rc1u = rc1u[1:]
merging
max(merging.iteritems(), key=operator.itemgetter(1))[0]
highest = max(merging.iteritems(), key=operator.itemgetter(1))[0]
highest

重要的是我正在使用HTSeq输入基因测序文件。

所以问题是如何调整此代码或制作另一个代码来比较2个字符串并从一开始就识别最长的匹配序列,同时允许5%的不匹配发生,例如:

string1 = AAAAATTTTTCCCCCGGGGGTTTTT
string2 = AAAAATTTTTCCCCCGGGGATTTTT

代码应该看到2个字符串完全与1个字符相匹配,但由于小于5%,匹配区域应该表示为: 匹配 25

1 个答案:

答案 0 :(得分:1)

您可以计算这些字词之间的Levenshtein distance,然后找出这些字词之间的不匹配百分比'。

提供了一个实施示例here

我们假设计算两个字符串之间距离的函数称为dis_lev,您可以通过这种方式评估百分比:

from __future__ import division

distance = dis_lev(string1, string2)
mismatch_ratio = distance / len(string1)
if mismatch_ratio > 0.05:
    raise MyAwesomeException("Hey ! These things do not match at all !")

例如,使用您提供的示例和我提供的链接中提供的迭代实现:

>>> distance = dis_lev("AAAAATTTTTCCCCCGGGGGTTTTT", "AAAAATTTTTCCCCCGGGGATTTTT")
>>> distance
1
>>> mismatch_ratio = distance / len("AAAAATTTTTCCCCCGGGGGTTTTT")
0.04 

修改:根据您的情况,您可以使用其他指标,其中一些指标列出here