乙個基本的搜尋引擎的工作,基本上可以分成以下三個部分:
第乙個部分主要涉及網路爬蟲技術、圖論、自然語言處理等技術;
第二個部分主要涉及自然語言處理;
第三個部分同樣涉及自然語言處理。
自然語言,即是人類用來交流的語言。
由此可見,自然語言處理(nlp, natural language processing)是現代搜尋引擎很重要的內容,其終極目的是將自然語言轉化為計算機容易處理的形式。
分詞是 nlp 需要解決的基礎問題,分詞演算法的好壞直接影響 nlp 的結果。
這裡我們先從乙個簡單的例子說起,逐步**合理的分詞演算法。
從乙個簡單的句子說起,現在有乙個句子,比如:
我去電腦城買了一台電腦。
如果要讓計算機對這個句子做分詞處理,進而理解這個句子,你會有怎樣的思路呢?
大多數人首先會思考一下自己是怎麼理解這個句子的。對於中國人來說,這樣乙個簡單的句子,可能不需要什麼特殊的思維過程。句子的文字形式和句子背後的含義可以在瞬間反映出來。稍有漢語文法知識的讀者,可能會想:
句子可以分成幾個部分
我 - 主語它先通過文法分析,將句子拆分成乙個二維的語法樹,然後再理解各個部分的含義,最後做拼接。去電腦城買了一台電腦 - 謂語
去電腦城 - 狀語
買了 - 謂語動詞
一台電腦 - 動詞賓語(名詞短語)
。 - 句子結束的標識
這樣的方案(或者說是演算法)是基於文法規則的,清晰明了,也易於實現(在計算機裡就是幾個迴圈判斷)。對於程式設計師來說,這樣的演算法也特別親切。因為程式設計師使用的高階程式語言(比如 c++)的語法規則和這樣的方案非常相似。
由於這樣的演算法直觀、易於實現,所以人們相信在有了愈加全面的文法概括和愈加強大的計算能力時,人們就能徹底解決自然語言處理的問題了。
然而,如果你仔細觀察文法分析的過程就會發現,這麼乙個簡單的句子被分成了乙個這樣複雜的二維樹狀結構,耗費了六條注釋。用計算機來處理這樣乙個過程當然不難,但是要處理現實生活中遇到的真實句子,往往就不那麼容易了:
由於理解(understanding)自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力,自然語言認知,同時也被視為乙個人工智慧完備(ai-complete)的問題。這個句子依然可以用上述方法來處理:
比如:
自然語言認知 - 主語 - 偏正短語這個句子的語法分析樹我沒有寫完,因為實在太複雜了。顯而易見,單純基於文法分析的分析器是很難處理生活中的真實句子的。自然語言 - 名詞作定語修飾
認知 - 名詞
由於理解(understanding)自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力 … 同時也被視為乙個人工智慧完備(ai-complete)的問題 - 謂語
由於理解(understanding)自然語言,需要關於外在世界的廣泛知識以及運用操作這些知識的能力 - 原因狀語……
同時也被視為 - 謂語動詞短語
同時 - 狀語
也被視為 - 謂語動詞
乙個人工智慧完備(ai-complete)的問題 - 動詞賓語
乙個 - 定語
人工智慧完備的 - 定語
問題 - 名詞
。 - 句子結束的標誌
那麼問題出在**?我認為至少有兩個問題。
從演算法複雜度的角度來說,單純基於文法分析的分析器,用於分析自然語言,其複雜度比分析程式語言要高出四個量級。從直觀的印象來說,上述句子在一台現代計算機上用文法分析的方式處理,也需要至少一分鐘的時間。這種低效是無法接受的。
在之前的文法分析方法裡,分詞依賴於文法分析的結果。程式要先輸出語法樹,然後才能得到分詞結果。而這樣的方法已經被證明是低效的。
這樣的低效**於複雜的文法分析過程。為了提高效率,人們很自然地想到:是否有辦法繞開文法分析,直接嘗試分詞呢?對於中文分詞,北京航空航天大學的梁南元教授提出了查字典分詞法。做法相當簡單,比如對於下列句子:
山東大學數學學院是中國最好的數學基礎教育基地之一。我們讓計算機從左到右掃瞄整個句子,每掃到乙個字,就往字典裡查詢,遇到字典裡有的詞就標註出來。於是整個句子就被分割成了這樣:
山東|大學|數學|學院|是|中國|最好的|數學|基礎|教育|基地|之一。
看起來結果不錯。不過細心的讀者很快就會發現:山東大學和基礎教育都是完整的詞,在它們之間不應該再做劃分。會出現這種情況也不意外,我們要求計算機從左到右掃瞄。當計算機遇到「山東」二字的時候,就認為這是乙個詞了,自然不會再去尋找下乙個字去尋求匹配。同理基礎教育。
梁教授提出了乙個方案,即總是搜尋盡可能長的分詞。這在電腦科學領域叫做「貪婪」。運用貪婪的辦法,上述句子的分詞就會變成:
山東大學|數學|學院|是|中國|最好的|數學|基礎教育|基地|之一。
看起來就沒什麼問題了。
不過,漢語博大精深,這種辦法也不能一勞永逸。比如:
大學生活區正確的分詞應該是:
大學|生活區
但是按照貪婪的辦法,會被分詞成:
大學生|活|區
這就不對了。
又比如:
發展中國家正確的分詞應該是:
發展中|國家
而不是:
發展|中國|家
可見,查字典的辦法雖然效率很高,但是時有出錯,並不牢靠。
查字典的辦法遇到的困境來自於自然語言的歧義性。人類在閱讀自然語言時,會結合上下文判斷有多個意向的詞彙在文中的具體含義,但是計算機卻沒有這個能力。實際上,中國傳統文學裡說的「句讀」,其目的就是通過分詞斷句來消除歧義。那麼,怎麼讓計算機具備這樣的能力呢?
行文至此,數學終於要第一次展現其威力和美麗。
我們之前提到,對乙個句子做分詞,其正確與否和詞彙的二義性緊密相關。由於計算機無力綜合上下文判斷詞彙含義,解決二義性,所以查字典的辦法陷入了困境。
數學中有所謂的「反證法」。在這裡我們不講反證法,但是要講講反證法的思想。反證法的核心思想就是「正難則反」:正面突破很困難,那就不走大路,開個後門照樣進城。在這裡,既然計算機沒有能力綜合上下文解決詞彙的二義性,那麼我們就不依賴計算機智慧型去解決,轉而借助人工的力量解決。當然,我說的不是找乙個工人實時干預程式的執行,幫助程式作出正確的判斷;而是說,讓計算機經過大量的文字訓練,吸取人類的「分詞經驗」。而這個方法,就是統計模型。
假定乙個句子 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) 需要一點統計知識和技巧;得到這些分詞方案也需要依靠動態規劃演算法(不然計算量太大);還有諸如分詞顆粒大小之類的細節問題需要處理。這些內容我們放在後續的小節裡討論,在這裡,讀者只需要知道這種利用統計的方法處理分詞效果好、效率高就可以了。
對於**分詞來說,統計模型的方法效率比文法分析的方法高,同時效果也要好。**這裡效率的提公升是十分顯著的。
此外,我們發現乙個優秀演算法背後的數學模型是十分簡潔優美的。統計模型只需要乙個概率不等式組就可以描述,而文法分析模型幾乎無法構建乙個可讀的數學模型。我們在設計演算法的時候,要盡可能追求簡潔優美的數學模型,從簡單粗暴做起,逐步完善完美。正如牛頓爵士所言**「真理在形式上總是簡單的,而不是複雜含混的」。**
最後,文法分析方法是十分容易想到的,十分自然的處理方法,然而這種「自然」也使人誤入歧途。這提醒我們,不可固執,不可迷信經驗。
自然語言處理
自然語言處理主要步驟包括 2.詞法分析 對於英文,有詞頭 詞根 詞尾的拆分,名詞 動詞 形容詞 副詞 介詞的定性,多種詞意的選擇。比如diamond,有菱形 棒球場 鑽石3個含義,要根據應用選擇正確的意思。3.語法分析 通過語法樹或其他演算法,分析主語 謂語 賓語 定語 狀語 補語等句子元素。4.語...
自然語言處理
前言 自然語言處理 natural language processing 是計算科學領域與人工智慧領域中的乙個重要方向。它研究能實現人與計算機之間用自然語言進行有效通訊的各種理論和方法。自然語言處理是一門融語言學 電腦科學 數學於一體的科學。因此,這一領域的研究將涉及自然語言,即人們日常使用的語言...
自然語言處理
一 字串操作 去空格及特殊符號 s hello,world 預設把左右空格去掉 print s.strip print s.lstrip hello,print s.rstrip 查詢字元 0 為未找到 sstr1 strchr sstr2 tr 找到返回目標子串開始下標 npos sstr1.in...