自然語言處理的數學原理(二)


轉載來源:blog.csdn.net/ZLJ925/article/details/79020158
上一篇文章介紹了 NLP 中處理分詞的兩種方法,其中基於統計語言模型的方法以巨大的優勢勝出。

在上一篇文章的末尾,我們講了優秀的算法模型在形式上應該是簡潔優雅的。具體來說:

  • 一個正確的數學模型在形式上應該是簡潔優雅的。
  • 一個正確的數學模型,在剛開始的時候可能還不如一個經過精心調教的錯誤模型準確。但是錯誤模型不論如何調教,因爲方向錯了,所以終究會有處理不了實際問題的時候。
  • 正確的數學模型可能因爲受到干擾而不準確。此時應該找出干擾、噪音,並解決它們,而不是簡單湊合去修修補補。

這篇文章我們繼續講分詞和統計語言模型。不過,這次的內容會比上次要深入、深奧,並且會涉及到一些數學推導,以及一些工程上的 Dark Side。不過,其中有些非常 Tricky 的技巧對於大多數讀者來說沒有必要閱讀,而剩下的部分中簡單的數學推導也不致枯燥。

統計語言模型的具體描述

上一篇文章簡單介紹了統計語言模型的思想,這裏將給出統計語言模型的具體描述和簡化。不過,在此之前,我們先看一個更簡單直觀的例子。

一個簡單的例子

下面這個例子我們已經見過,在文法上,這是一個比較複雜的句子。不過,雖然這個句子在文法上比較複雜,但是對於人類來說,理解它並不費勁。

由於理解自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力,自然語言認知,同時也被視爲一個人工智能完備的問題。

現在我們對句子略作修改,變成下面這樣,理解起來就有些費勁了,但是勉強還能理解。

自然語言由於理解,需要知識廣泛關於外在世界的以及運用這些知識操作的能力,認知自然語言,也被視爲同時人工只能完備的一個問題。

如果對句子繼續變形,變成下面這樣,基本上就沒人搞得懂這是在說什麼了。

然自語言由理於解,需知要關泛識需廣關泛於外在界世以及的運用及的些這識知操運用些的作能力,認語知自然語知言,也視被爲同備時的人被工個問只視能完的備一個題問。

從文法上說,第一個句子合乎文法,因而容易理解;第二個句子雖然不合文法,但是勉強有跡可循;第三個句子則完全莫名其妙,自然就沒法讀懂。

上一篇文章告訴我們,這樣基於文法的解釋是合情合理的,但是在實際應用上卻邁不開步子、走不出實驗室。要解釋這三個句子的情況,終究還是要依靠統計的方法。

我們把這三個句子分別記作 S1, S2, S3,用 P(Sk)表示三個句子在人類交流中出現的概率(可能性)。於是事情就變得簡單起來:P(Sk)越大,說明句子出現在人類交流中的概率越大;換言之,這個句子越符合人類交流的習慣(特別是文法規則),因此也就容易讀懂。就實際情況來說,

alt

亦即,第一個句子出現的概率是第二個句子的一萬倍,是第三個句子的 10的50次方倍。我已經不想去數這個數字寫作中文後會有多少個「億」字了。

統計語言的描述

上一小節我們看到根據句子的概率判斷句子合理性效果是十分顯著的。爲了能將這個方法用於實際,我們必須解決概率的計算問題。

假定 S是一個有意義的句子,它由一串排序確定的詞組成,即

S=w1,w2,…,wn

這裏每個 wk表示一個詞語,n是句子包含詞語的數量,即句子的長度。顯而易見,把 S
放在從古至今所有的語境裏去檢查概率是不可行的,因此我們需要做一個模型來估算。我們把 P(S) 展開,得到(2)中的條件概率形式。
alt
其中 P(wk∣w1,w2,…,wi),(i=k−1)表示 wk接在序列 w1,w2,…,wi
之後的條件概率。不難看出,wk 的概率,取決於它本身在整個語言中出現的概率,以及它前面 i=k−1 個詞順序出現的概率。

