一. 何謂語言模型
斷完詞後,我們希望可以用這些詞做什麼呢?用途很多,但大部分的情況基本上是希望訓練一個模型,這個模型可以了解文章、句子等語意的關係,這也就是語言模型,可以推論出文義通順、有意義的句子或文章,例如:
今天天氣_,人類知道這個空格應該有可能是’晴’這個字或是形容天氣狀況的詞。
語言模型就是希望可以推理出上面的空格的詞,所以假如目前有'晴'、'帥'、'我' 這三個詞的話,照理來說'今天天氣_'與這三個詞的機率相乘,'晴'這個詞的機率應該要最大。目前的語言模型就是根據其他字詞來判斷當前自出現的機率,因此便可以藉由機率大小的方式來判斷句子出現可能性。
二. N-gram
這邊主要是講N-gram的model,計算方式如下,假設今天語料庫有5個句子(已斷過詞):
這是 一隻 貓
這是 一隻 貓
今天 天氣 不錯
這是 一隻 狗
晚餐 吃 咖哩 飯
計算P(貓|‘這是’, ‘一隻’) = count(‘這是’ + ‘一隻’ + ‘貓’)/count(‘這是’ + ‘一隻’) = 2/3
像上面這個例子是看前面2個字來預測接下來的字,稱為 tri-gram,因為一次看3個詞,以此類推,若只看前面一個詞來預測下個詞這樣稱為bi-gram,單純看詞在語料庫出現的機率,稱為uni-gram。
沒錯,N-gram就是基於統計的語言模型算法,就是將文本/句子中的內容取最靠近的 N 個字當作條件機率計算,形成長度是 N 的字詞,如上述的tri-gram,用前兩個詞預測下一個詞,所以他一次看了3(N)個詞,而這邊的每個字詞稱為 gram。
三. N-gram的由來
其實最一開始的時候,語言模型是利用貝氏機率來計算一個句字生成的機率大不大,如下,若要表示一個句字的S的機率大小會表示如下:
P(S) = p(w1)p(w2|w1)p(w3|w1w2)...*p(wn|w1w2w3…)
第一個詞是w1乘上(在w1出現的前提下w2出現的機率),這樣依此類推相乘,但這樣做太費時,耗費計算的空間,因此才導入了馬可夫模型的概念,來簡化計算過程,馬可夫的概念就是下一個狀態的機率由當前狀態決定,所以才產生了N-gram的模型。
列一下uni-gram、bi-gram與tri-gram的計算方法,以上述計算句字的S的機率為例,會表示如下:
P(S) = p(w1)p(w2)p(w3)...*p(wn)
P(S) = p(w1)p(w2|w1)p(w3|w2)...*p(wn|w[n-1])
P(S) = p(w1)p(w2|w1)p(w3|w2, w1)...*p(wn|w[n-1], w[n-2])
透過馬可夫的假設,就不需要考慮到句子中所有字詞的時間序列,大幅減低運算成本。
N-gram在錯別詞、預測詞上都有不錯的應用喔~~像下圖就是google的預測詞,這是可以利用簡單的N-gram模型可以做到的,但google是不是用這個演算法不清楚XD
今天大致說明了一下N-gram的原理~明天要開始用python來實戰N-gram模型了,會試著實作'預測詞'的模型~
參考資訊
[1] 基于jieba中文分词进行N-Gram
[2] NLP 中文拼写检测纠正算法整理