C#,深度好文,精致好码,文本对比(Text Compare)算法与源代码

Vladimir I. Levenshtein

一、文本对比的列文斯坦距离(编辑距离)算法

在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。
文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。目前,主流的比较文本之间的差异主要有两大类。一类是基于编辑距离(Edit Distance)的,例如LD算法。一类是基于最长公共子串的(Longest Common Subsequence),例如Needleman/Wunsch算法等。


列文斯基距离(LD,Levenshtein Distance)又成为编辑距离算法(Edit Distance)。他是以字符串A通过插入字符、删除字符、替换字符变成另一个字符串B,那么操作的过程的次数表示两个字符串的差异。

文件1里面是需要比较的内容,文件2是被比较的文本,现在需要找到在文件1中每一行的文本在文件2中是否存在并相等,如果相等,就在一份结果文件中输出,文件1的哪一行与文件2的哪一行相同,反之不相同就输出文件1的哪一行不相同货不存在。


可以对两段文本进行对比,检测/比较两个文本有什么不同的差异,以便修改,常用于程序代码,就是不需要人工查看,尤其是大文件,有几百上千行的代码,这时候就建议使用比较工具了,不用浪费过多时间去寻找。


为了判断文本文件的内容是否发生变化,确定变化的内容,并尽量降低系统开销,提出了一种基于位置的文本文件比较算法。算法利用位置优先原则,简化了比较过程。实验结果表明该算法可以应用于文件监控,而且易于理解。


二、相似度计算

在自然语言处理任务中,我们经常需要判断两篇文档是否相似、计算两篇文档的相似程度。比如,基于聚类算法发现微博热点话题时,我们需要度量各篇文本的内容相似度,然后让内容足够相似的微博聚成一个簇;在问答系统中,我们会准备一些经典问题和对应的答案,当用户的问题和经典问题很相似时,系统直接返回准备好的答案;在监控新闻稿件在互联网中的传播情况时,我们可以把所有和原创稿件相似的文章,都看作转发,进而刻画原创稿件的传播范围;在对语料进行预处理时,我们需要基于文本的相似度,把重复的文本给挑出来并删掉……总之,文本相似度是一种非常有用的工具,可以帮助我们解决很多问题。

三、尼德曼-翁施算法(Needleman-Wunsch Algorithm)

尼德曼-翁施算法(Needleman-Wunsch Algorithm)是基于生物信息学的知识来匹配蛋白序列或者DNA序列的算法。这是将动态算法应用于生物序列的比较的最早期的几个实例之一。该算法是由 Saul B. Needlman和 Christian D. Wunsch 两位科学家于1970年发明的。本算法高效地解决了如何将一个庞大的数学问题分解为一系列小问题,并且从一系列小问题的解决方法重建大问题的解决方法的过程。该算法也被称为优化匹配算法和整体序列比较法。Needleman-Wunsch 算法仍然被广泛应用于优化整体序列比较中。

蛋白序列?DNA序列?没错,此算法同样用于文本对比。

 Saul B. Needlman

 

 Christian D. Wunsch

四、 史密斯-沃特曼算法(Smith-Waterman algorithm)

史密斯-沃特曼算法(Smith-Waterman algorithm)是一种进行局部序列比对(相对于全局比对)的算法,用于找出两个核苷酸序列或蛋白质序列之间的相似区域。该算法的目的不是进行全序列的比对,而是找出两个序列中具有高相似度的片段。
该算法由坦普尔·史密斯(Temple F. Smith)和迈克尔·沃特曼(Michael S. Waterman)于1981年提出。史密斯-沃特曼算法是尼德曼-翁施算法的一个变体,二者都是动态规划算法。这一算法的优势在于可以在给定的打分方法下找出两个序列的最优的局部比对(打分方法使用了置换矩阵和空位罚分)。该算法和尼德曼-翁施算法的主要区别在于该算法不存在负分(负分被替换为零),因此局部比对成为可能。回溯从分数最高的矩阵元素开始,直到遇到分数为零的元素停止。分数最高的局部比对结果在此过程中产生。在实际运用中,人们通常使用该算法的优化版本。

蛋白序列?核苷酸序列?没错,此算法也同样用于文本对比。

 Temple F. Smith

Michael S. Waterman 

五、 BWT(Burrows-Wheeler Transform 算法)

Burrows-Wheeler 算法,被广泛应用于数据压缩技术中,也可称作块排序压缩,简称 BWT. 1994 年,在加利福尼亚州帕洛阿尔托的 DEC 系统研究中心,Michael Burrows 和 David Wheeler 发明了该算法,故称之为Burrows-Wheeler算法。

压缩算法?没错,可用于文本比较!!!!

 Michael Burrows

 David Wheeler

 六、BLAST生物信息学算法

BLAST是一个被广泛使用于分析生物资讯的程式,因为它可以兼顾我们在做搜寻时的速度以及搜寻结果的精确度。因为当我们所要搜寻的目标数据库非常庞大的时候,速度就变成一项很需要考量的因素。在像BLAST和FASTA这些快速算法被开发之前,我们是使用动态规划算法来作数据库的序列搜寻,这真的非常的耗时。BLAST使用启发式搜索来找出相关的序列,在速度上比完全只使用动态规划大约快上50倍左右,不过它不像动态规划能够保证搜寻到的序列(Database sequence)和所要找的序列(Query sequence)之间的相关性,BLAST的工作就是尽可能找出数据库中和所要查询的序列相关的资讯而已,精确度稍微低一点。此外,BLAST比FASTA更快速,因为BLAST只对比较少出现或是较重要的一些关键字作更进一步的分析,而FASTA是考虑所有共同出现在所要搜寻的序列和目标序列的字。从下面介绍的算法可以更进一步的了解。


BLAST可以让研究者在其中寻找与其感兴趣的序列相同或类似的序列。 例如如果某种非人动物的一个以前未知的基因被发现,研究者一般会在人类基因组中做一个BLAST搜索来确认人类是否包含类似的基因(通过序列的相似性)。BLAST算法以及实现它的程序由美国国家生物技术信息中心(NCBI)的Eugene Myers、Stephen Altschul、Warren Gish、David

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 04:18:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 04:18:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 04:18:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 04:18:01       18 阅读

热门阅读

  1. 蓝桥杯2023年-松散子序列(dp)

    2024-03-17 04:18:01       19 阅读
  2. 【Docker】APISIX Ingress Controller部署

    2024-03-17 04:18:01       18 阅读
  3. 利用matlab处理netcdf文件中time变量的格式转换问题

    2024-03-17 04:18:01       21 阅读
  4. python-0009-django对数据的增删改

    2024-03-17 04:18:01       18 阅读
  5. 突破编程_C++_查找算法(插值查找)

    2024-03-17 04:18:01       25 阅读
  6. 稳定币套利案例解析一 两个疑点

    2024-03-17 04:18:01       20 阅读
  7. 【Python学习笔记】Python近期总结

    2024-03-17 04:18:01       20 阅读
  8. 24计算机考研调剂 | 哈尔滨理工大学

    2024-03-17 04:18:01       22 阅读