之前看網上很多人推薦《數學之美》這本書,因為書名有數學二字,盡管有很多人說內容基本是科普性質,但心中總是總是有畏難情緒(博主是數學渣),最近因為公司工作偏向爬蟲方向,自己又在研究machine learning,恰巧看到此書內容與爬蟲,搜索引擎,自然語言處理內容相關,就買了一本,誰成想一讀就對書中內容着迷了,遂寫下此博客。
首先,我想告訴那些和博主同樣對數學苦大仇深的同學們,完整掌握這本書的內容確實需要一定的數學背景,但作者很巧妙的將這些'高深'的東西作為補充內容,對理解大多數概念並無阻礙,另外,此書雖名為數學之美,更多的是探討數學在實際生產(尤其是NLP)中的應用。
一.自然語言處理
"任何一種語言都是一種編碼的方式,而語法規則是編解碼的算法",事實上,在我看來,這個概念在自然語言處理中用的到,在計算機網絡中亦然,發送方將信息從上至下各層進行編碼,接收方收到消息之后層層解碼。類比到自然語言中,人們試圖使機器擁有智能,理解人類語言。
在自然語言處理發展之初,人們試圖用電腦來模擬人腦,而當時人們處理句子通常是通過類似於編程語言編譯器那樣經過詞法分析,語法分析最后得到一個抽象語法樹,而我們的高級編程語言通常語法很簡單(相對於自然語言來說),而且是基於上下文無關文法的。所以這種基於文法規則的方式在面對復雜句時就顯得乏力了。在這種思路失敗后,后來的自然語言處理完全是基於數學/統計學上的。(果然數學才是王道啊)。
在這里一個簡單的例子說明基於規則方式的難處:一句簡單的英語:The box is in the pen,事實上,這里的pen是圍欄的意思,但計算機卻很難理解一詞多義的概念。
二.統計語言模型
既然自然語言處理從規則過渡到統計,那么必須對其進行數學建模,即本章提到的統計語言模型。
一個句子是否正確,在統計語言模型中,需要看它出現的可能性有多大:
假設S是一個有意義的句子,由一系列詞組成:w1,w2....wn (n=S.length),那么首先第一種方式可以看S在所有文本(即歷史上所有語言)中出現的可能性:P(S),但這 顯然不可能。另一種方式是我們將P(S)展開,P(S)=P(w1,w2,...,wn),根據條件概率,可以得出:P(S)=P(w1)*P(w2|w1)*P(w3|w1,w2)....P(wn|w1,w2...wn-1)。
但這種方式計算條件概率越靠后的詞計算復雜度越高,怎么辦?這里就用到了馬爾科夫假設,一個詞出現的概率只和它之前的詞有關,即P(S)=P(w1)...P(wn|wn-1)。
當然也可以假設一個詞和前面的N-1個詞相關。
現在,根據條件概率公式,可知P(wi|wi-1) = P(wi-1,wi)/p(wi-1), 我們可以通過計算相對頻度得到概率(根據大數定理), P(wi|wi-1) = #(wi-1,wi)/#(wi-1)。(分子表示wi-1和wi前后相鄰在語料庫中出現的次數,分母表示wi-1在語料庫中出現的次數)。
事實上,一個詞出現的概率不可能只和它前面的詞有關,這就引出了高階語言模型的概念,我們可以假設一個詞和前面N-1個詞相關,這就是N-1階馬爾科夫假設,當N=1時,顯然就是一個上下文無關的模型。
三.中文分詞
英語中詞之間存在天然的分解符,而中文則不然,所以需要先對句子分詞,再使用語言處理模型。最簡單的中文分詞法是查字典,從左至右掃描句子,遇到詞典中有的詞就標識
出來,復合詞查找最長匹配,如果字典中沒有的字串就分割成單字。
並非所有的句子都能使用最長正向匹配,中文分詞同樣可以使用上文的統計語言模型進行分詞,假設一句話有幾種分詞方式,那么最好的一種應該確保分詞后這個句子出現的概率最大,而這種方式同樣可以用在手寫體識別中,因為手寫單詞之間空格不清晰,中文分詞法可以幫助確定單詞邊界。
另外,不同應用應該有不同的分詞粒度,機器翻譯中,分詞粒度最好大一些,比如‘聯想公司’作為整體可以很容易找到單詞Lenovo,而搜索中,分詞粒度最好小一些,比如清華大學這個詞,如果作為一個詞的話,用戶輸入清華時則獲取不到清華大學的信息。