2010年6月4日 星期五

用Python也能輕鬆玩自然語言處理(1.5)

1.5 自然語言的自動學習

我們已經藉由文本與Python程式語言對語言作了一些基本的探索,然而我們更感興趣的是把這些有用的語言計算技術用到一些知識加值或產生新知識的領域,例如資料探勘的工作。因此在之後的章節,我們絕對有必要在自然語言處理中專注更多的基礎知識!

實務層面上,我們在廣大的網路世界中航行時,對於一些特定的網頁資訊的蒐集與整理是需要一些協助的。搜尋引擎當然是為此而蓬勃發展的網路工具,但它有它的限制與缺點。當我們試圖去找尋一些問題的解答,如有沒有一個旅遊網站可以提供給我一些資訊如何以有限的預算在費城與匹茲堡間旅遊?專家是如何看待數位單眼相機的...等等,我們會發現要解決這些問題是利用搜尋引擎時,是需要技巧的、知識的,甚至是運氣!我們多麼希望電腦能回答這類問題,然而這些問題明顯地涉及了各式各樣的語言處理工作,包括資訊擷取(information extraction)、推論(inference)、自動化摘要(summarization)等,要能有效地去做這些工作需要一些大規模或更加深入的知識。

而在
理論層面上,利用人工智慧發展出一套智慧型的機制一直是一項長期的挑戰,其中佔有重要角色的就是自動理解,或是說機器學習。經過了許多年的努力,這個目標的達成依舊是十分的艱難,但是自然語言處理的技術卻是越臻成熟,用自動的方法去分析非結構的文本變得是一件常見的事,這種自然語言的自動學習也成為一種公認的領域。


在這小節中,我們將介紹一些語言學習的技術,來告訴你接下來我們要走的路還有多長!


字義辨識(Word Sense Disambiguation)


在字意辨識的領域中,我們將焦點放在某些字在文章上下文(脈絡)中的意義辨別,我們來看「serve」與「dish」這組字:


a.   serve: help with food or drink; hold an office; put ball into play

b.   dish: plate; course of a meal; communications device

像在「he served the dish」這句話中,你可以發現「serve」與「dish」都與食物有密切的關連,即使它們還有其他意思,但一定你不會去想到這句話可能會有運動或是碟子之類的含意。換句話說,我們可以透過一些這些文字組合的上下文去進行自動的字義辨識工作。另一個必須透過脈絡來判斷字義的例子「by」,如果是「the book by Chesterton」這裡我們就可以猜出by應該是講這本書是誰寫的(人);如果是「the cup by the stove」這裡我們就可以猜出by是在指位置(被偷走);如果是「submit by Friday」這裡就可以猜出by是指一個時間的概念(繳交期限)。下面的例子就告訴我們可以利用斜體的文字來判斷by的含意:


a.   The lost children were found by the searchers (主格、人)

b.   The lost children were found by the mountain (位置、所在)

c.   The lost children were found by the afternoon (時間)



代名詞辨認(Pronoun Resolution)


另外更深入的語言理解是專注於「誰對誰做什麼事(who did what to whom)」,也就是自動偵測主詞、動詞語受詞的工作。你可能以前早就在英文課時學會了,但其實他比你想像中的還困難唷!「the thieves stole the paintings」這句話也許是一個簡單的陳述句,但是他的後面可能會產生各種混淆的主詞的句法,如下:



a.   The thieves stole the paintings. They were subsequently sold.

b.   The thieves stole the paintings. They were subsequently caught.

c.   The thieves stole the paintings. They were subsequently found.


「they」到底是指什麼?畫?還是小偷?許多運算技術可以處理這個問題,如對應關係辨別(anaphora resolution)、語意角色標記(semantic role labeling)等。



產生語言輸出


如果我們可以有效地解決上述的這類型語言理解的工作,就可以進一步地把焦點放在結果的輸出,像是QA問題解決系統(question answering)或機器翻譯器(machine translation)等。前者的電腦應該能夠回答使用者在文本上的問題:



a.   Text: ... The thieves stole the paintings. They were subsequently sold. ...

b.   Human: Who or what was sold?

c.   Machine: The paintings.


電腦能夠正確地回答使用者「they」所指的是畫,而非小偷!


