字串匹配之三 拼寫錯誤檢查程式

2021-06-26 09:49:10 字數 1619 閱讀 8418

dna的匹配畢竟離生活還是遠了點,既然是字串匹配,可不可以做個拼寫錯誤檢查呢?

dist = len(x) + len(y) - score(x, y)

score指的是全域性匹配返回的分數。但是scoring_matrix怎麼辦呢?我找了一些我自己可以數得出來編輯距離的字串,然後把一些可能的值乙個乙個去算。這裡提到的scoring_matrix的引數有三個:diag_score(字元相同), off_diag_score(兩個字元,但是不同), dash_score(乙個字元,乙個 '-' )。然後發現了這三個值分別是:

diag_score: 2

off_diag_score: 1

dash_score: 0

這裡注意的是,別選擇過於複雜的字串,那樣的話編輯距離很容易數錯,比如"abcdged"與"acdad",我們僅僅靠自己匹配,很難找出最佳的匹配。

在源**中也有乙個word_list.txt,裡面存放了7萬多個單詞。這樣我們就可以從中與給定字串相差固定編輯距離的單詞了。

def check_spelling(checked_word, dist, word_list):

alphabet = set('qwertyuiopasdfghjklzxcvbnm')

scoring_matrix = scoring_matrix = build_scoring_matrix(alphabet=alphabet, diag_score=2, off_diag_score=1, dash_score=0)

answer = set()

for word in word_list:

edit_distance = get_edit_distance(checked_word, word, scoring_matrix)

if edit_distance <= dist:

answer.add(word)

return answer

其中get_edit_distance其實就是按照前面給出的公式計算出編輯距離的函式。我稍微測試了一下,尋找編輯距離為1的相似單詞,十幾秒就可以完成(可能是我的電腦的配置較高的緣故)。但是拼寫檢查還是追求的實時性,我一旦寫錯了乙個單詞,按下空格的時候,就應該有提示。十幾秒不是可以接受的。

————————番外————————

這裡測試了一下set和list的迭代效率,發現list的迭代效率高於set,而查詢乙個元素是否在物件內,set的效率遠超list,而且set佔據的記憶體相對list要下

————————番外結束——————

當使用者輸入乙個單詞,我們首先可以查詢單詞是否在正確拼寫的單詞集合內(查詢乙個物件是否在乙個集合的效率是很高的)。如果不在,就打上波浪線,然後就可以進入查詢dist為1或者2的單詞集合了。

我突然想到word早期版本的拼寫錯誤檢查,打波浪線很快,但是進行拼寫錯誤檢查的時候要等半天,是否就是採用這樣的辦法?

然後進入查詢程式之後,進行匹配之前,可以先檢查單詞的長度,如果長度相差多於給定的dist,那麼就不用進入匹配了,直接拋棄即可。效率應該又可以提高一些。

一口氣寫完了字串匹配的三篇文章,真是神清氣爽,而文章的抄襲檢查也是呼之欲出了。因為最近要找工作,第四篇可能會稍微晚一點,敬請期待吧。

源**:github

字串面試題系列之三 左旋轉字串

在這裡說明一下,本系列文章所提供的演算法均在federa 8 系統上編譯通過並且編譯通過。如果有問題或者紕漏或者有好的建議更或者有更好的演算法,請不吝賜教。言歸正傳,這是字串的第三個演算法叫左旋字串。左旋字串,咋一看也許不 太明白是什麼意思。其實有點類似於迴圈左移的概念。字串的第乙個字元移動到字串末...

KMP字串模式匹配詳解 三

四.求串t的模式值next n 的函式 說了這麼多,是不是覺得求串 t的模式值 next n 很複雜呢?要叫我寫個函式出來,目前來說,我寧願去登天。好在有現成的函式,當初發明 kmp演算法,寫出這個函式的先輩,令我佩服得六體投地。我等後生小子,理解起來,都要反覆琢磨。下面是這個函式 void get...

逆置字串之三步翻轉

對於逆置字串這個問題,想必大家都覺得很簡單,設定兩個下標指向字串頭尾,交換下標指向位置內容,左下標加,右下標減,直到下標相交。實現 也很簡單,不超過15行。void reverse char left,char right 那麼看看這個類似的問題 將 you love i 變為 i love you...