<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【GoCN酷Go推薦】 ?文本差異對比工具 go-diff

          共 1941字,需瀏覽 4分鐘

           ·

          2021-05-10 17:14

          簡介

          純文本差異對比在許多場景下都有應(yīng)用,如語音識別技術(shù)對識別率的評估,需要將識別后的文本與預(yù)期文本之間做差異對比計算;又如我們使用 Git 進(jìn)行代碼提交時,通常會使用git diff來查看這次編輯發(fā)生了哪些改動。

          這里我們先簡單定義一下差異 diff:是指目標(biāo)文本和源文本之間的區(qū)別,也就是將源文本變成目標(biāo)文本所需要的操作。

          以上問題的一個通常解決方案是 Eugene W.Myers 在1986年發(fā)表的一篇論文  An O(ND) Difference Algorithm and Its Variations 中提出的 Myers差分算法,該算法是一個能在大部分情況產(chǎn)生「最短的直觀的diff」的算法。

          google/diff-match-patch  項目是Myers差分算法的一種實現(xiàn)。但是該項目缺少 Golang 語言的實現(xiàn)。

          go-diff 則是 google/diff-match-patch  的一個 Golang 版本的補(bǔ)充。

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

          • 比較兩段文本并返回它們的差異
          • 執(zhí)行文本的模糊匹配
          • 生成和應(yīng)用補(bǔ)丁

          go-diff 不僅能夠簡潔地輸出字符串對比結(jié)果,還能夠輸出規(guī)范化的數(shù)據(jù)結(jié)構(gòu)方便我們的二次開發(fā)。

          如何使用

          go-diff 使用方式非常簡單,代碼如下

          const (
           text1 = "gocn vip"
           text2 = "goCN cool"
          )

          func main() {
           dmp := diffmatchpatch.New()

           diffs := dmp.DiffMain(text1, text2, false)
           fmt.Println(diffs)
          }

          執(zhí)行以上代碼,輸出

          [{Equal go} {Insert CN } {Equal c} {Delete n vip} {Insert ool}]

          以上輸出結(jié)果表示從 text1 變成 text2 需要執(zhí)行的步驟:

          • go 不需要變動
          • 插入 CN
          • c 不需要變動
          • 刪除 n vip
          • 插入語 ool

          DiffMain  方法會查找兩段文本的不同,并以數(shù)組形式返回 diff 差異。

          這里的 diff 差異就是從左邊 text1 的字符串變成右邊 text2 的字符串所需要的最少的步驟,每個步驟只能做“保持不變”、“插入”或者“刪除”操作。如果我們需要的是替換操作,那么只能是先“刪除”后“插入”

          工具提供了DiffPrettyTextDiffPrettyHtml 等方法,可以將 diff 數(shù)組轉(zhuǎn)換成更友好的有顏色高亮的文本或HTML格式報告。

          DiffTimeout參數(shù)用以設(shè)置 diff 計算的超時時間,如果超過此時間,則該計算將被截斷,并返回目前為止的最佳解決方案。此時盡管結(jié)果是正確的,但可能并不是最佳方案。該值為 0 時可進(jìn)行無限時的計算。

          總結(jié)

          go-diff 庫實現(xiàn)了高效、完備的文本差異對比算法,在類似需求時,如計算編輯距離、模糊匹配時,不需要我們再去手寫復(fù)雜的算法,非常省心和方便。

          Reference

          git生成diff原理:Myers差分算法 | 大藝術(shù)家_SN (chenshinan.github.io)

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


          還想了解更多嗎?

          更多請查看:https://github.com/sergi/go-diff   

          歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/


          《酷Go推薦》招募:


          各位Gopher同學(xué),最近我們社區(qū)打算推出一個類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個庫或者好的項目,然后寫一點(diǎn)這個庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到新的庫,并且知道怎么用。


          大概規(guī)則和每日新聞類似,如果報名人多的話每個人一個月輪到一次,歡迎大家報名!(報名地址:https://wj.qq.com/s2/7734329/3f51)


          掃碼也可以加入 GoCN 的大家族喲~

          瀏覽 138
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99久视频 | 欧美亲子乱婬性XXX | 日本不卡视屏 | 青草青青青在线免费观看视频 | 国产午夜福利精品爽爽爽 |