Python 如何计算文本字符串的多序列对齐

Python 如何计算文本字符串的多序列对齐,python,string,text,alignment,sequence,Python,String,Text,Alignment,Sequence,我正在写一个程序,它必须计算一组字符串的一个值。我想用Python来实现这一点,但如果更实用的话,我可以使用一个外部软件或另一种语言。数据不是特别大,我没有很强的性能要求,我可以容忍近似值(即,我只需要找到足够好的对齐方式)。唯一的问题是字符串是常规字符串(即可能带有换行符的UTF-8字符串,应将其视为常规字符);它们不是DNA序列或蛋白质序列 我可以找到生物信息学中常见案例的大量工具和信息,这些工具和信息具有特定的复杂文件格式和许多我不需要的功能,但对于简单的字符串案例,很难找到软件、库或示例

我正在写一个程序,它必须计算一组字符串的一个值。我想用Python来实现这一点,但如果更实用的话,我可以使用一个外部软件或另一种语言。数据不是特别大,我没有很强的性能要求,我可以容忍近似值(即,我只需要找到足够好的对齐方式)。唯一的问题是字符串是常规字符串(即可能带有换行符的UTF-8字符串,应将其视为常规字符);它们不是DNA序列或蛋白质序列

我可以找到生物信息学中常见案例的大量工具和信息,这些工具和信息具有特定的复杂文件格式和许多我不需要的功能,但对于简单的字符串案例,很难找到软件、库或示例代码。我可能会重新实现这个问题的许多算法中的任何一个,或者将我的字符串编码为DNA,但肯定有更好的方法。你知道有什么解决办法吗


谢谢

你是在找一些又快又脏的东西,比如下面的

from difflib import SequenceMatcher

a = "dsa jld lal"
b = "dsajld kll"
c = "dsc jle kal"
d = "dsd jlekal"

ss = [a,b,c,d]

s = SequenceMatcher()

for i in range(len(ss)):
    x = ss[i]
    s.set_seq1(x)
    for j in range(i+1,len(ss)):

        y = ss[j]
        s.set_seq2(y)

        print
        print s.ratio()
        print s.get_matching_blocks()

我最近编写了一个运行Smith-Waterman算法的python脚本(该算法用于为DNA或蛋白质序列生成有间隙的局部序列比对)。它几乎肯定不是最快的实现,因为我根本没有对它进行速度优化(目前不是我的瓶颈),但它可以工作并且不关心字符串中每个字符的标识。我可以把它贴在这里,或者把文件发电子邮件给你,如果你想找的话。

  • 对齐多个序列的最简单方法是进行大量成对对齐
首先获得每对的成对相似性分数并存储这些分数。这是过程中最昂贵的部分。选择相似性得分最高的一对,然后进行对齐。现在,选择与对齐序列集中的一个序列最对齐的序列,并基于该成对对齐将其与对齐集对齐。重复此操作,直到所有序列都已输入

当您将序列与 对齐序列(基于 成对对齐),当插入 序列中已存在的间隔 在该集合中,可以在相同的位置插入间隙 以对齐的方式按所有顺序放置 设定

Lafrasu建议使用SequenceMatcher()算法对UTF-8字符串进行成对对齐。我所描述的内容为您提供了一种相当轻松、相当体面的方式,可以将其扩展到多个序列

如果您感兴趣,这相当于建立一组小的对齐序列,并将它们对齐到它们的最佳对上。它给出了完全相同的结果,但它是一个更简单的实现。

版本7.120+支持多文本对齐。输入类似于拉丁文字,而不是序列,输出与格式对齐。安装后,即可轻松运行:

mafft --text input_text.fa > output_alignment.fa

尽管MAFFT是生物序列比对的成熟工具,但文本比对模式仍处于开发阶段,未来的计划包括允许用户定义评分矩阵。您可以在中查看更多详细信息。

您所说的计算是什么意思?你是想得到一个最好的校准?是的,还是一个相当好的校准(近似值可以)。你也在寻找一个更好的差分工具吗?@Chris_Rands:谢谢!事实上,它是为Debian打包的,并且似乎在一个简单的示例中起作用。但它也有一些缺点:空格被删除(因此需要单独处理),UTF-8不受支持(您需要转换为拉丁语-1,这似乎是实验性的)。谢谢你指出这一点!请毫不犹豫地将其作为答案发布。这似乎很好,除了史密斯·沃特曼只适合两个序列,而我还有更多…@DaveTheScientist你能分享一下剧本吗?@Tashuka老实说,我不知道这一点可能在哪里。如果你用谷歌搜索“smith waterman python”,就会出现大量的点击,其中至少有一个可以通过PIP获得。@DaveTheScientist谢谢,但我只信任你的python代码;)更准确地说:SequenceMatcher()完全符合我的要求,只是我有两个以上的序列,我不知道如何从成对对齐中推断全局对齐。我想我可以编造一些与公共部分相交的肮脏把戏,但如果有针对多序列情况的规则清理算法,我将非常不愿意这样做。你知道SequenceMatcher()之类的东西吗?但对于两个以上的字符串来说?@a3_nm:你是对的,从一组局部成对对齐中找到全局最优对齐是很棘手的。我还在考虑这个问题。你的代码在
print s.ratio()
上给了我错误的语法。我同意这是可行的,但仍然需要做一些工作。有专门的多序列比对算法,在计算生物学中似乎无处不在——必须有某种方法对字符串做同样的事情。(或者如果没有,我想我必须写出来,但这将是非常令人惊讶的…)谢谢你的帮助,如果没有更好的答案,我会将它与lafrasu当前的答案结合起来,以提供一个快速而肮脏的解决方案。再次感谢你的帮助!