700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【GoCN酷Go推荐】 ​文本差异对比工具 go-diff

【GoCN酷Go推荐】 ​文本差异对比工具 go-diff

时间:2021-12-22 02:33:48

相关推荐

【GoCN酷Go推荐】 ​文本差异对比工具 go-diff

简介

纯文本差异对比在许多场景下都有应用,如语音识别技术对识别率的评估,需要将识别后的文本与预期文本之间做差异对比计算;又如我们使用 Git 进行代码提交时,通常会使用git diff来查看这次编辑发生了哪些改动。

这里我们先简单定义一下差异 diff:是指目标文本和源文本之间的区别,也就是将源文本变成目标文本所需要的操作。

以上问题的一个通常解决方案是 Eugene W.Myers 在1986年发表的一篇论文 An O(ND) Difference Algorithm and Its Variations 中提出的Myers差分算法,该算法是一个能在大部分情况产生「最短的直观的diff」的算法。

google/diff-match-patch 项目是Myers差分算法的一种实现。但是该项目缺少 Golang 语言的实现。

go-diff 则是 google/diff-match-patch 的一个 Golang 版本的补充。

go-diff 主要提供三个功能:

比较两段文本并返回它们的差异

执行文本的模糊匹配

生成和应用补丁

go-diff 不仅能够简洁地输出字符串对比结果,还能够输出规范化的数据结构方便我们的二次开发。

如何使用

go-diff 使用方式非常简单,代码如下

const(text1="gocnvip"text2="goCNcool")funcmain(){dmp:=diffmatchpatch.New()diffs:=dmp.DiffMain(text1,text2,false)fmt.Println(diffs)}

执行以上代码,输出

[{Equalgo}{InsertCN}{Equalc}{Deletenvip}{Insertool}]

以上输出结果表示从 text1 变成 text2 需要执行的步骤:

go不需要变动

插入CN

c不需要变动

删除n vip

插入语ool

DiffMain方法会查找两段文本的不同,并以数组形式返回 diff 差异。

这里的 diff 差异就是从左边 text1 的字符串变成右边 text2 的字符串所需要的最少的步骤,每个步骤只能做“保持不变”、“插入”或者“删除”操作。如果我们需要的是替换操作,那么只能是先“删除”后“插入”

工具提供了DiffPrettyTextDiffPrettyHtml等方法,可以将 diff 数组转换成更友好的有颜色高亮的文本或HTML格式报告。

DiffTimeout参数用以设置 diff 计算的超时时间,如果超过此时间,则该计算将被截断,并返回目前为止的最佳解决方案。此时尽管结果是正确的,但可能并不是最佳方案。该值为 0 时可进行无限时的计算。

总结

go-diff 库实现了高效、完备的文本差异对比算法,在类似需求时,如计算编辑距离、模糊匹配时,不需要我们再去手写复杂的算法,非常省心和方便。

Reference

git生成diff原理:Myers差分算法 | 大艺术家_SN (chenshinan.github.io)

Git 是怎样生成 diff 的:Myers 算法 - CJ Ting's Blog

还想了解更多吗?

更多请查看:/sergi/go-diff

欢迎加入我们GOLANG中国社区:https://gocn.vip/

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:/s2/7734329/3f51)

扫码也可以加入 GoCN 的大家族哟~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。