編輯距離用來衡量兩個串的相似度
編輯距離就是用最少的編輯操作將乙個詞變為另乙個詞,操作有三種
插入刪除
替換如何計算最短編輯距離? 採用動態規劃
字串x長度為n
字串y長度為m
定義d(i,j)表示x[1,i]和y[1,j]的最短編輯距離,則d(n,m)表示x和y的最短編輯距離,注意這裡的字串 下標是從1開始的,而陣列d的下標是從0開始的
比如 d(0,1)表示x不取,y取第乙個字元 這兩個字串的聚類,顯然是1,即刪除y的第乙個字元即可
初始化d(i,0)=i
d(j,0)=j
先計算i,j較小的情況下的d(i,j),然後再 利用已經計算出來的結果來計算i,j較大的情況下的d(i,j)
x(1...i)和y(1...j)的編輯距離,要麼是 已知x(1....i-1)和y(1,j)的編輯距離的基礎上,在x(1....i-1)的末尾進行增加操作
或者 在已知x(1....i)和y(1....j-1)的編輯距離的基礎上,在y(1....j-1)的末尾進行增加操作
或者 在已知x(1....i-1)和y(1,j-1)的編輯距離的基礎上,將x的第i個字元和y的第j個字元進行替換操作,當然,如果相同的話就不需要替換了
用公式表達出來就是
進行迭代,知道i=m,j=n為止
上面的公式裡面,增加,刪除,的代價設的是1,替換的代價是2
計算出編輯距離了還不夠,很多時候我們需要知道兩個字串如何對上(alignment),使用回溯即可
時間複雜度
o(nm) 因為要把d矩陣每個元素都算一遍
空間複雜度
o(nm)
編輯距離可以帶權,為何要加權?
比如:拼寫檢查裡,某些字元錯寫成某些字元的可能性更大。比如 e 很可能被錯寫成a , o很可能被錯寫成e. 而a和b就不太容易互相寫錯
生物學裡,某個基因片段被新增或刪除的可能性比其它的片段更大
考慮到權的編輯距離的遞推式與普通的基本相同
在初始化的時候
d(0,0) = 0
d(0,i) = d(0,i-1)+insert(y(i)) . x 乙個都不取,y取前i個字元
d(i,0) = d(i-1,0)+delete(x(i)) . x取前i個字元,y乙個都不取
注意這裡的insert和delete 都是對字串x進行的操作
遞推公式
編輯距離的各種變形
1 覆蓋度檢測,字串首位的差異不考慮
初始的時候不考慮插入刪除成本,中間過程跟前面一樣,結束條件就是某乙個串到達結尾了
2 區域性對比問題
對於兩個串
x = x1,x2 .......xm
y=y1,y2......ym
找出它們中相似度最高的字串x' y'
例子
standford NLP課程筆記一 正規表示式
課程位址 裡面的字元表示每個都可以,比如 ww oodchuck 可以表示woodchuck和woodchuck 1234567890 表示任何單個數字 表示範圍的 a z 表示所有大寫字母 a z 表示所有小寫字母 0 9 表示所有單個數字 表示否定的 a z 不要大寫的字母 a z 不要小寫的字...
Coursera Scala課程 第二週筆記
higher order functions 這被稱為 高階函式 既可以當引數傳,也可以當返回值。最早的形式 def sum f int int,a int,b int int if a b 0 else f a sum f,a 1,b def sumints a int,b int sum id,...
Boolan C 課程第一周筆記
第一周 20170407 類 帶指標 1 不帶指標 object based 基於物件 單一物件 object oriented 物件導向 多個有關聯的物件 語言學習 語言 標準庫 標頭檔案寫法 防衛式宣告 ifndef complex define complex 前置宣告 類的宣告 類的定義 e...