一、说明
在生物技术中,需要用到局部序列对齐 (LSA),所以使用 Smith-Waterman 算法在较长的子字符串 a 中找到部分匹配的子字符串 b。同样,在NLP中,也存在串比较问题,比如语音序列。因为这里用 Python 编码的,所以我们确信已经有很多实现可以使用了。我确实找到了一些代码,然而,有些实现是不完整的,这里拿来一个可以跑通的。我没有测试第二个实现,留给读者实现。
因此,我开始了自己实现定位。我想要的是一些易于使用的功能,比如
start, end = smith_waterman(string_a, string_b)
找出某些版本的 string_b(包括间隙和删除)在 string_a 中的开始和结束位置。
1.1 实现评分矩阵(Scoring matrix)
为了找到 b 与 a 的局部对齐,Smith-Waterman 首先计算评分矩阵。以下代码使用线性间隙成本为两个字符串 a 和 b 计算此矩阵。出于性能原因,我选择了 NumP