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

Posted

技术标签:

【中文标题】如何计算文本字符串的多序列对齐【英文标题】:How to compute multiple sequence alignment for text strings 【发布时间】:2011-08-14 09:44:49 【问题描述】:

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

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

谢谢!

【问题讨论】:

计算是什么意思?您是否正在尝试获得最佳对齐方式? 是的,或者相当好的对齐方式(近似值还可以)。 您也在寻找更好的差异工具吗? @Chris_Rands:谢谢!事实上,它是为 Debian 打包的,并且似乎可以用于一个简单的示例。但它有一些缺点:空格被删除(因此它们需要单独处理),并且不支持 UTF-8(您需要转换为 Latin-1,这似乎是实验性的)。感谢您指出了这一点!请不要犹豫,将其发布为答案。 您找到解决方案了吗?如果你这样做了 - 请发布你的代码:) 【参考方案1】: 比对多个序列的最简单方法是进行多次成对比对。

首先获取每对的成对相似度分数并存储这些分数。这是该过程中最昂贵的部分。选择具有最佳相似度分数的对并进行对齐。现在选择与对齐序列集中的一个序列对齐最好的序列,并根据该成对对齐将其对齐到对齐集。重复直到所有序列都在。

当您将序列对齐到 对齐的序列,(基于 成对对齐),当您插入一个 已经存在的序列中的间隙 集合,你在相同的地方插入间隙 放置在对齐的所有序列中 设置。

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

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

【讨论】:

我同意这是可行的,但仍有一些工作要做。 有用于多序列比对的专用算法,这在计算生物学中似乎无处不在——必须 有某种方法可以对字符串做同样的事情。 (或者如果没有,我想我将不得不写它,但这会非常令人惊讶......)无论如何感谢您的有用答案,我会将它与 lafrasu 当前的答案结合起来,以获得快速而肮脏的解决方案如果没有更好的表现。 你有这样的代码吗?【参考方案2】:

您是否正在寻找快速而肮脏的东西,如下所示?

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()

【讨论】:

更准确地说:SequenceMatcher() 完全符合我的要求,除了我有两个以上的序列,而且我不知道如何从成对对齐中推断出全局对齐。我想我可以制作一些与公共部分相交的肮脏技巧,但如果有针对多序列情况的常规干净算法,我将非常不愿意做类似的事情。你知道类似 SequenceMatcher() 的东西,但是对于两个以上的字符串? @a3_nm:你是对的,从 local 成对对齐的集合中找到 globally 最佳对齐是很棘手的。我还在考虑这个。 你的代码在print s.ratio()上给了我错误的语法【参考方案3】:

MAFFT 7.120+ 版支持多文本对齐。输入类似于FASTA format,但使用 LATIN1 文本而不是序列,并且输出是对齐的 FASTA 格式。安装好后,就很容易运行了:

mafft --text input_text.fa > output_alignment.fa

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

【讨论】:

再次感谢您的帮助!【参考方案4】:

我最近编写了一个运行 Smith-Waterman 算法(用于为 DNA 或蛋白质序列生成间隙局部序列比对)的 Python 脚本。它几乎肯定不是最快的实现,因为我根本没有优化它的速度(目前不是我的瓶颈),但它可以工作并且不关心字符串中每个字符的身份。如果您需要的话,我可以将其发布在这里或通过电子邮件将文件发送给您。

【讨论】:

这似乎很好,除了 Smith-Waterman 只适用于两个序列,而我有更多...... @DaveTheScientist 你能分享脚本吗? @tashuhka 老实说现在不知道那可能在哪里。如果你用谷歌搜索“smith-waterman python”,就会出现大量点击,其中至少有一个可以通过 PIP 获得。 @DaveTheScientist 谢谢,但我只相信你的 Python 代码 ;)

以上是关于如何计算文本字符串的多序列对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本与 phpstorm 或 webstorm 中的特定字符对齐?

如何将图像垂直对齐到某些文本第一行的中心?

如何在颤动中显示文本以使 RTL 语言右对齐而 LTR 左对齐?

为啥文本元素居中以及如何在 Dart 中将其与右侧对齐

17如何对字符串进行左, 右, 居中对齐 18如何去掉字符串中不需要的字符 19如何读写文本文件 20如何处理二进制文件 21如何设置文件的缓冲

python文本 字符串对齐