NLP學習之隨筆(3)

2021-09-27 07:32:58 字數 3133 閱讀 2660

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資料型別 以及一組與之相關的 資料標籤 即索引 組成。僅由一...