字串模糊搜尋 通過計算萊文斯坦距離實現

2022-07-22 00:42:22 字數 1477 閱讀 2558

維基百科參考:萊文斯坦距離

# @file    : main.py

import levenshtein

import englishwords

lis = englishwords.lis

def fuzzysearch(str_, lis_):

lis = [levenshtein.distance(str_, i) for i in lis_]

# 分別計算萊文斯坦距離(levenshtein)

return lis_[lis.index(min(lis))]

# 返回列表中萊文斯距離的最小值的字串

print(fuzzysearch('directy', lis))

print(fuzzysearch('dieooooooocty', lis))

# 輸出:

# directly

# discomfort

# *****==

除上面外我還想到了其他兩點:

在你給定字串str後一般你想要的結果r_str應該有一定的長度限制,如

|len(r_str)-len(str)|

計算的萊文斯距離也應該存在乙個上限,如levenshtein.distance(str_, i)<=len(str)*25%

於是有下面改進的**:

返回列表中萊文斯距離的最小,且長度相對差最小的項的集合

import levenshtein

import englishwords

lis = englishwords.lis

infinity = float("inf")

def same_value(value_, lis_1, lis_, difmax_=infinity):

return [lis_[i] for i in range(len(lis_1)) if lis_1[i] == value_ and lis_1[i] < difmax_]

# 返回列表萊文斯坦距離相同的項,如果存在為引數difmax賦值則返回的項被這個容許差值限制

def min_len_dif(value_, lis_, difmax_=infinity):

min_dif_set = set() # 可能有多以上距離差值相同

if lis_:

# 在距離限制下的列表不為空

len_dif_min = abs(len(lis_[0]) - len(value_))

# 先取第一項的距離

for i in lis_:

len_dif = abs(len(i) - len(value_))

if len_dif <= len_dif_min and len_dif

字串搜尋

include include include includeusing namespace std char grid 100 100 word 100 int n m int x int y int xx yy void search if k len int main int t cin t ...

字串搜尋

include include include includeusing namespace std char grid 100 100 word 100 int n m int x int y int xx yy void search if k len int main int t cin t ...

關於字串模糊匹配

一種比kmp和bm 更高效的匹配演算法 如果想看原英文介紹,看下面分割線後的 適用於 模式串較短的情況,最壞時間複雜性為o n m 不過一般沒這麼壞 sunday演算法其實思想跟bm演算法很相似,只不過sunday演算法是從前往後匹配,在匹配失敗時關注的是文字串中參加匹配的最末位字元的下一位字元。如...