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


轉載來源:https://blog.csdn.net/ZLJ925/article/details/79019500
一個基本的搜索引擎的工作,基本上可以分成以下三個部分:

  1. 利用網絡爬蟲下載網頁,分析網頁關鍵詞,製成索引備用;
  2. 理解用戶輸入,確定檢索關鍵詞;
  3. 根據關鍵詞和網頁索引,按照相關性排序列出搜索結果。
  4. 第一個部分主要涉及網絡爬蟲技術、圖論、自然語言處理等技術;

第二個部分主要涉及自然語言處理;

第三個部分同樣涉及自然語言處理。

自然語言,即是人類用來交流的語言。

由此可見,自然語言處理(NLP, Natural Language Processing)是現代搜索引擎很重要的內容,其終極目的是將自然語言轉化爲計算機容易處理的形式。

從分詞的角度來看文法分析與統計模型

分詞是 NLP 需要解決的基礎問題,分詞算法的好壞直接影響 NLP 的結果。

這裏我們先從一個簡單的例子說起,逐步探討合理的分詞算法。

從一個簡單的句子說起,現在有一個句子,比如:

我去電腦城買了一臺電腦。

如果要讓計算機對這個句子做分詞處理,進而理解這個句子,你會有怎樣的思路呢?

大多數人首先會思考一下自己是怎麼理解這個句子的。對於中國人來說,這樣一個簡單的句子,可能不需要什麼特殊的思維過程。句子的文字形式和句子背後的含義可以在瞬間反映出來。稍有漢語文法知識的讀者,可能會想:

  1. 句子可以分成幾個部分

我 - 主語
去電腦城買了一臺電腦 - 謂語
去電腦城 - 狀語
買了 - 謂語動詞
一臺電腦 - 動詞賓語(名詞短語)
。 - 句子結束的標識

  • 分別理解每個部分的意思

  • 將意思拼合起來,變成完整的句意

它先通過文法分析,將句子拆分成一個二維的語法樹,然後再理解各個部分的含義,最後做拼接。

這樣的方案(或者說是算法)是基於文法規則的,清晰明瞭,也易於實現(在計算機裏就是幾個循環判斷)。對於程序員來說,這樣的算法也特別親切。因爲程序員使用的高級編程語言(比如 C++)的語法規則和這樣的方案非常相似。

由於這樣的算法直觀、易於實現,所以人們相信在有了愈加全面的文法概括和愈加強大的計算能力時,人們就能徹底解決自然語言處理的問題了。

文法分析的困境

然而,如果你仔細觀察文法分析的過程就會發現,這麼一個簡單的句子被分成了一個這樣複雜的二維樹狀結構,耗費了六條註釋。用計算機來處理這樣一個過程當然不難,但是要處理現實生活中遇到的真實句子,往往就不那麼容易了:

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

這個句子依然可以用上述方法來處理:

  • 先分成主謂部分
  • 再仔細拆分謂語部分

比如:

自然語言認知 - 主語 - 偏正短語
自然語言 - 名詞作定語修飾
認知 - 名詞
由於理解(understanding)自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力 … 同時也被視爲一個人工智能完備(AI-complete)的問題 - 謂語
由於理解(understanding)自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力 - 原因狀語


同時也被視爲 - 謂語動詞短語
同時 - 狀語
也被視爲 - 謂語動詞
一個人工智能完備(AI-complete)的問題 - 動詞賓語
一個 - 定語
人工智能完備的 - 定語
問題 - 名詞
。 - 句子結束的標誌

這個句子的語法分析樹我沒有寫完,因爲實在太複雜了。顯而易見,單純基於文法分析的分析器是很難處理生活中的真實句子的。

那麼問題出在哪裏?我認爲至少有兩個問題。

  • 文法規則數量巨大,上萬條語法規則才只能覆蓋約 20% 的真實句子;且有些爲了處理特殊情況的語法規則和其他規則相互矛盾。
  • 自然語言與程序設計語言不同,自然語言中詞彙的具體含義與上下文相關,而程序設計語言則沒有這樣的歧義性。

從算法複雜度的角度來說,單純基於文法分析的分析器,用於分析自然語言,其複雜度比分析程序設計語言要高出四個量級。從直觀的印象來說,上述句子在一臺現代計算機上用文法分析的方式處理,也需要至少一分鐘的時間。這種低效是無法接受的。

查字典分詞法

在之前的文法分析方法裏,分詞依賴於文法分析的結果。程序要先輸出語法樹,然後才能得到分詞結果。而這樣的方法已經被證明是低效的。