學過概率論的讀者應該知道,計算三元的條件概率(即計算類似 P(w3∣w1,w2)已經很困難了,更別說計算整個句子最後一個詞的條件概率。因此,我們需要對模型進行簡化。

數學專業的讀者可能會發現,這樣的條件概率,實際上是一個隨機過程的概率。在隨機過程中,爲了簡化分析,對此類過程有一個馬爾科夫假設(Markov Hypothesis),即假設 wk
wk的概率只和 wi,(i=k−1)有關。即假設
alt
這樣一來,我們就有
alt
即是二元統計語言模型(Bigram Model)。在形式上,二元模型是非常簡潔優雅的,這正符合了我們之前對模型形式的預期。

條件概率的估算

模型已經構建完畢,接下來需要考慮如何解模,而核心問題就是如何估算條件概率 P(wk∣wi),(i=k−1)。根據條件概率的定義
alt
我們只需要在語料庫(Corpus)中統計 wi,wk和 wi出現的次數,再除以語料庫的體積,就能算出 wi,wk和 wi的頻率。如果語料庫足夠大,我們就有大數定律作支撐,得到
alt
(4) 給出了計算二元條件概率的一般方法,其中 ⟨wi⟩表示 wi在語料庫中出現的次數。

至此,二元統計語言模型已經構建完畢,基本原理也已介紹完畢。數學在此展現了非凡的簡潔和優雅,同時帶給了我們極高的效率。當然,這個模型還很粗糙,要想讓二元模型走出實驗室,走向實際應用,還有很多細節需要討論。接下來的討論會有一些枯燥乏味,不過對數學細節不感興趣的讀者可以略過數學推導,把注意力放在模型的原理之上。

統計語言模型用於分詞的細節討論

二元模型的擴展

馬爾科夫假設將當前詞語的概率限定只與之前一個詞有關。這樣的假設能在很大程度上降低計算的複雜性,但是卻和實際生活的情況相差甚遠。比如

小明的鉛筆

在這裏「鉛筆」之前的詞是結構助詞「的」。考慮到結構助詞「的」的後面幾乎可以出現任何名詞,如果我們約定「鉛筆」出現的概率只和「的」有關,那顯然是不合理的。

爲了解決這個問題,比較顯然的辦法是對馬爾科夫假設做擴展。即,從假設當前詞只與之前的一個詞有關,擴展到與之前的 p個詞有關。也就是將模型從二元模型擴展到 p-元模型。很顯然,p的值越大,模型越接近真實情況;同時,計算量和計算的複雜度以及耗費的算力都會大大提升。因此,在實際使用中,需要在真實性和計算量之間取一個平衡點,互相取捨。

經過前人的大量實驗,當 p=3時,模型的效果比較好,算力要求也在容忍範圍之內。當 p
的取值從 3 增加到 4的時候,效果的增長不太明顯,算力的要求卻大大增加。因此,在實際使用過程中,大都是三元模型;對準確性要求高,且不差錢的時候,一般會選擇使用四元模型。

統計語言模型的侷限性

統計語言模型的主要思想是通過統計人類的語言習慣,代替文法分析,判斷某個句子的「合理性」(這個合理性通過概率的大小來量化)。

統計語言模型的侷限性一個主要的方面來自計算機算力和容量的限制。這一點上一小節已經討論過了。

另一方面,也有一些人爲創造的歧義句子。這類句子,讓真實的人類來閱讀,也是可以有多種理解的;因此,統計語言模型也就不可能完美處理這類句子。比如

有小便宜 得大解脫
這是李淡愚先生妙筆生花,將污濁之地「淨化」成「道場」的俗聯。根據句讀不同(還有多音字),可以理解出不同的意思。

有 | 小便(pian)宜,得(de) | 大解脫。
有小便(bian) | 宜,得(dei)大解 | 脫。

兩種斷句都有道理,都可以理解出通順的意思。好在這類句子在生活中並不常見,對統計語言模型影響甚小。

統計語言模型的訓練問題

根據之前的分析,我們知道,在統計語言模型正式工作之前,需要用一個足夠大的語料庫進行訓練。訓練的目的就是得到各個 ⟨wk⟩ 和 ⟨wi,wk⟩的值備用。

但是,在實際運用過程中,還需要解決一個棘手的問題。我們考慮以下問題:

如果 wi,wk 是一個極其罕見的詞組,它在實際生活中可能遇到,但是並未包含在語料庫中。根據 (4),我們會認爲 P(wk∣wi)=0。再根據 (3),P(wk∣wi)=0會導致整個 P(S)=0。在這種情況下,語料庫不夠大導致了模型失真,而語料庫的不足是一個無法解決的問題。所以我們必須接受模型在某些情況下可能失真,並找出辦法消除(或者至少是減弱)這種失真給模型帶來的影響。

在實際動手之前,我們先來分析一下實際情況,搞清楚我們到底要修復什麼。

問題的根源在於語料庫不夠大,不足以反映真實語境的具體情況。而罕見詞語未在語料庫中出現,導致整句話的概率爲零,這樣的失真現象,只不過是語料庫不夠大的一個表現而已。那麼,很自然地,我們需要思考一下,語料庫不夠大,只是會導致這一種失真的情況嗎?如果我們只對未出現在語料庫中的罕見詞語進行適當的處理,而忽略了其他可能的失真情況,那麼模型依舊不夠好。

所謂「未出現」,其實是「出現次數爲 0」的另一種表達方式。我們現在對出現次數爲 0 的那些詞語產生了懷疑,懷疑語料庫是否能夠真實反映這部分詞語的情況;那麼我們很自然地會懷疑那些出現次數爲 1 甚至爲 2 的詞語:由於語料庫不夠大,這些詞語在語料庫中的出現次數,是否足以反映它們在真實語境中出現的頻率呢?

於是我們發現,我們對出現次數較少的那些詞語產生了一定的懷疑。特別地,出現次數越少,我們懷疑它的程度就越高。這樣一來,我們的修復方案必須滿足一些要求:

對出現次數爲 0 的那些詞語,我們應該賦予它們一個不爲零但非常小的概率;
對於出現次數較少的那些詞語,我們應該對它們的統計結果做適當的折算,出現的次數越少,可疑程度越大,因此折算程度也應該越大。

語料庫的選取

上一小節我們修正了當出現頻次很低時,統計結果不準確,導致的模型失真的問題。這一小節我們討論可能導致模型不準確的另一個方向的問題。

仔細觀察 (4)你會發現,模型計算語句 S 的概率,是依據語料庫中各個詞彙出現的頻次的。也就是說,最終的計算結果 P(S)是和語料庫緊密相關的。

衆所周知,中國有很多所謂的「網絡流行語」。在網絡上發帖交流的網友,他們的說話習慣和正式的新聞稿的語言習慣是有很大差別的。如果我們以新聞稿件爲語料庫去訓練模型,然後用於網絡語言的分詞,那麼效果顯然不會太好。而如果用網絡語言作爲語料庫,雖然其中可能包括一些雜七雜八的奇怪單詞,但是由於語料庫與實際使用的類型一致,效果反而會更好。

衆所周知,中國有很多所謂的「網絡流行語」。在網絡上發帖交流的網友,他們的說話習慣和正式的新聞稿的語言習慣是有很大差別的。如果我們以新聞稿件爲語料庫去訓練模型,然後用於網絡語言的分詞,那麼效果顯然不會太好。而如果用網絡語言作爲語料庫,雖然其中可能包括一些雜七雜八的奇怪單詞,但是由於語料庫與實際使用的類型一致,效果反而會更好。

分詞一致性與顆粒度

我們回到最初的分析方法,先來看兩個詞:

清華大學
山東大學
這是兩個大學的名字。在這裏,對山東大學的分詞不會有什麼分歧,它就是一個詞,不可分割。但是對清華大學的分詞就存在分歧了。有的人認爲清華大學是密不可分的,也有人認爲清華和大學應該分開:清華作爲修飾部分修飾大學二字。

這實際上是人們對於詞語顆粒度大小認知不同導致的分詞不一致。對清華大學的兩種分詞方法都不能說錯,關鍵是要看語言的使用場合。

在平時寫文章的時候,沒有必要把清華和大學分開,它們就是一個詞。但是在做搜索引擎的時候,就有必要把分詞的顆粒度調整一下,變得小一些,認爲清華和大學是兩個詞。畢竟,如果用戶搜索「清華」而無法獲得和清華大學有關的結果,這樣的搜索引擎顯然是不合格的。

這樣的分析對我們是有啓發的。我們沒有必要糾結哪一種分詞顆粒度更好,實際情況告訴我們,在某些時候大顆粒度更好,某些時候小顆粒度更好。

那麼,是否有必要爲不同的顆粒度搭建不同的模型呢?答案是否定的。實際上,不管是大顆粒度的分詞,還是小顆粒度的分詞,模型方法都是一樣的,差別只在於對詞語的認知問題。如果站在模型的角度上去考慮:模型是不瞭解詞彙的含義的,具體應該用何種顆粒度去構建分詞,只取決於語料庫中對詞語的劃分。

因此,解決方案呼之欲出:
我們不需要設計兩套模型,只需要一套模型就可以完成工作。我們需要做的,是對「清華大學」這類複合詞做一個統計,做成兩個詞表 L1和 L2。其中 L1包含小顆粒度的分詞結果,比如「清華」和「大學」;L2 包含顆粒度較大的分詞結果,比如「清華大學」。在實際使用的過程中,根據需求,分別將 L1或者 L2與語料庫合併,交由模型去訓練就好了。

小結

這篇文章接着第一篇文章,討論了統計語言模型,特別是二元模型,在分詞方面的應用。這篇文章給出了二元模型的具體描述,以及模型的具體解法。

之後,文章討論了二元模型不可避免的一些困難,同時對一些可以修復的問題做了討論。

總的來說,運用統計語言模型解決分詞是一個成熟的方案。實際運用時效果的好壞,主要取決於以下幾個方面:

  • 工程實現的精度;
  • 語料庫的選取;
  • 複合詞表的完整度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章