NGram近似字串匹配

2021-10-07 23:29:40 字數 2235 閱讀 5757

介紹ngram是來自給定序列的n個單位的子串行。 這些單位可以是單詞,字元等。例如,短語「 hello world」的2-gram或bigram是「 he」,「 el」,「 ll」,「 lo」,「 o」,「 w」,「 wo」,「 or」,「 rl」和「 ld」。

用途ngram建模通常用於對自然語言進行建模。 它還可用於**序列中的下乙個專案。 ie,給定具有發生頻率的ngram模型,您可以**序列中的下乙個專案。

它也用於近似字串匹配。 基於這樣的觀察,任何兩個相似的字串都可能共享許多相同的ngram。 因此,它也可用於檢測竊。 使用ngram技術的好處之一是索引ngram的能力,因為可以預先計算字串的ngram。 這與諸如levenshtein之類的編輯距離演算法相反,在該演算法中,要比較的字串和要與之比較的字串是輸入的一部分。 索引ngram的能力可導致更快的搜尋,但會導致非常大的索引。

下面的**是為vbscript編寫的,但應直接移植到vba。

createngram函式將字串和整數作為輸入。 整數定義了您想要用於建立子串行的n-gram的大小。 它輸出乙個二維陣列。 第一項是ngram,第二項是它發生的頻率。

comparengram函式採用兩個ngram陣列,並輸出乙個表示兩個陣列相似度的double。 返回的數字是兩個陣列的dice係數。 係數越高,兩個字串越相似。

function createngram(strinput, intn)

dim arrngram, intbound, i, j, strgram, didinc, arrtemp

if len(strinput) = 0 then exit function

redim arrngram(len(strinput) + 1, 1)

strinput = chr(0) & ucase(trim(strinput)) & chr(0)

intbound = -1

for i = 1 to len(strinput)-intn+1

strgram = mid(strinput, i, intn)

didinc = false

for j = 0 to intbound

if strgram = arrngram(j, 0) then

arrngram(j, 1) = arrngram(j, 1) + 1

didinc = true

exit for

end if

next

if not didinc then

intbound = intbound + 1

arrngram(intbound, 0) = strgram

arrngram(intbound, 1) = 1

end if

next

redim arrtemp(intbound, 1)

for i = 0 to intbound

arrtemp(i, 0) = arrngram(i, 0)

arrtemp(i, 1) = arrngram(i, 1)

next

createngram = arrtemp

end function

function comparengram(arr1, arr2)

dim i, j, intmatches, intcount1, intcount2

intmatches = 0

intcount1 = 0

for i = 0 to ubound(arr1)

intcount1 = intcount1 + arr1(i, 1)

intcount2 = 0

for j = 0 to ubound(arr2)

intcount2 = intcount2 + arr2(j, 1)

if arr1(i, 0) = arr2(j, 0) then

if arr1(i, 1) >= arr2(j, 1) then

intmatches = intmatches + arr2(j, 1)

else

intmatches = intmatches + arr1(i, 1)

end if

end if

next

next

comparengram = 2 * intmatches / (intcount1 + intcount2)

end function

演算法 字串匹配 BF KMP 近似匹配

include includeusing namespace std define maxstr 100 bf 時間o n m int stringmatch bf char str,char pat o m n m str n pat else if pat j 0 找到匹配位置 return i...

字串近似搜尋

net.newlife。需求 假設在某系統儲存了許多位址,例如 北京市海淀區中關村大街1號海龍大廈 使用者輸入 北京 海龍大廈 即可查詢到這條結果。另外還需要有容錯設計,例如輸入 廣西 京島風景區 能夠搜尋到 廣西壯族自治區京島風景名勝區 最終的需求是 可以根據使用者輸入,匹配若干條近似結果共使用者...

字串匹配

題目描述 讀入資料string 然後讀入乙個短字串。要求查詢string 中和短字串的所有匹配,輸出行號 匹配字串。匹配時不區分大小寫,並且可以有乙個用中括號表示的模式匹配。如 aa 123 bb 就是說aa1bb aa2bb aa3bb都算匹配。輸入 輸入有多組資料。每組資料第一行輸入n 1 n ...