1. 程式人生 > 實用技巧 >自然語言處理4-5:語言模型之平滑操作

自然語言處理4-5:語言模型之平滑操作

為什麼需要平滑操作

假設有一個預料集

我 喜歡 喝 奶茶
我 喜歡 吃 巧克力
我 喜歡 健身
天啦擼,一起同過窗 要出 第三季 了

這個時候要計算“我喜歡喝咖啡”的概率

假設我們用bi-gram模型來計算,也就是說

      P(我喜歡喝咖啡) = P(我)P(喜歡|我)P(喝|喜歡)P(咖啡|喝) = (3/16) * (1) * (1/3) * (0) = 0

但是我們都容易感覺出來,“我喜歡喝咖啡”是符合語言習慣的句子,也就是說,雖然現在的語料庫中沒有這個句子,但是將來也有可能出現,但是我們算出的這個句子出現的概率是0,這不符合常識。因為語料庫中沒有出現“喝”後面接“咖啡”,只能說明這個句子未來出現的概率比較小,但是不排除它會出現,畢竟“我喜歡喝”這個字首的概率該是很大的,“喝 咖啡”沒有出現,只能說明“喝”後面接“咖啡”的概率很小,但是就將這個句子的概率定為0是不科學的。那麼,該如何做才能使得沒出現的搭配也能有一個小的概率呢?

Add-one smoothing

直接給公式:

$$P(w _{i}| w_{i-1}) = \frac{C(w_{i-1}, w_{i}) + 1}{C(w_{i-1})+v} $$

這裡的v是詞典庫的大小,注意,是詞典庫的大小,不是訓練的預料集分詞之後的詞語個數。例如,對於上面那個預料集,分詞之後有16個單詞,但是詞典庫的大小是12個。所以v是12哦。

分母加1可以理解,為了讓那些出現頻次為0的$C(w_{i-1}, w_{i})$算出來的概率不為0,從而避免了因為它使得整個句子的概率為0了。

可是為什麼分子要加v呢,笨蛋,為了使得$\sum_{w_{i}}^{} \frac{C(w_{i-1}, w_{i}) + 1}{C(w_{i-1})+v} $為1啊,物理意義就是,詞典庫中有v個詞彙,$w_{i-1}$後面接的單詞在這v個詞彙之中的概率要為1,也就是加起來為1。

add-k Smoothing

沒啥好說的,上公式:

$$P(w _{i}| w_{i-1}) = \frac{C(w_{i-1}, w_{i}) + k}{C(w_{i-1})+kv} $$

只是由加1變成了加k而已啦。add-one smoothing和add-k smoothing都是拉普拉斯平滑

interpolation

但是其實上面介紹的兩個平滑還是會有一個問題沒有解決

下面舉一個例子

假設我們有語料庫

in the bathroom
the kitchen
kithcen
arboretum

如果通過add-one smoothing,我們計算P(kitchen|in the)和P(arboretum|in the)的值是一樣的,因為他們的頻次都是0,所以值都是(0+1)/(1+ 7) = 1/8。但是我們直觀感覺,in the kitchen 肯定要比in the arboretum的概率要大得多,那麼這種感覺是怎麼來的呢?因為kitchen和the kitchen出現的次數大於arboretum和the arboretum啊笨蛋。所以我們計算tri-gram模型的概率的時候,如果能夠考慮bi-gram和unigram的概率,那麼就能避免上述情況了。

公式也很簡單,如下:

$$P^{'} (w_{n}|w_{n-1},w_{n-2}) = \lambda _{1}P (w_{n}|w_{n-1},w_{n-2}) +\lambda _{2}P (w_{n}|w_{n-1})+\lambda _{3}P (w_{n})$$

其中$\lambda _{1},\lambda _{2},\lambda _{3}$是可以變化的引數,且滿足$\lambda _{1} + \lambda _{2} +\lambda _{3} = 1$