文字差異對比工具 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 = "gocn vip"
text2 = "goCN cool"
)
func main() {
dmp := diffmatchpatch.New()
diffs := dmp.DiffMain(text1, text2, false)
fmt.Println(diffs)
}
執行以上程式碼,輸出
[{Equal go} {Insert CN } {Equal c} {Delete n vip} {Insert ool}]
以上輸出結果表示從 text1 變成 text2 需要執行的步驟:
-
go
不需要變動 - 插入
CN
-
c
不需要變動 - 刪除
n vip
- 插入語
ool
DiffMain
方法會查詢兩段文字的不同,並以陣列形式返回 diff 差異。
這裡的 diff 差異就是從左邊 text1 的字串變成右邊 text2 的字串所需要的最少的步驟,每個步驟只能做 “保持不變”、“插入” 或者 “刪除” 操作。如果我們需要的是替換操作,那麼只能是先 “刪除” 後 “插入”
工具提供了DiffPrettyText
和DiffPrettyHtml
等方法,可以將 diff 陣列轉換成更友好的有顏色高亮的文字或 HTML 格式報告。
DiffTimeout
引數用以設定 diff 計算的超時時間,如果超過此時間,則該計算將被截斷,並返回目前為止的最佳解決方案。 此時儘管結果是正確的,但可能並不是最佳方案。 該值為 0 時可進行無限時的計算。
總結
go-diff 庫實現了高效、完備的文字差異對比演算法,在類似需求時,如計算編輯距離、模糊匹配時,不需要我們再去手寫複雜的演算法,非常省心和方便。
Reference
git 生成 diff 原理:Myers 差分演算法 | 大藝術家_SN (chenshinan.github.io)
Git 是怎樣生成 diff 的:Myers 演算法 - CJ Ting's Blog
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 文字內容差異對比
- vue-codemirror 實現文字差異比對Vue
- list對比差異
- Mac 上超好用的程式碼對比工具 beyond compare,對比json差異MacJSON
- 中美慈善基金會差異對比
- 【Python】Python 對比 C語言的差異PythonC語言
- Git比對檔案之間的差異Git
- openGauss資料與PostgreSQL的差異對比SQL
- java 如何從零實現一個資料庫差異對比工具?Java資料庫
- 線上json差異比較工具--遞迴比較兩個json的節點和值的差異,並支援差異數預覽和逐個檢視差異JSON遞迴
- git 本地對比2次commit直接的差異GitMIT
- Python內建庫實現文字比較並返回差異位置座標Python
- 前端與後端開發中技術差異的全面對比前端後端
- IDEA如何對比不同分支某個檔案的差異Idea
- ISO27001:2013和ISO27001:2005的差異對比
- MappedByteBuffer VS FileChannel:從核心層面對比兩者的效能差異APP
- 通過 PHP 與 Python 程式碼對比淺析語法差異PHPPython
- 通過PHP與Python程式碼對比淺析語法差異PHPPython
- Python自動化:智慧對比Word文件,秒速鎖定差異!Python
- pandas比較兩個文件的差異
- Javers 比較兩個類的差異
- HHDESK文字對比功能
- 不吹不黑比對下React與Vue的差異與優劣ReactVue
- 【射擊遊戲】TPS對比FPS戰鬥設計差異與心得遊戲
- Golang 針對 MySQL 資料庫表結構的差異 SQL 工具GolangMySql資料庫
- SAP Spartacus B2B OrgUnit 和 OrgUser 的路由對映差異比較路由
- 是否應該升級到ChatGPT 4.0?深度對比ChatGPT 3.5與4.0的差異ChatGPT
- 精準測試:基於 asm+javaparser 呼叫鏈差異化對比實踐ASMJava
- 差異巨大 6款通用工業級ARM處理器效能測試對比
- 使用Visual Studio進行檔案差異比較
- 集合差異比較演算法及效能測試演算法
- 在Linux中,如何比較兩個檔案差異?Linux
- java比較mysql兩個資料庫中差異JavaMySql資料庫
- 效能測試常用工具對比:Jmeter與LoadRunner的異同JMeter
- Linux系統下祼機安裝mysql8.0和docker mysql 8.0 效能差異對比~LinuxMySqlDocker
- Terraform與其他工具對比ORM
- 前端構建工具對比前端
- 通過差異化對比學習法,帶你回顧Vue2快速掌握Vue3Vue