這樣的低效來源於複雜的文法分析過程。爲了提高效率,人們很自然地想到:是否有辦法繞開文法分析,直接嘗試分詞呢?對於中文分詞,北京航空航天大學的樑南元教授提出了查字典分詞法。做法相當簡單,比如對於下列句子:

山東大學數學學院是中國最好的數學基礎教育基地之一。

我們讓計算機從左到右掃描整個句子,每掃到一個字,就往字典裏查詢,遇到字典裏有的詞就標註出來。於是整個句子就被分割成了這樣:

山東|大學|數學|學院|是|中國|最好的|數學|基礎|教育|基地|之一。

看起來結果不錯。不過細心的讀者很快就會發現:山東大學和基礎教育都是完整的詞,在它們之間不應該再做劃分。會出現這種情況也不意外,我們要求計算機從左到右掃描。當計算機遇到「山東」二字的時候,就認爲這是一個詞了,自然不會再去尋找下一個字去尋求匹配。同理基礎教育。

樑教授提出了一個方案,即總是搜尋儘可能長的分詞。這在計算機科學領域叫做「貪婪」。運用貪婪的辦法,上述句子的分詞就會變成:

山東大學|數學|學院|是|中國|最好的|數學|基礎教育|基地|之一。

看起來就沒什麼問題了。

不過,漢語博大精深,這種辦法也不能一勞永逸。比如:

大學生活區

正確的分詞應該是:

大學|生活區

但是按照貪婪的辦法,會被分詞成:

大學生|活|區

這就不對了。

又比如:

發展中國家

正確的分詞應該是:

發展中|國家

而不是:

發展|中國|家

可見,查字典的辦法雖然效率很高,但是時有出錯,並不牢靠。

查字典的辦法遇到的困境來自於自然語言的歧義性。人類在閱讀自然語言時,會結合上下文判斷有多個意向的詞彙在文中的具體含義,但是計算機卻沒有這個能力。實際上,中國傳統文學裏說的「句讀」,其目的就是通過分詞斷句來消除歧義。那麼,怎麼讓計算機具備這樣的能力呢?

千呼萬喚始出來的統計模型

行文至此,數學終於要第一次展現其威力和美麗。

我們之前提到,對一個句子做分詞,其正確與否和詞彙的二義性緊密相關。由於計算機無力綜合上下文判斷詞彙含義,解決二義性,所以查字典的辦法陷入了困境。

數學中有所謂的「反證法」。在這裏我們不講反證法,但是要講講反證法的思想。反證法的核心思想就是「正難則反」:正面突破很困難,那就不走大路,開個後門照樣進城。在這裏,既然計算機沒有能力綜合上下文解決詞彙的二義性,那麼我們就不依賴計算機智能去解決,轉而藉助人工的力量解決。當然,我說的不是找一個工人實時干預程序的運行,幫助程序作出正確的判斷;而是說,讓計算機經過大量的文本訓練,吸取人類的「分詞經驗」。而這個方法,就是統計模型。

假定一個句子 SS 可以有幾種分詞的方案,比如有以下三種:

A1,A2,A3,…,Aj (1)
B1,B2,B3,…,Bk (2)
C1,C2,C3,…,Cl (3)
其中,A1, A2, B1, B2, C1, C2 等都是漢語的詞彙。這樣一來,如果 (1)(1) 是最好的分詞,那麼 (1)(1) 出現的概率應該最大。也就是說,分詞方案 (1)(1) 應該滿足 (4)(4)。

P(A1,A2,A3,…,Aj)>P(B1,B2,B3,…,Bk) (4)
P(A1,A2,A3,…,Aj)>P(C1,C2,C3,…,Cl)

答案就是這麼簡單。

當然,如何處理 (4)(4) 需要一點統計知識和技巧;得到這些分詞方案也需要依靠動態規劃算法(不然計算量太大);還有諸如分詞顆粒大小之類的細節問題需要處理。這些內容我們放在後續的小節裏討論,在這裏,讀者只需要知道這種利用統計的方法處理分詞效果好、效率高就可以了。

小結

對於**分詞來說,統計模型的方法效率比文法分析的方法高,同時效果也要好。**這裏效率的提升是十分顯著的。

此外,我們發現一個優秀算法背後的數學模型是十分簡潔優美的。統計模型只需要一個概率不等式組就可以描述,而文法分析模型幾乎無法構建一個可讀的數學模型。我們在設計算法的時候,要儘可能追求簡潔優美的數學模型,從簡單粗暴做起,逐步完善完美。正如牛頓爵士所言「真理在形式上總是簡單的,而不是複雜含混的」。

最後,文法分析方法是十分容易想到的,十分自然的處理方法,然而這種「自然」也使人誤入歧途。這提醒我們,不可固執,不可迷信經驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章