日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文本比对的一种算法探索、比对算法中的难点及解决方法---学习笔记记录

發(fā)布時間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本比对的一种算法探索、比对算法中的难点及解决方法---学习笔记记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在錄入文本里,有2種字符:“有效字符”和“多打字符”?!坝行ё址笔侵杆跇?biāo)準(zhǔn)文本里可以找到唯一的“對應(yīng)字符”。“對應(yīng)字符”當(dāng)然與它相同,但是,相同的字符不一定就是“對應(yīng)字符”。例如:
? ? 標(biāo)準(zhǔn)文本:我們班里的學(xué)生大多數(shù)是女生。
? ? 錄入文本:我們班里喜歡數(shù)學(xué)的學(xué)生大多數(shù)是女生。
錄入文本的第一個“數(shù)”字,在標(biāo)準(zhǔn)文本里是找不到“對應(yīng)字符”的。
? ? 我的算法思路是這樣的:對于錄入文本里的每一個字符(包括看不見但是占位置的全、半角空格;包括看不見又不占位但長度又不為零的回車),在標(biāo)準(zhǔn)文本里尋找“對應(yīng)字符”。(如何確認(rèn)“對應(yīng)字符”是個難點(diǎn),我在后面會提出解決方法,那其實(shí)是本文的重點(diǎn)。尋找“對應(yīng)字符”首先是尋找“相同字符”,只有“相同字符”才有資格做“對應(yīng)字符”)
? ? 根據(jù)尋找的結(jié)果(有或沒有),自然就解決了“漏”和“多”的問題,既可以得到字符(串)的內(nèi)容,又可以統(tǒng)計(jì)數(shù)字。至于“錯字”,其實(shí)就是“漏”與“多”在對應(yīng)位置所出現(xiàn)的綜合事件,比如把“你說”錯打成了“他說”,漏了“你”;多了“他”。在下面的描述中我會細(xì)說的。
? ? 下面用文字和圖片來描述一次“尋找”的過程。

圖1中n1、n2分別是尋找的第一個字符的位置,內(nèi)容是zn1、zn2 。我稱為“起始字符”。如果相同,那比較簡單。(不是本文的重點(diǎn),后面會提出一個小細(xì)節(jié))。在圖1中兩個字不相同。那么把標(biāo)準(zhǔn)文本里的下一個字符與zn2進(jìn)行比較(標(biāo)準(zhǔn)文本的起始字符仍然記住是zn1)。如果最終找到(z1)。(并確定是“對應(yīng)字符”,下同)。那么從n1(包括zn1)到z1(不包括z1)的字符(串)就是“漏字符(串)”,標(biāo)準(zhǔn)文本下一輪尋找(比對)從z1之后的那個字符開始;錄入文本下一輪尋找從zn2之后的那個字符開始。(即zn2是“有效字符”)。
如果zn2始終沒找到“對應(yīng)字符”(圖2)

,那么zn2就是“多”字符,標(biāo)準(zhǔn)文本下一輪尋找仍然從n1開始;錄入文本下一輪尋找從zn2之后的那個字符開始。(錄入文本始終是一個一個的往后“走”,不管這個字是“有效”還是“多打”)。?? ? 這里說一下“錯字”的問題。在每次發(fā)生“多”結(jié)果時,要有一個變量記錄連續(xù)“多”的累計(jì)字符數(shù)(不是最終評分的累計(jì)數(shù)),一旦發(fā)生了“漏”結(jié)果,就要馬上算出“錯”字符內(nèi)容和個數(shù)(當(dāng)然也可以算出準(zhǔn)確字符的內(nèi)容,調(diào)整“漏”和“多”的內(nèi)容和數(shù)量,包括重新涂顏色)然后把“多”的累計(jì)字符數(shù)清零。這里的細(xì)節(jié)就不多說了。
下面借助幾張截圖來說說怎樣判斷“對應(yīng)字符”。這是本文的重點(diǎn)。

圖3:錄入文本里的加紅圈的字被誤判為“有效字符”;圖4里標(biāo)準(zhǔn)文本里的加紅圈的字被誤判為“對應(yīng)字符”,造成的后果雖然不影響總分,但是看上去別扭且不大合理,本來連續(xù)的漏或錯被分成了2段,中間夾了一個對應(yīng)字符和有效字符。
而圖5

更是誤判了,錄入文本里原本有效的“BCD”成了“多”字符,而標(biāo)準(zhǔn)文本里的“BCD”又成了“漏字符”。真實(shí)情況是“多打”了1個“E”。造成這個結(jié)果,是因?yàn)闃?biāo)準(zhǔn)文本里的那個“E”被誤判成錄入文本第一個“E”字符的“對應(yīng)字符”了。那是我用“人腦”發(fā)現(xiàn)的。怎樣讓程序來判斷呢??我以本文開頭的2行文字為例:圖6

先定義2個12個字符的字符串:在標(biāo)準(zhǔn)文本里的 ?串1=“數(shù)是女生。 ? ?”和錄入文本的 ?串2=“數(shù)學(xué)的學(xué)生大多數(shù)是女生。”(它們的首字符就是被判斷是否“對應(yīng)字符”的字符“數(shù)”)
用一個十多行左右代碼的函數(shù)判斷“有幾個不顛倒、可以有間隔的共同字符”。上面的共同字符數(shù)是5。
下一步,我先把上述標(biāo)準(zhǔn)文本里的“BCD”+“E”表述成“疑漏字符串”,圖6中標(biāo)準(zhǔn)文本里“的學(xué)生大多數(shù)”。把錄入文本在n2后面的區(qū)域表述為“未比對區(qū)域”。
接著,用For 循環(huán)分別把“疑漏字符串”中的每個字符在“未比對區(qū)域”尋找相同的字符,若找到,就用該字符為首字符用標(biāo)準(zhǔn)文本和錄入文本組成2個也是12個字符的字符串3和字符串4(圖6右下方的上下2個)。

然后用同樣的函數(shù)求出它們的共同字符數(shù)。一旦發(fā)生“第2個共同字符數(shù)大于第1個共同字符數(shù)”(圖6這里是10)時,那個疑似“對應(yīng)字符”(數(shù))即被否定。退出For 循環(huán),確認(rèn)標(biāo)準(zhǔn)文本上的這個“數(shù)”字符不是“對應(yīng)字符”而繼續(xù)在標(biāo)準(zhǔn)文本里找,也就是說,這一輪尋找還沒有結(jié)束。這樣就避免了誤判。等到這一輪尋找結(jié)束,確定是“多”還是“漏”,本輪尋找才算結(jié)束,然后更新“起始字符”,進(jìn)入下一輪尋找“對應(yīng)字符”.....。

將這樣的“尋找”在錄入文本里從頭到尾走一遍,就完成了“文本比對”。

如果你對上面的描述已經(jīng)理解的話,你試試在圖1中找出2對(4個)字符串,看會不會發(fā)生“第2個共同...大于...數(shù)”,從而否定“E”(z1)是“對應(yīng)字符”。

前面圖3圖4里的問題,也是用“繼續(xù)找相同字”--“比較2個共同字符數(shù)”的方法(不再贅述),不過尋找的區(qū)域不同,也不用For 循環(huán),因?yàn)橹挥?個要找的字符。前面為什么要for每個字要找,是因?yàn)槟莻€“未比對區(qū)域”有可能恰好漏打了某個字,以致找不到。

總結(jié)

以上是生活随笔為你收集整理的文本比对的一种算法探索、比对算法中的难点及解决方法---学习笔记记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。