後者所談的機器翻譯或自動翻譯,顧名思義就是可以自動地將一種語言翻譯成另一種語言,並精確地傳達原始文本的含意。如果要把之前的例子翻成法文的話,第二句話代名詞(they)的類型將會是一個重點,若是指小偷則是「ils (陽性詞)」、若是指繪畫則是「elles (陰性詞)」。由此可見,正確的機器翻譯技術必須仰賴這些語言上的機器理解與學習,才可能正確無誤地進行翻譯:



a.   The thieves stole the paintings. They were subsequently found.

b.   Les voleurs ont volé les peintures. Ils ont été trouvés plus tard. (the thieves)

c.   Les voleurs ont volé les peintures. Elles ont été trouvées plus tard. (the paintings)


從這些例子中可以理解到,一個句子的意義是透過文字的含意、動詞的主詞與代名詞的意義等所構成,而我們所希望看到的就是透過語言理解系統去有效且正確地預測這些事情。



機器翻譯(Machine Translation,MT)


長久以來,機器翻譯就是語言學習的最終目標,目的就是希望提供高品質、道地的各種語言自動翻譯。源自於冷戰時期政府對自動翻譯的大量贊助,同時也開啟了自然語言處理大門。今日的翻譯技術已經在幾種語言中逐漸成熟並且結合到搜尋引擎之中,但還是有很多缺點。我們可以利用NLTK中的翻譯工具「babelizer」(記得先載入from nltk.book import *)來玩玩看!這支程式可以把輸入的句子翻譯成各種語言,也會再把結果句子反向翻譯回來,它會在第12次或是重複翻譯出之前出現過得句子時停止:


>>> babelize_shell() 
NLTK Babelizer: type 'help' for a list of commands. 
Babel> how long before the next flight to Alice Springs? 
Babel> german 
Babel> run 
0> how long before the next flight to Alice Springs? 
1> wie lang vor dem folgenden Flug zu Alice Springs? 
2> how long before the following flight to Alice jump? 
3> wie lang vor dem folgenden Flug zu Alice springen Sie? 
4> how long before the following flight to Alice do you jump? 
5> wie lang, bevor der folgende Flug zu Alice tun, Sie springen? 
6> how long, before the following flight to Alice does, do you jump? 
7> wie lang bevor der folgende Flug zu Alice tut, tun Sie springen? 
8> how long before the following flight to Alice does, do you jump? 
9> wie lang, bevor der folgende Flug zu Alice tut, tun Sie springen? 
10> how long, before the following flight does to Alice, do do you jump? 
11> wie lang bevor der folgende Flug zu Alice tut, Sie tun Sprung? 
12> how long before the following flight does leap to Alice, does you?


可以觀察到「Alice Springs」從第一行將英文翻成德文之後,在第2行翻回英文時卻翻成了「Alice jump」!原本會把「before」對應到德文的「vor」也從第5行開始變成「bevor 」,而第5行之後的句子也變得沒有意義了(但可以注意一下逗號的存在會影響jumpleap的出現)!這個翻譯系統碰到特定名稱時會無法辨識,並產生錯誤的文法結構。如下面的例子,是約翰找到豬?還是豬找到約翰?


>>> babelize_shell() 
Babel> The pig that John found looked happy 
Babel> german 
Babel> run 
0> The pig that John found looked happy 
1> Das Schwein, das John fand, schaute gl?cklich 
2> The pig, which found John, looked happy


機器翻譯目前仍是相當困難的差事,因為特定的字通常可能會有許多種翻譯方式,特定語言的字詞排列順序也必須重新組合。在今日,這些困難通常會利用大量蒐集一些新聞或政府網站的文本(因為它們通常是多語言版本的)來加以處理,讓機器去理解與學習一些翻譯上的規則。例如有一份文件同時有德文版與英文版,我們就可以把它們的句子拿來自動配對,這過程叫做「text alignment」!一旦我們擁有數以百萬或更多的句子配對時,就可以偵測一些相對應的字詞組合並建立一個預測模型來嘗試去翻譯新的文本。


