拼写校正与动态规划的小故事
喵喵喵,細心的你有沒有發現小夕已經將臥室和書房精裝修了呢~
可以輸入口令【ho】,或者點擊主頁的“舊的故事”標簽進入哦。
一個小現象
小夕今天給大家講一個自然語言處理/信息檢索領域的小現象~
細心的同學可能發現啦,每當你在使用某度進行搜索時,一旦打了錯別字,往往不會影響你的搜索結果,它會幫你自動校正。如下圖所示~小夕把“搜狗”打成了“餿狗”
可以看到某度自動將餿狗給校正成搜狗了。
?
同樣的現象還會發生在輸入法、word等一系列自然語言文本輸入的場合中。那么看起來如此不可思議的事情是怎么做到的呢?
小原理
?
可能有機智的喵喵會想到,只要將用戶輸入的詞在字典里查一下不就好咯~查不到的詞就是錯詞呀~
?
說的很對哦,但是更詳細的說:
?
分詞
在漢語糾錯的時候還會有一個“分詞”的過程,就是將用戶輸入的一串文本切分成一個個的詞語。
比如用戶輸入了“搜狗搜索厲害嗎”,那么負責分詞的代碼就會將其分成“搜狗|搜索|厲害|嗎”。
如何分的呢?小夕以后講哦~為了縮小本文規模,小夕以此處不需要分詞的英文為例來講解一下拼寫校正技術。
糾正
首先在詞典中查找,確認該詞是否為錯詞。但注意,在不同的應用中,詞典的定義可能不一樣吶。
比如在輸入法中,詞典是拼音詞典,只要合乎拼音語法,基本就可以確定該詞就是好詞(除非有更智能的優化)。但在web搜索引擎中,詞典是搜索熱度詞典,也就是記錄用戶輸入某個詞可能性的詞典。比如上文中,“餿狗”的搜索熱度很低,即罕見詞。而與之相近的“搜狗”的熱度會比“餿狗”的熱度大很多,此時就可以將“餿狗”看作是錯詞,而實際上“餿狗”這個詞語完全可能存在。
?
小夕為了縮小本文規模,不討論分詞過程哦,因此以英文單詞為例講解。(英文中的空格自帶分詞屬性,2333)
小難點
?
而第二步的關鍵點,或者說難點在哪里呢?顯然,查找某個詞是否是罕見詞很容易,就去詞典里翻一翻就好了。但是如何確定與該錯詞的正確形式呢?或者說如何確定用戶心里真正想輸入的那個詞呢?這就是關鍵啦。
?
一個很簡單的例子是計算該錯詞與其他正常詞的相似度,這個相似度叫編輯距離。然后我們得到編輯距離最小,也就是相似度最大的詞,就是該錯詞的正確形式啦~
?
編輯距離有多種計算方法,其中最常用的是計算Levenshtein距離。
Levenshtein
?
這Levenshtein距離怎么計算呢?首先了解一下編輯操作:
1、????將一個字符插入字符串
2、????從字符串中去除一個字符
3、????將字符串中的一個字符替換成另外一個字符。
?
令上述操作的每一步的代價都為1,則一個單詞變換成另一個單詞的最小代價,也就是最少編輯操作次數,就為這兩個單詞的Levenshtein距離。
?
那么如何用算法實現兩個單詞之間的Levenshtein距離計算呢?
小算法
?
還記不記得小夕在上一篇文章中教給你的方法吖?要從算法問題中提煉算法思想哦,然后將算法思想再用于新的算法問題!
?
假如我們要計算paris和alice的Levenshtein距離,利用上一節提煉出來的枚舉法、分治法等思想,是不是很輕松就出來思路啦?但是呢,小夕在這里不用這么low的算法啦,小夕要用動態規劃(DP)思想來解決這個問題!
?
DP思想呢,小夕的解釋就是DP會記憶你之前已經走過的道路,因此不會像枚舉法+分治一樣來來回回的對同一種情況反復計算。之前完全不了解DP的喵喵,小夕強烈建議你去看《算法導論》上的講解哦,炒雞清晰!
?
好,在開始之前,我們先畫一張表格,用來記錄走過的路~
這張表的每個元素都代表著兩個串的編輯距離。比如上圖中的元素N就代表著“pa”到“al”的編輯距離,最右下角的元素就代表著“paris”到“alice”的編輯距離,最左上角的元素代表著null到null的編輯距離。
?
顯然呀,要從左上角按照某種軌跡走到右下角呢~(想不明白的請面壁,喵喵喵)
?
null到null的距離當然是0啦。所以第一個元素填0。
然后我們從左往右走,一行走完就從下一行的最左邊開始走,直到走到右下角。
?
顯然第二個元素代表從null到p的距離,我們只需要在它左邊的元素的基礎是,也就是null到null的基礎上,將第二個null添加一個字符p(回憶一下前面的三種編輯操作)。所以代價增加1,所以第二個元素等于0+1=1。同理寫出第一行的其他元素值。
第二行的第一個元素,只需要在它頭上的元素的基礎上加個a,所以是0+1。
而第二個元素開始就復雜些了,它(1)可以在左邊元素的基礎上修改,(2)也可以在上邊元素的基礎上修改。(3)萬一遇到兩個字符串末尾元素相同的情況,則編輯距離要等于左上角元素。比如pred到had的編輯距離與pre到ha的編輯距離相等!所以我們額外定義一下,如果兩串末尾的元素不相等,則編輯距離還可以等于左上角元素的值+1。
?
然后我們計算出這三種情況后,取最小值為該元素的最終值。如圖
該格子的左上角的1是基于左上角元素+1得到;右上角的2是基于上邊的元素+1得到;左下角的2是基于左邊的元素+1得到;右下角為前面這三種情況的最小值。
?
于是按照這種思路,整個表格就畫成啦~
所以呀,前面講過了,最右下角元素的右下角的值,就是paris與alice的最小編輯距離啦~即為4。
?
有人覺得,誒?計算量看起來也蠻大的嘛。好咯,你可以用蠻力法+分治畫一張圖試試,你就知道這張表格多小啦!
?
Completed!
?
看吧~人工智能大領域中的NLP領域的一個任務,最核心的就是你們算法課上學的動態規劃啦~千萬不要書到用時方恨少哦,跟小夕一起學算法吧,喵喵喵~
?
所以,要不要考慮給小夕買好吃的呀o(≧v≦)o
總結
以上是生活随笔為你收集整理的拼写校正与动态规划的小故事的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人物志 | KDD Cup 2017双料
- 下一篇: 机器学习在美团配送系统的实践:用技术还原