《數學之美》隨筆

第一章 文字和語言 VS 數學和信息

數學、文字和天然語言同樣,都是信息的載體,它們之間本來有着自然的聯繫。算法

語言和數學的產生都是爲了同一個目的——記錄和傳播信息。數據庫

隨着人類的進步和文明化的進展,須要表達的信息也愈來愈多,再也不是幾種不一樣的聲音就能徹底覆蓋的了,語言就此產生。安全

當語言愈來愈豐富,愈來愈抽象,語言描繪的共同語言,好比物體、數量、動做便抽象出來,造成了今天的詞彙。服務器

當語言和詞彙多到必定程度的時候,人類僅靠大腦已經記不住全部詞彙了,高效記錄信息的需求就產生了,這即是文字的起源。 在早期,象形文字的數量和記錄一個文明須要的信息量是相關的。隨着文明的進步,信息量的增長,埃及的象形文字便再也不隨着文明的發展而增長了,由於沒有人可以學會和記住那麼多的文字,因而,概念的第一次歸納和歸類就開始了。機器學習

在古埃及的象形文字中,讀音相同的詞可能用同一個符號記錄。這種概念的聚類,在原理上與今天天然語言處理或者機器學習的聚類有很大的類似性。函數

不一樣的文字系統在記錄信息上的能力是等價的。工具

文字只是信息的載體,而非信息自己,不用文字,也能夠用數字來存儲一樣意義的信息。這也是現代通訊的基礎。學習

信息的冗餘是信息安全的保障。測試

語言的數據,咱們稱之爲料,尤爲是雙語或者多語的對照語料對翻譯相當重要,它是咱們從事機器翻譯研究的基礎。優化

既然文字是出如今遠古「信息爆炸」致使人們的頭腦裝不下這些信息的時候,那麼數字的出現則是在人們的財產多到須要數一數才搞清楚有多少的時候。

早起數字並無書寫的形式,而是掰手指,這就是爲何咱們今天使用十進制的緣由。(瑪雅文明使用的是二十進制)

具備書寫形式的數字和象形文字應該誕生於同一時期。

數字和其餘文字同樣,在早期只是承載信息的工具,並不具備任何抽象的含義。

描述數字最有效的是古印度人,他們發明了包括0在內的10個阿拉伯數字(這個0很重要,不然就須要許多描述進制的量詞,如個十百千萬等),就是今天全世界通用的數字。這種表示方法比中國和羅馬的都抽象,可是使用方便。阿拉伯數字或者說印度數字的革命性不只在於它的簡潔有效,並且標誌着數字和文字的分離。這在客觀上讓天然語言的研究和數字在幾千年裏沒有重複的軌跡,並且越走越遠。

任何事物的規律是內在的,並不隨它的載體而改變。天然語言的發展在冥冥之中,都受着信息科學規律的引導。

從象形文字到拼音文字(在人類第二個文明的中心古巴比倫誕生)是一個飛躍,由於人類在描述物體的方式上,從物體的外表到抽象的概念,同時不自覺地採用了對信息的編碼。

猶太人在抄寫聖經時,爲避免錯誤,發明了一種相似於咱們今天計算機和通訊中校驗碼的方法。他們把每個希伯來字母對應於一個數字,這樣每行文字加起來便獲得一個特殊的數字,這個數字便成爲了這一行的校驗碼。一樣,對每一列也是這樣處理。

第二章 天然語言處理——從規則到統計

最先提出機器智能設想的是計算機科學之父阿蘭圖靈(Alan Turing),1950年他在《思想》(Mind)雜誌上提出了一種來驗證機器是否有智能的方法:讓人和機器進行交流,若是人沒法判斷本身交流的對象是人仍是機器時,就說明這個機器有智能了。這種方法被稱爲圖靈測試(Turing Test)。

上個世紀70年代,基於統計的方法的核心模型是通訊系統加隱含馬爾可夫模型。這個系統的輸入和輸出都是一維的符號序列,並且保持原有的次序。

天然語言處理的研究從單純的句法分析和語義理解,變成了很是貼近應用的機器翻譯、語音識別、文本到數據庫自動生成、數據挖掘和知識的獲取等等。

基於統計的天然語言處理方法,在數學模型上和通訊是相通的,甚至就是相同的。所以,在數學意義上天然語言處理又和語言的初衷——通訊聯繫在一塊兒了。可是,科學家們認識到這個聯繫卻花了幾十年的時間。

第三章 統計語言模型

天然語言從它產生開始,逐漸演變成一種上下文相關的信息表達和傳遞的方式,所以讓計算機處理天然語言,一個基本的問題就是爲天然語言這種上下文相關的特性創建數學模型。這個數學模型就是在天然語言處理中常說的統計語言模型,它是今天全部天然語言處理的基礎,而且普遍應用於機器翻譯、語音識別、印刷體或手寫識別、拼寫糾錯、漢字輸入和文獻查詢。

統計語言模型產生的初衷是爲了解決語音識別問題。在語音識別中,計算機須要知道一個文字序列是否能構成一個你們理解並且有意義的句子,而後顯示或者打印給使用者。 賈里尼克用一個簡單的統計模型解決了上述問題:一個句子是否合理,就看看它的可能性大小如何。。至於可能性救用機率來衡量。
這個方法更普通而嚴格的描述是:假定S表示某一個有意義的句子,由一連串特定順序排列的詞w1,w2,...,wn組成,這裏n是句子的長度。而S在文本中出現的可能性,也就是數學上所說的S的機率P(S)。既然S = w1,w2,...,wn,那麼不妨把P(S)展開表示:P(S) = P(w1,w2,...,wn) 利用條件機率的公式,S這個序列出現的機率等於每個詞出現的條件機率相乘,因而P(w1,w2,...,wn)可展開爲:
P(w1,w2,...,wn) = P(w1)X P(w2|w1) X P(w3|w1,w2)...P(wn|w1,w2,..,w n-1)
其中P(w1)表示第一個詞w1出現的機率;P(w2|w1)是在已知第一個詞的前提下,第二個詞出現的機率;以此類推。不難看出,到了詞wn,它的出現機率取決於它前面的全部詞。

從計算上看,第三個詞的條件機率P(w3|w1,w2)已經很是難算了,到了最後一個詞wn,條件機率P(wn|w1,w2,..,w n-1)的可能性太多了,沒法估算。

19世紀到20世紀初,俄羅斯有個數學家叫馬爾可夫,他給了個偷懶但還頗爲有效的方法,也就是每當遇到這種狀況時,就假設任意一個詞wi出現的機率只同它前面的詞wi-1有關,這樣問題就變得簡單了。這種假設在數學上稱爲馬爾可夫假設。如今,S出現的機率就變得簡單了:P(S) = P(w1) X P(w2|w1) X P(w3|w2) ...P(wi|wi-1)...P(wn|wn-1)
此公式對應的統計語言模型是二元模型(Bigram Model)。
而假設一個詞由前面N-1個詞決定的,對應的模型被成爲N元模型。

接下來的問題就是如何估計條件機率P(wi|wi-1)。根據它的定義
P(wi|wi-1) = P(wi-1,wi)/P(wi-1)
而估計聯合機率P(wi-1,wi)和邊緣機率P(wi-1),只要數一數wi-1,wi這對詞在統計的文本中先後相鄰出現了多少次#(wi-1,wi),以及wi-1自己在一樣的文本中出現了多少次#(wi-1),而後用兩個數分別除以語料庫的大小#,便可獲得這些詞或者二元組的相對頻度。而根據大數定理,只要統計量足夠,相對頻度就等於機率,而P(wi|wi-1)就是這兩個數的比值,因此P(wi|wi-1)約等於#(wi-1,wi) / #(wi-1)

高階語言模型

上述的二元模型太過簡化了,好比「美麗的花朵」,花朵其實和美麗有關。所以,更廣泛的假設是某個詞和前面若干個詞有關。

假定文本中的每一個詞wi和前面N-1個詞有關,而與更前面的詞無關,這樣當前詞wi的機率只取決於前面N-1個詞P(w i-n+1,w i-n+2,...w i-1)。所以
P(wi|w1,w2,...,wi-1) = P(wi|w i-n+1,w i-n+2,...w i-1)
這種假設被稱爲N-1階馬爾可夫假設,對應的語言模型稱爲N元模型(N-Gram Model)。N = 2是二元模型,而N = 1的一元模型其實是一個上下文無關的模型,也就是假定當前詞出現的機率與前面的詞無關。而在實際應用中最多的是N = 3的三元模型,更高階的模型就不多使用了。

N元模型的大小(或者說空間複雜度)幾乎是N的指數函數,即O(|V|^N),這裏|V|是一種語言詞典的詞彙量,通常在幾萬到幾十萬個。而使用N元模型的速度(或者說時間複雜度)也幾乎是一個指數函數,即O(|V|^(n-1))。當N從1到2,再從2到3時,模型的效果上升顯著。而當模型從3到4時,效果的提高就不是很顯著了,而資源的耗費增長卻很是快,因此,除非不是不惜資源爲了作到極致,不多有人使用四元以上的模型。Google的羅塞塔翻譯系統和語言搜索系統,使用的是四元模型,該模型存儲於500臺以上的Google服務器中。

然而,三元或者四元模型甚更高階的模型也沒法覆蓋全部的語言現象。由於在天然語言中,上下文之間的相關性可能跨度很是大,甚至能夠從一個段落跨到另外一個段落。所以,即便模型的階數再提升,對這種狀況也迫不得已,這就是馬爾可夫假設的侷限性。這時就須要採用其餘一些長程的依賴性(Long Distance Dependency)來解決問題。

模型的訓練、零機率問題和平滑方法

使用語言模型須要知道模型中全部條件機率,咱們稱之爲模型的參數。
經過對語料的統計,獲得這些參數的過程稱做模型的訓練。

對於二元模型的模型訓練方法,就是那兩個數計算一下比值便可——P(wi|wi-1)約等於#(wi-1,wi) / #(wi-1),但問題是,若是同現的次數#(wi-1,wi)等於0怎麼辦。
若是用直接的比值計算機率,大部分條件機率會爲0,這種模型咱們稱之爲「不平滑」。在實際應用中,統計語言模型的零機率問題是沒法迴避的,必須解決。

訓練統計語言模型的藝術就在於解決好統計樣本不足時的機率估計問題。
1953年古德(I.J.Good)在他的老闆圖靈(Alan Turing)的指導下,提出了在統計中相信可靠的統計數據,而對不可信的統計數據打折扣的一種機率估計方法,同時將折扣出來的那一部分機率給與未看見的時間(Unseen Events)。古德和圖靈還給出了一個從新估算機率的公式,這個公式被稱爲古德-圖靈估計(Good-Turing Estimate)。
古德-圖靈估計的原理是這樣的:對於沒有看見的事件,咱們不能認爲它發生的機率就是零,所以咱們從機率的總量中分配一個很小的比例給與這些沒有看見的事件。這樣一來,看見的那些事件的機率總和就要小於1了,所以,須要將全部看見的時間機率調小一點。至於小多少,要根據「越是不可信的統計折扣越多」的方法進行。

以統計詞典中的機率爲例,來講明古德-圖靈公式。

假定在語料庫中出現r次的詞有Nr個,特別的出現0次(未登陸詞)出現的次數爲N0個。語料庫中詞語的個數爲N,顯然

出現r次的詞在詞典中的相對頻度爲r/N。若是不作任何優化處理,就依這個相對頻度做爲這些詞的機率估計。

加入當r很是小時,這麼統計可能不可靠,所以出現r次的那些詞在計算它們的機率時要使用一個更小一點的數,是dr,而不是r。古德-圖靈估計按照下面的公式計算dr:

顯然

通常來講,出現一次的詞的數量比出現兩次的詞的數量多,出現兩次的詞的數量比出現三次的數量多。這叫作Zipf定律。
即r越大,詞的數量Nr越小,即Nr+ < Nr。 所以,通常狀況下dr < r,而d0 > 0。這樣就給未出現的詞賦予了一個很小的非零值,從而解決了零機率的問題。同時下調了出現頻率很低的詞的頻率。固然,在實際的天然語言處理中,通常對出現次數超過某個閾值的詞,頻率不下調,只對出現次數低於這個閾值的詞,頻率才下調,下調獲得的頻率總和給未出現的詞。

這樣出現r次的詞的機率估計爲dr/N。因而,對於頻率超過必定閾值的詞,它們的機率估計就是它們在語料庫中的相對頻度,對於頻率小於這個閾值的詞,它們的機率估計就小於它們的相對頻度,出現次數越少的,折扣越多。對於未看見的詞,也給予了一個比較小的機率。這樣全部詞的機率估計都很平滑了。

對於二元組(wi-1,wi)的條件機率估計P(wi|wi-1)也能夠作一樣的處理。因經過前一個詞wi-1預測後一個詞wi時,全部可能狀況的條件總和應該爲1,即

——(3.14)

對於出現次數很是少的二元組(wi-1|wi),它們出現的次數須要按着古德-圖靈的方法打折扣,這樣意味着有一部分機率沒有分配出去,留給了未登陸的二元組(wi-1wi)。基於這種思想,估計二元模型機率公式以下:

其中T是一個閾值,通常在8-10左右,函數fgt表示通過古德-圖靈估計後的相對頻度。而
這樣能夠保證上方等式3.14成立。

這種平滑的方法,最先由前IBM科學家卡茨(S.M.Katz)提出,故稱爲卡茨退避法(katz backoff)。相似地,對於三元模型,機率估計公式以下:

語料的選取問題

模型訓練中另外一個重要的問題就是訓練數據,或者說語料庫的選取。若是訓練語料和模型應用的領域相脫節,那麼模型的效果一般要大打折扣。

訓練數據一般是越多越好。畢竟在數據量多的時候機率模型的參數能夠估計得比較準確。高階的模型由於參數多,須要的訓練數據也相應會多不少。遺憾的是,並不是全部的應用都能獲得足夠的訓練數據。

在訓練數據和應用數據一致而且訓練量足夠大的狀況下,訓練語料的噪音高低也會對模型的效果產生必定的影響,所以,在訓練之前有時須要對訓練數據進行預處理。通常狀況下,少許的(沒有模式的)隨機噪音清除起來成本很是高,一般就不作處理了。可是對能找到模式的、量比較大的噪音仍是須要進行過濾的。

第四章 談談中文分詞

利用統計語言模型分詞的方法,能夠用幾個數學公式簡單歸納以下:假定一個句子S能夠有幾種分詞方法,爲了簡單起見,假定有如下幾種:
A1,A2,...Ak
B1,B2,...Bm
C1,C2,...Cn
其中,A1,A2...B1,B2...C1,C2...等等都是漢語的詞,上述各類分詞結構可能產生不一樣數量的詞串,k,m,n三個不一樣的下標表示句子在不一樣的分詞時詞的數目。那麼最好的一種分詞方法應該保證分完詞後這個句子出現的機率最大。也就是說,若是A1,A2...Ak是最好的方法,那麼其機率知足
P(A1,A2...Ak) > P(B1,B2,...Bm) 且 P(A1,A2...Ak) > P(C1,C2,..Cn)

若是窮舉全部可能的分詞方法並計算出每種可能性下句子的機率,那麼計算量是至關大的,所以,能夠把它當作是一個動態規劃(Dynamic Programming)的問題,並利用維特比(Viterbi)算法快速地找到最佳分詞。

通常來說,根據不一樣應用,漢語分詞的顆粒度大小應該不一樣。好比在機器翻譯中,顆粒度應該大一些,「北京大學」就不能被分紅兩個詞。而在語音識別中,「北京大學」通常是被分紅兩個詞。所以,不一樣的應用應該有不一樣的分詞系統。

語言處理的許多數學方法是通用的,和具體的語言無關。

分詞的一致性

在將統計語言模型用於分詞之前,分詞的準確率一般較低,能夠提高的空間很是大。不一樣的人切分的區別雖然會影響分詞評測的準確性,可是好的方法和壞的方法仍是能夠根據分詞結果與人工切分的比較來衡量的。

當統計語言模型被普遍應用後,不一樣的分詞器產生的結構的差別要遠遠小於不一樣人之間見解的差別,這時簡單依靠與人工分詞的結果比較來衡量分詞器的準確性就毫無心義了。所幸的是,中文分詞如今是一個已經解決了的問題了,提升的空間微乎其微了。只要採用統計語言模型,效果都差不到哪裏去。

詞的顆粒度和層次

人工分詞產生不一致性的緣由主要在於人們對詞的顆粒度的認識問題。

不一樣的應用中,應有不一樣的顆粒度。一個好的方法是讓一個分詞器同時支持不一樣層次的詞的切分。原理介紹以下:
首先須要一個基本的詞表(包括像「清華」、「大學」這樣沒法再分的詞),和一個複合詞的詞表(包含複合詞以及它們由哪些基本詞構成,包括像「清華大學:清華-大學」)。
接下來須要根據基本詞表和複合詞表各創建一個語言模型,好比L1和L2.而後根據基本詞表和語言模型L1對句子進行分詞,就獲得了小顆粒度的分詞結果。最後,在此基礎上,再用複合詞表和語言模型L2進行第二次分詞。

分詞的不一致性能夠分爲錯誤和顆粒度不一致兩種,錯誤又分紅兩類,一類是越界型錯誤,好比把「北京大學生」分紅「北京大學-生」。另外一類是覆蓋型錯誤,好比把「賈里尼克」拆成了四個字。

對於某些應用,須要儘量地找到各類複合詞,而不是將其切分。所以,須要花一些功夫作數據挖掘的工做,不斷完善複合詞的詞典(它的增加速度比較快),這是近年來中文分詞主要花精力的地方。

相關文章
相關標籤/搜索