自動交談系統(Dialogue systems

在工人智慧的發展歷程中,主要智慧的測量基準為著名的「圖靈檢定(Turing Test)」,透過一個互動交流的機制,根據使用者所提出的文本資訊,給予一個回應訊息,而這個訊息的回應是否能夠讓使用者無法分辨出「這是電腦回的?還是真人回給我的?」,我們當然是希望可以無法分辨(就跟真人一樣,也就表示通過圖靈檢定)。今日的商業交談系統絕對還離這個憧憬有一段距離,但在一些特定領域中仍具備一些有用的功能,如(S系統與U使用者):


S: How may I help you?
U: When is Saving Private Ryan playing?
S: For what theater?
U: The Paramount theater.
S: Saving Private Ryan is not playing at the Paramount theater, but
it's playing at the Madison theater at 3:00, 5:30, 8:00, and 10:30.


系統不會主動提供給你鄰近地區的一些行駛、餐飲資訊,除非它們已經被問答資訊系統配對在一起。仔細觀察這個系統會發現他似乎可以瞭解使用者的目的:例如要察看某部電影的放映時間。我們看起來很正常的事,其實整個互動過程中自然語言處理扮演了重要的角色,沒有它,當系統被問到「Do you know when Saving Private Ryan is playing?」系統恐怕只能冷冷地回答「Yes」。然而商業性的交談系統實際運作時會採用情境式的邏輯判斷,去確保使用者在提出要求時的不同措辭(但其實他們想問的都大同小異),如「何時...」、「我想要知道何時...」、「你可以告訴我何時...」等等都會被過濾,這樣的設計會幫助系統更有效的提供服務。



自動交談系統提供給我們一個對自然語言處理(NLP)的明確輪廓,如上圖展示了一個簡易的交談系統流程架構,其實就跟真實世界的傳播原理有異曲同工之處,從使用者左方到右方提供給系統資訊後一路進行資訊解碼(音韻學、型態學、語法、語意到意義),解構完畢後由右方到左方反向地一路包裝資訊並提供回應給使用者。然而每個環節都需要有其相對應的資料庫去分析與對應才能正確有效地去預測語言。


原文意涵(Textual Entailment)

近年來「RTE(Recognizing Textual Entailment)」的議題逐漸在自動語言學習中被重視。例如你想要找證據來支持一個假設:Sandra Goudie 被Max Purnell所擊敗。而現在你取得了一段文字似乎與這個假設有關,「Sandra Goudie 在2002年的議會選舉中,以些微差距擊敗曾經贏過工黨候選人Max Purnell與現任國會議員Jeanette FitzsimonsCoromandel

這段文字可以支持那個假設嗎?我們當然會直接說「NO」,但是要給電腦做這種判斷的時候可就沒這麼自然而然囉!對電腦來說,原文的真實意含並不容易判讀(有時候人都聽不懂),因此需要更多的語言學分析介入分析。所以上述的文件中,電腦必須判斷把
Sandra Goudie擊敗的人到底是誰?接著才能驗證假設,但顯然地那段文字並沒有談到。下面這組例子也是一件困難的差事:



a.   Text: David Golinkin is the editor or author of eighteen books, and over 150 responsa, articles, sermons and books

b.   Hypothesis: Golinkin has written eighteen books


為了判斷這段文字(a)是否支持此假設(b),系統必須擁有以下的背景知識(1)如果一個人是這本書的作者,就表示他寫了這本書。(2)如果一個人是這本書的編輯,則表示這本書不是全靠他自己寫的。(3)如果有一個人在18本書的製作中,不是擔任作者、就是編輯,那就無法下結論說他就是這18本書的作者。



自然語言處理(NLP)的限制


即使有這麼多的研究都以NLP為核心,但要使自然語言的系統應用在真實環境中仍是一大困難,如將一些基本常識或判斷融入機器的行為。也許我們可以等待未來人工智慧來克服這個問題,但同時我們必須深入瞭解目前自然語言系統的能耐。因此如同我們一開始說的,如何使電腦進行「語言理解」是最困難與重要的議題(目前的技術發展還是不夠深入到語言的本質)。的確,這也是這本書的撰寫目的,希望你能夠具備這些NLP的基本知識與技巧,假以時日在建立一部真正的智慧型系統時盡一份心力!


下一節:第二章 存取語料庫與詞彙資源(序言+2.1存取語料庫)

沒有留言: