學分貴學分貴,學了就要會!!!
廢話不多說,下面將對一些常見的基於文字的相似性演算法做一下總結,一些很經典的演算法這裡會給出來實現。
neighbourhood search
n-gram distance
edit distance
接下來主要對這些演算法的原理做乙個介紹,然後給出相應的演算法。接下來主要對這些演算法的原理做乙個介紹,然後給出相應的演算法。接下來主要對這些演算法的原理做乙個介紹,然後給出相應的演算法。接下來主要對這些演算法的原理做乙個介紹,然後給出相應的演算法。
該演算法目的是找出目標字串的鄰居, 如目標單詞」god「, 那麼「good」, 「gold」都是其距離為1的鄰居。該演算法主要分為以下三步:
1.根據目標單詞生成乙個集合,該集合中的單詞由目標單詞最多進行k次變化生成;
2.在詞典中遍歷檢驗集合中的單詞是否存在;
3.如果存在就返回。
該演算法比較簡單,雖然看起來需要生成多個單詞並且並遍歷但其實在實際應用中效率並不低下。
該演算法把需要進行比較的物件擷取為長度為n的子串集合,然後看兩個集合有多少個不重合的子串。以 "cart"和"crat"的 2-gram distance為例:
cart =
crat =
∣g1
(car
t)∣+
∣g2(
crat
)∣−2
×∣∣g
1(ca
rt)∣
∩∣g2
(cra
t)∣=
5+5−
2×3=
4|g_1(cart)| + |g_2(crat)| - 2\times||g_1(cart)| \cap |g_2(crat)|= 5 + 5 - 2\times3 = 4
∣g1(c
art)
∣+∣g
2(c
rat)
∣−2×
∣∣g1
(ca
rt)∣
∩∣g2
(cr
at)∣
=5+5
−2×3
=4edit distance 分為兩種,一種是global edit distance, 另一種是local edit distance。當把乙個單詞轉化為乙個目標單詞的時候通常需要進行插入、刪除、替換、匹配等操作, 這些操作具有權重, 最後的最佳匹配應該是字典中具備最佳分數的單詞。這個演算法的實現是動態規劃演算法。具體演算法如下:
lf =
strlen
(f); lt =
strlen
(t);a[0
][0]
=0;for
(j=1
; j<=lt; j++
) a[j][0
]= j * i;
for(k=
1; k<=lf; k++
) a[0]
[k]= k * d;
for(j=
1; j<=lt; j++
)for
(k=1
; k<=lf; k++
) a[j]
[k]=
max3
(//or min3 if ma[j]
[k-1
]+ d,
//deletion
a[j-1]
[k]+ i,
//insertion
a[j-1]
[k-1]+
equal
(f[k-1]
,t[j-1]
));//replace or match
//equal() returns m if characters match, r otherwise
//final score is at a[lt][lf]
local edit distance 和global edit distance 的區別在於前者關注點在於最長匹配, 具體實現如下:
//final score is greatest value in the entire table //(or least value, if m < i,d,r)
lf =
strlen
(f); lt =
strlen
(t);a[0
][0]
=0;for
(j=1
; j<=lt; j++
) a[j][0
]=0;
for(k=
1; k<=lf; k++
) a[0]
[k]=0;
for(j=
1; j<=lt; j++
)for
(k=1
; k<=lf; k++
) a[j]
[k]=
max4
(//or min4 if m0
, a[j]
[k-1
]+ d,
//deletion
a[j-1]
[k]+ i,
//insertion
a[j-1]
[k-1]+
equal
(f[k-1]
,t[j-1]
));//replace or match
可以發現這兩個演算法空間開銷比較大, 下面的演算法是對global edit distance 的優化, 由於我們只關注最後乙個值然後每個值的獲得只需要一句前一列和上一行對應位置的值,因此我們只需要乙個陣列儲存前一列另乙個陣列儲存上一行的值。
//params儲存的是不同操作的權重值,插入、刪除、替換、匹配
public
intlevenshteindistance
(string srow, string scol,
int[
]params)
//動態規劃比較
for(colidx=
1; colidx<= clen; colidx++
)for
(int i=
0; i<=rlen; i++
) v0[i]
= v1[i];}
return v1[rlen]
;}
python 字串的搜尋匹配與替換(詳細)
需求 單次匹配字串 需求 全文搜尋替換字串 需求 全文搜尋匹配字串 需求 以匹配的字元分割字串 有誤請指出,正在改動中 python 裡的引數用flag表示正則修飾符的引數。使用多個修飾符設定正規表示式的匹配模式 re.i re.m。修飾符描述 re.i使匹配對大小寫不敏感 re.l 做本地化識別 ...
fft 與字串匹配
規定模式串為 s t 且 s ge t 定義匹配函式 p s,t s t 2 那麼對於 displaystyle h r sum p s t i 若 h r 為 0 則在 r 位置完全匹配。嘗試展開 h begin h r sum p s t i sum p s t i sum s 2 2s t i...
字串匹配 暴力搜尋演算法
主要特徵 1 沒有預處理階段 2 需要常量額外空間 3 通常需要模式串視窗向右移動乙個位置 4 可以按照任意順序進行比較 5 搜尋的時間複雜度為 o mn 6 文字字元期望比較次數 2n演算法描述 暴力搜尋演算法由文字串中從0到 n m所有位置的比較組成,無論是否從模式串的起始位置開始,每次匹配過後...