spell correction (拼寫錯誤糾正)
那麼什麼是拼接錯誤糾正。請看一下例子。
簡而言之,就是使用者的輸入和使用者真正要輸入的存在一定的出入。這種出入可以是英文的拼寫錯誤,也可以是中文的同音詞。
那麼對於拼寫錯誤,我們應該去如何解決呢。
比如there 和therr。使用者的輸入可能是therr,但是手誤寫成了thera,那麼首先我們要在一大堆候菜單詞裡選擇there,
那麼首先要計算輸入此therr與候選詞庫中每個詞的編輯距離。
編輯距離就是通過多少次變化可以得到正確的詞。
如therr--->there 只需要將最後乙個r改為e 編輯距離為1
therr--->their 需要將第乙個r改為i 編輯距離為1
therr---->theirs 第一步需要將第乙個r變為i,再王最後加s 編輯距離為2
實現編輯距離有三種操作
1:insert
2:delete
3:replace
就是通過一定步數的增,刪,改操作,就可以得到編輯距離。
下邊我們看具體的**實現。
def edit_dist(str1,str2):
m,n = len(str1),len(str2)
dp = [[0 for x in range(n+1)] for x in range (m+1)]
print(dp)
for i in range (m+1):
for j in range (n+1):
if i == 0 : #假設第乙個字串為空,則轉換的代價為j,需要j次的插入
dp[i][j] = j
elif j ==0: #第二個字串為空,則需要i次的插入
dp[i][j] = i
elif str1[i-1] ==str2[j-1] : #如果最後乙個字元相等,則不產生代價
dp[i] [j] = dp[i-1][j-1]
else: # 如果最後乙個字元不一樣,則考慮多種可能性,並且選擇其中最小的值
dp[i][j] = 1 + min(
dp[i][j-1],
dp[i-1][j],
dp[i-1][j-1]
)print(dp)
return dp[m][n]
print(aa)
執行結果如下:
那麼這種拼寫糾錯的缺點是什麼呢。
如果我們的詞庫中有10^6個單詞,那我們豈不是要計算10^6次。
針對該方法,我們可以進行以下優化。
先不計算輸入和詞典庫中每個單詞的編輯距離。
我們生成編輯距離為1或者2的單詞組合。
生成**如下。
#生成編輯距離為1的單詞列表。
def generate(str):
letters ='abcdefghijklmnopqrstuvwxyz' #定義26個字母
splits = [(str[0:i],str[i:]) for i in range(len(str))] #先對str進行切分
print(splits)
#先插入。
inserts = [l+ c + r for l,r in splits for c in letters]
print('inserts:')
print(inserts)
#刪除deletes = [l+ r[1:] for l,r in splits]
print('deletes:')
print(deletes)
#替換replaces = [l+ c + r[1:] for l,r in splits for c in letters]
在編輯距離為1的單詞列表基礎上再求一次編輯距離為1的列表。
#生成編輯距離為1的單詞列表。
def generate(str):
letters ='abcdefghijklmnopqrstuvwxyz' #定義26個字母
splits = [(str[0:i],str[i:]) for i in range(len(str))] #先對str進行切分
print(splits)
#先插入。
inserts = [l+ c + r for l,r in splits for c in letters]
print('inserts:')
print(inserts)
#刪除deletes = [l+ r[1:] for l,r in splits]
print('deletes:')
print(deletes)
#替換replaces = [l+ c + r[1:] for l,r in splits for c in letters]
print('repalces:')
print(replaces)
return set(inserts + deletes + replaces)
print(result)
result2 = [generate(temp) for temp in result]
print(result2)
即便這樣,生成的詞典列表依然很大,我們想進行乙個過濾操作,該怎麼做呢?
這個時候就要用到貝葉斯定理。
如下:
end。
NLP學習之隨筆(1)
nlp一般的處理流程為 原始文字 raw data 分詞 segmentation 清洗資料 cleaning 標準化 normalization 特徵提取 feature extraction 建模 modeling 1 分詞 常見的分詞工具有 jieba分詞 snownlp ltp hannlp...
NLP學習之隨筆(6)
基於檢索的問答系統 recap retrieval based qa system 我們輸入一句話。需要計算語料庫中每句話和當前輸入這句話的相似度,然後返回相似度最高的那個。這種方法的時間複雜度為o n 如果語料庫中的有10 7個問題,那麼在計算乙個輸入的時候,要計算10 7次。針對該方法,我們可以...
NLP的學習筆記(3)之Pandas庫
pandas是乙個強大的分析結構化資料的工具集 它的使用基礎是numpy 提供高效能的矩陣運算 用於資料探勘和資料分析,同時也提供資料清洗功能。pandas最特別的地方就是有標籤列。它是一種類似於一維陣列的物件,是由一組資料 各種numpy資料型別 以及一組與之相關的 資料標籤 即索引 組成。僅由一...