人工智慧繼續進步的關鍵,自然語言處理概述

機器之心發表於2016-04-25

如果一臺計算機能夠欺騙人類,讓人相信它是人類,那麼該計算機就應當被認為是智慧的。——阿蘭·圖靈


當我還是個孩子的時候,我讀了 Jeremy Bernstein 的一本書《分析引擎——計算機的過去、現在和將來》。在圖靈機(Turing Machine)或加法器(Pascaline)等迷人的概念之間,Bernstein 提到機器翻譯是計算機可以執行的一種任務。試想一下:一臺能夠理解語言文字並擁有將其翻譯成另一種語言所需知識的機器。


機器能像我們人類一樣理解文字嗎?我知道,這聽起來有點難以置信。而且多年以來那對我來說就像是魔術,直到我發現了一個解決這類問題的領域——自然語言處理(NLP:Natural Language Processing)。是的,透過人工智慧、計算語言學和電腦科學的力量的結合,NLP 讓機器可以理解自然語言,這項任務到目前為止都還只是人類獨有的特權。


第一次應用 NLP 是 20 世紀 50 年代從俄語到英語的機器翻譯。那時的結果不是特別好,而接下來的幾十年中還有以下一些案例說明了該領域的限制:當《聖經》中的句子「The spirit is willing but the flesh is weak(心靈固然願意,肉體卻是軟弱的)」被翻譯成俄語後再被翻譯回英語時,結果是「The vodka is good but the meat is rotten(伏特加很不錯但肉爛了)」。好吧,這只是一個主要受直譯的缺陷所啟發的故事,但它通常被認為是一個實際的案例,多年以來一直在敗壞 NLP 領域的名聲。


自 20 世紀 50 年代以來,人們已經取得了很多進展,而當網際網路從友好的計算機小型社群成長為可利用資料的巨型資源庫時,NLP 就變成了經濟和社會發展中的一個主要問題。我撰寫本文的目的是給出該領域的一個簡要介紹,並嘗試解釋我們日常所用的一些應用背後的一點「魔法」。本文的目的不是給出關於該領域的廣泛而深刻的見解,也不會是給出正式定義或精確的演算法和技術。這只是一篇概述,而且如果這些內容能夠激發你對這一已讓我著迷多年的領域的好奇心,我就會非常高興了。


即使我們不知道,但NLP無處不在


自然語言處理方面讓我吃驚的一件事是儘管這一術語並不如大資料(Big Data)或機器學習(Machine Learning)那樣流行,但我們每天都在使用 NLP 應用或受益於它們。下面是 NLP 應用廣泛使用的一些例子:


機器翻譯


也許你已經使用過機器翻譯並且現在它對你來說似乎是一個自然的功能:Twitter 上的地球圖示、Facebook 帖子中的「檢視翻譯」連結、谷歌和必應的搜尋結果、一些論壇或使用者稽核系統。


我們已經遠遠超越了「spirit(心靈)」與「vodka(伏特加)」的故事,但翻譯的質量是波動的,有時候並不好。機器翻譯在一些特定的領域工作良好,即當詞彙和慣用語的結構主要是已知的時。例如,當翻譯技術手冊、支援內容或特定的目錄時,機器翻譯可以顯著地降低成本。


然而,在一般情況下仍有改進的空間。我想,你收到過你有資格享受退稅或某個遙遠國度的好心人堅持向你的拖欠賬戶轉入數百萬美元浮游資金的郵件。而其中一些是用糟糕的英語寫成的,幾乎無法理解,對不對?嗯,有時候機器翻譯的結果會給你同樣的印象。問題在於儘管這些詐騙郵件是故意寫成那樣以獲得信任或透過垃圾郵件過濾器的,但當你試圖理解用外語寫成的指示列表或包裝說明書時,糟糕的翻譯真的會成為一個問題。


讓我們假設你正在旅行,而且你必須處理以下文字:


越式炸春捲


即便有各種可能的術語和語法錯誤,但有一個拍張照片就能得到以下譯文的應用難道不是很好嗎?


Vietnamese fried spring rolls(直譯為:越南的炸過的春天卷)


自動摘要(automatic summarization)


和機器翻譯一起,自動摘要提出於 20 世紀 50 年代:對於給定的文字,目標是獲得一個包含了其中最重要資訊的簡化版本,一個可以透過提取(extraction)或抽象(abstraction)得到的摘要。


基於提取的方法可以檢測輸入文字(通常是句子)的最重要部分,並將其提取出來構建一個摘要。除了決定每個句子的相關性問題,基於提取的摘要器(summarizer)還必須解決連貫性的問題。比如,摘要中的句子可以引用不存在於摘要中的句子元素,這個現象被稱為懸垂回指(dangling anaphora):


「大眾的新 CEO Matthias Mueller 為他削減了他的工作。Mueller 的大部分職業生涯都在大眾集團所以他知道該公司的內部運作。現在專家表示他將不得不做出一些大且大膽的變革以讓這家世界上最大的汽車製造商回到正軌。」


在上面的例子中,如果只有第三句被系統保留,那麼讀者肯定會問這個摘要所談論的「他」到底是誰。


另一方面,基於抽象的方法意味著文字生成(text generation):摘要器並不從輸入中複製文字,而是用自己的話寫出其從文字中所理解到的內容。這個方法極其複雜,目前大部分可用的系統都使用的是基於提取的方法。


當涉及到給出一組期刊新聞的資訊概述時,自動摘要是尤其讓人感興趣的。一些被稱為多文件摘要(multi-document summarization)的方法可以將多個文件濃縮成一份摘要。這在避免來自不同文件的冗長和最大化多樣性上是很重要的。一些其它方法將建立摘要視為關鍵詞的簡單列表,所以它們更像是關鍵短語或關鍵詞提取器。你可能已經見過一些像部落格平臺或科學文獻索引管理器這樣的系統向你建議你的文章或論文中最重要的概念。


情感分析(sentiment analysis)


情感分析的目的是識別文字中的主觀資訊。它可以是一個判斷、意見或情緒狀態,而且最近它對那些想要了解自己在網際網路上聲譽的公司和名人來說是一個重大問題。使用者對我們的產品有什麼看法?他們怎麼看待我的餐廳或我的酒店?他們對我們的客戶支援服務滿意嗎?他們怎麼看待這個競賽?


最常見的情感分析應用是極性檢測(polarity detection),即理解關於某個給定主題的文字是正面的、中立的還是負面的。這似乎很簡單,而且在某些情況下確實如此:


人工智慧繼續進步的關鍵,自然語言處理概述

使用者推文:我真的厭惡綠色 iPhone 資訊


人工智慧繼續進步的關鍵,自然語言處理概述

使用者推文:《黑色彌撒》是一部用來星期天打盹的好電影。我只睡著了兩次,但它就是為了讓人休息的,你懂嗎?


文字分類(text classification)


文字分類的目標是將預定義的分類分配給文字。在例如自動垃圾郵件檢測等一些應用中,分類只有兩個:垃圾郵件和非垃圾郵件。我們稱這樣的應用為二元分類器(binary classifier)。在其它情況下,分類器可以有多個分類,比如按主題組織新聞報導或按領域組織學術論文。因為我們有超過兩種分類或分級,我們將其稱為多類分類器(multi-class classifier)。而要是一篇部落格文章談論的是體育和娛樂又會怎樣?一個分類器如何在多個選項之間選擇正確的分類?嗯,那依賴於具體應用:它可以簡單地選擇最有可能的選項,但有時候為一個文字分配多個分類是有意義的。這被稱為多標籤分類(multi-label classification)問題。


文字分類中並非所有應用都面向語義。比如,我們可以使用一個分類器執行自動語言檢測,即檢測文字是用那種語言寫成的。


人工智慧繼續進步的關鍵,自然語言處理概述

《聯邦黨人文集》封面


一些應用特別複雜。其中我喜歡的一個是作者身份識別(authorship attribution):基於文字的風格,一個系統在合理的誤差範圍內確定其作者。你能想象嗎?這樣一個系統必須知道候選作者的集合,並且還要了解其中每一個作者的一組文字樣本。為風格建模的方法有很多,而風格實際上是個非常複雜的概念。這些系統所使用的一些典型特徵包括詞頻、詞彙豐富度、句子長度和短語結構。儘管這是一個當前的研究主題,但第一個顯著的成果則是在1964 年取得的:Mosteller 和 Wallace 的工作分析了有爭議的《聯邦黨人文集》的作者身份。


會話代理(CA:conversational agent)


你記得《2001 太空漫遊》中的 HAL 9000嗎?HAL 可以說話、思考、還善解人意,他能識別面部、表達感情,甚至還能讀唇語和撒謊。會話代理是能與人類進行連貫對話的系統。它可以以純文字介面的形式呈現,或是口語對話系統。通常對話都有一個確切的目的。例如通常被稱為自動線上助理或聊天機器人的客戶服務 CA 能夠處理使用者的請求和問題,另外還有可以給出旅行建議的 CA 等。


你可能已經和某個會話代理互動過,可能一開始還不知道對方實際上是機器。我也猜想你在對話中意識到了這一點,因為這個對話缺少一些東西,一些人類的東西,對話中一定程度上的流暢性和不可預測性。問題是我們目前離創造 HAL 那樣的智慧實體還相距甚遠。但如果我們專注於特定的主題或任務(只需解決某些受限的或程式化的語言),我們就可以得到相當好的結果。


1964 年,Joseph Weizenbaum 編寫了一個可以模擬與私人心理治療師的對話的計算機程式 ELIZA。以下是可能的對話的一個例子:

ELIZA:請告訴我什麼一直在困擾著你。

你:沒什麼,我今天感覺很高興。

ELIZA:多描述一點這些感覺。

你:呃,我只是高興。

ELIZA:你的治療讓你高興嗎?

你:當然。

ELIZA:關於這個,告訴我多一點。

你:我不想談論那個。

ELIZA:那讓你感到麻煩嗎?


這樣的對話可以持續幾個小時。ELIZA 使用的是非常基本的模式匹配技術,但在當時其影響是非常巨大的。自那以後,我們已經取得了很多進步。


還有其它許多應用


NLP 還有其它很多真實世界的應用。你的電子郵件應用是否會自動檢測事件並建議你將它們新增到日曆中?嗯,這就是被稱為資訊提取(Information Extraction)的 NLP 任務。你會使用拼寫檢查器識別語法錯誤嗎?你是否已經嘗試過手寫識別軟體?像來自麻省理工學院的 Ask.com 或 START 這樣的問答系統?基於內容的廣告呢?蘋果的 Siri、IBM 的沃森?你知道自 2012 年開始福布斯雜誌就在使用講故事的系統 Narrative Science 自動撰寫網路文章嗎?你最近是否看到過機器人領域的巨大進步?


即使我們不知道,但 NLP 無處不在。而且儘管 NLP 應用達到 100% 完美效能表現是非常罕見的,但它們已是我們生活的一部分,為我們所有人提供著寶貴的幫助。

但機器怎樣可以理解文字?


呃,它其實不能……但它可以模擬理解。為了實現這一點,它必須在一定程度上能夠了解自然語言的規則。NLP 處理語言的不同方面:音系學(phonology)、形態學(morphology)、句法學(syntax)、語義學(semantics)和語用學(pragmatics)。而它最大的敵人是歧義(ambiguity)。下面我們將看到不同層次的分析(我會將音系學放到一邊,因為它不太直觀,需要特定的背景)以及 NLP 系統通常如何應對它們。


詞、詞、詞


首先需要理解的是詞,特別是每一個詞的性質。它是一個名詞還是一個形容詞?如果它是一個動詞的屈折形式,那麼它的不定形式是什麼,以及該屈折形式使用了什麼對應的時態、人稱和數?這個任務被稱為詞性標註(Part-of-Speech (PoS) tagging)。讓我們來看看下面的句子:


John bought a book (John 買了一本書)


那麼,有一個直接的方法:我們可以使用一本包含了所有這些詞、它們的屈折形式和詞性的資訊的詞典,以計算下面的輸出:


John/專有名詞

bought/動詞過去式

a/限定詞

book/名詞


好吧,讓我們拋開這樣一個事實:語言是一種極為豐富的活性實體,因此我們永遠無法知道所有的詞。如我們所見,即使對最簡單的句子而言,這種方法也沒有用。bought 這個詞也可作形容詞,book 還可以是一個動詞或作為字母(在這種情況下它的詞性是名詞)。作為人類,我們通常可以解決這種歧義。但試試解讀下面的句子:


Will Will will the will to Will? (可譯為:Will 將會想把遺囑給 Will 嗎?)


真正的 NLP 應用通常使用兩類方法執行任務:符號的(symbolic)和統計的(statistical)。符號方法由一組為不同語言現象(language phenomena)建模的規則集合組成,這些規則通常是由人工編寫的,但有時也是自動學習到的。統計方法通常使用機器學習演算法來學習語言現象。


Brill 標註器可能是最廣為人知的基於規則的詞性標註器。它使用考慮到語境的轉換規則。首先分配一個詞性標註(最常見的),然後應用規則以得到正確的輸出。所以如果在上面的例子中「bought」首先被標註為了形容詞,可以用一個規則對其進行校正:


如果前面一個詞的標註是專有名詞,那麼:形容詞→動詞


統計方法將詞性標註看作是一個序列標註問題。其基本思想是:給定帶有各自標註的詞的序列,我們可以確定下一個詞最可能的詞性。在例子中,如果我們已經看到了「John bought a」,而且知道它們的詞性,那麼我們就可以肯定地說「book」是名詞而不是動詞。這非常有意義。現在已經有隱馬爾可夫模型(HMM)或條件隨機域(CRF)等統計模型了,這些模型可以使用有標記資料的大型語料庫進行訓練,而有標記的資料則是指其中每一個詞都分配了正確的詞性標註的文字。


從詞到結構


好了,我們的 NLP 應用知道怎麼處理詞了。比如,它可以在一個文字中找到動詞「buy(買)」的所有例項。接下來的問題是:誰買了什麼?對此我們將需要句法分析。那是個艱難的問題,有時甚至對人類來說也很困難。比如在下面的句子中:


I saw a man on a hill with a telescope (譯者注:這句話有多重歧義,可譯為「我看見山上一個帶著望遠鏡的男人」或「我在山上用望遠鏡看見一個男人」或「我用望遠鏡看見一個男人在山上」或「我看見一個男人在有望遠鏡的山上」)


我有望遠鏡還是那個男人有?還是說望遠鏡在山上?我在山上還是他在山上?

 

如你所見,句法可能會非常棘手。我們必須瞭解詞是怎麼組成被稱為詞塊(chunk)的單元的,以及這些詞塊是如何相互聯絡的。為此,我們使用語法。比如:


句子 → 名詞片語 + 動詞片語

名詞片語 → 限定詞 + 名詞

名詞片語 → 專有名詞

動詞片語 → 動詞 + 名詞片語

專有名詞 → John

動詞 → bought

限定詞 → a


對於這種語法,一旦在一個被稱為解析(parsing)的過程中對我們的例句進行了分析,就構建了一個解析器樹(parser tree);然後我們就知道是「John」買了「a book」。語法可以人工編寫,也可以從樹庫(treebank)學習到,樹庫是指用解析器樹註釋過的文字語料庫。


獲取詞的含義


幽默格言「Time flies like an arrow. Fruit flies like a banana.」(譯者注:fly 做動詞表示飛行,做名詞表示蠅。這個格言有多種譯法,最正常的是:時光飛逝如箭,果蠅喜歡香蕉;最不正常的是:時間蒼蠅喜歡箭,水果像香蕉一樣飛行)完美地說明了語義歧義的複雜性。語義歧義有兩個主要問題:


1. 多義詞:具有多種含義的詞

2. 同義詞:具有類似含義的不同詞


此外還有一些其它的重要的語義關係,如反義關係和上下義關係,但多義關係和同義關係通常是最有意義的。


詞彙語義學(lexical semantics)處理以詞為單位的含義,而組合語義學(compositional semantics)研究的是詞怎麼結合組成更大的意義。所以存在幾種語義學方法,這仍然是 NLP 的一個重大的開放問題。


詞義消歧(WSD:word sense disambiguation)試圖確定給定句子中多義詞的含義。讓我們以下面的句子為例:


The tank is full of soldiers.

The tank is full of nitrogen. 

(譯者注:tank 有多個含義,這裡用到的兩個含義是坦克和罐子。上面兩個句子可正常地譯為:「坦克裝滿了士兵」和「罐子充滿了氮氣」。)


如你所見,這確實是個非常困難的問題。在上面兩個句子中,詞性標註和句法都是一樣的。一個 NLP 應用如何知道每個句子中「tank」的含義呢?嗯,可以使用一種深度的方法。它需要關於世界的知識。比如說:一個罐子通常不裝人。當然這成本太高了,所以更為常用的是淺度的方法:對於句子中給定的 tank,它周圍的詞是什麼?這是有道理的:當我們看到詞「soldiers(士兵)」或「nitrogen(氮氣)」時,我們人類可以確定這是什麼 tank。所以詞的共現(co-occurrence)可被用來消除歧義。這個知識可以從每個詞的含義都被正確標記的語料庫中學習到。


詞義消歧領域內的大部分應用都是透過使用 WordNet 執行的;WordNet 是一個非常大的計算詞庫,其中的名詞、動詞、形容詞和副詞各自被組織成了同義詞的集合——同義詞集(synset)。每一個同義詞集代表一個獨特的概念。比如,tank 有五個名詞同義詞集和三個動詞同義詞集。和我們上面例子相關的兩個同義詞集分別是{tank, army tank(陸軍坦克), armored combat vehicle(裝甲戰車), armoured combat vehicle(裝甲戰車)} 和 {tank, storage tank(儲存罐)}。


你可以線上試試 WordNet,看看什麼詞可以是多義詞。也可能想看看其它相關的語義資源,如 FrameNet 或 ConceptNet。


關於組合語義學,事情就變得有點複雜了。首先,其中的關鍵思想是組合原則(principle of compositionality),整體的意義可以透過部件的意義建立。在組合語義學中,該部件通常是指句法分析(syntactic parse)的成分。所以,為了理解一個句子,我們構建它的邏輯表徵。我們可以使用一階謂詞邏輯(first-order predicate logic),其中謂詞有特定的非歧義含義。讓我們想象一位使用者寫出了以下的請求:


a hotel with sea view near San Francisco (舊金山附近的海景酒店)


要正確處理這個請求,該系統必須以非常精確的方式理解它。所以該系統可以構建該請求的以下邏輯表徵:


∃x Hotel(x) Λ View(x, Sea) Λ Near(LocationOf(x), LocationOf(SanFrancisco))


然後該系統可以使用 Prolog 這樣的程式語言來計算結果。當然,這在一般情況下非常困難且昂貴,而且全域性意義並不總是能夠從部件的意義中派生出來,但在有限制的領域內,我們可以得到相當好的結果。組合語義學仍是一個懸而未決的問題,它也是 NLP 領域當前一項關鍵的研究課題。


關於語用學的詞


關鍵不是你說了什麼或怎麼說的,而是語境。語用學(pragmatics)研究的是語境對意義的影響方式。想象一下對話:


JOHN: You are an idiot.  (你是個白痴。)

PETER: Oh, thanks, that’s very kind of you. (哦,謝了,你真是太好了。)


一個 NLP 應用應該認為 Peter 覺得 John 的話是好話嗎?要是 John 只是在開玩笑呢? 諷刺和挖苦是非常複雜的機制。NLP 領域有嘗試特徵化它們的研究工作。比如,我們可以訓練一個分類器來確定某條推文是否是諷刺的。特徵可以包括詞頻(假設不可預測是諷刺的一個訊號)或某些形容詞的使用(假設誇張也是諷刺的一個訊號)等。但儘管目前已有一些有趣的結果,這仍然是一個開放的問題,還有很大的提升空間。


所有這些分析都是所需的嗎?


並不一定。這依賴於具體的應用。例如對於垃圾郵件檢測,你很可能會在詞之上訓練一個樸素貝葉斯分類器(Naive Bayes Classifier)。所以基本上,該應用需要知道的是如何將文字分割成詞,這個過程被稱為標記化(tokenization)。另一方面,如問答系統或資訊提取系統等複雜的應用可能會需要執行形態分析、句法分析和語義分析才能得到恰當的結果。


符號或統計,最好的方法是什麼?


簡短的回答是:它們都不是。關於這個問題的討論有很多,其中立場激進的討論是不可忽略的。據報導,曾領導 IBM 語音識別團隊大約 20 年的 Fred Jelinek 曾說「任何時候只要語言學家離開團隊,識別率就會上升」,這句話常常以一個更為通順的方式被引用:「每次我開除一個語言學家,我們的語音識別系統的效能就會提升」。另一方面,著名語言學家 Noam Chomsky 曾在 1969 年表示「必須承認,在這個詞的任何已知的解釋下,『句子的機率』的概念是完全無用的。」


符號方法主宰了所謂的NLP 的第一個時代。而從 2000 年代開始,統計方法變成了現實,而多年以來,即使更多的批評者也不得不承認統計的 NLP 能給出非常好的結果,而且有時還優於純符號的方法。


統計方法的優點是你可以使用一點資料做很多事。所以如果你想開發一個 NLP 應用,你可能會想從這類方法開始。我推薦你閱讀 Raúl Garreta 關於機器學習的部落格,他給出一些通常來自機器學習領域的統計方法的案例。


統計方法也有其侷限性。當基於 HMM 的詞性標註時代開始時,表現正確率大約是 95%。嗯,這看起來是個很好的結果,5% 的錯誤率似乎是可以接受的。也許吧,但如果你考慮每句話平均 20 個詞,5% 的錯誤率就意味著每句話中都將有一個詞被錯誤地標註了。自那以後,不管是透過更好的訓練資源還是嘗試條件隨機域(CRF)等其它模型,正確率得到了提升;但總會有必須處理的錯誤率。在一些情況下,錯誤率非常低以至於可以認為該問題已得到了解決。自動垃圾郵件檢測就是其中之一。


另一方面,儘管符號方法更為昂貴,但它們卻更容易被人類理解,且不需要機率學和統計學方面的特定背景。此外,在某種程度上,使用這種方法能讓你有更好的控制:在測試之後如果你發現了一些錯誤或缺失的東西,你可以刪除或改變規則或建立新規則。統計方法則沒那麼直接和直觀:你可以提高你的訓練語料庫的質量,你可做特徵工程以確定更好的特徵,你可以建立新的特徵;在任何情況下,你有時都會有在和黑箱打交道的感覺。


所以符號方法和統計方法哪種更好?答案依賴於具體的應用、目標、現有的資源、人的背景、預算等許多變數。你也可以嘗試混合的方法。你可以使用統計方法自動建立規則(就像 Brill 詞性標註器做的那樣),然後最終手動組織它們。或者,你可以手動向統計方法中注入構建知識以改善結果。例如,你可以編寫一個規則宣告:名詞片語永遠不能以限定詞作為結束。這樣就算你的系統是用非組織化的語料庫訓練的,也不會造成錯誤。


結語


十五年前,要讓一家 NLP 公司說未來他們的產品不能以絕對的準確度工作是很困難的。但時代已經改變。隨著更好的搜尋引擎、部落格、社交網路、電子商務的到來,社會慢慢開始理解,即使 NLP 還有待完美,但它已經為我們的日常提供了寶貴的幫助。


NLP 是一個年輕的領域,充滿了希望,而且還有一個持續開發新演算法、技術和資源的國際化社群。它正在快速進步。最近使用深度學習的一些成果驚人地改善了一些艱難的 NLP 任務。人工智慧的進步和網際網路的湧現,兩者之間的結合促使 NLP 達到了幾年之前無法想象的程度。


在 MonkeyLearn(使用機器學習做文字分析的平臺),我們相信 NLP 是一個可以改變遊戲規則的技術,而且它還將塑造網際網路的未來。是的,NLP 是一個困難的領域,而那正是我們想要改變的。我們與 MonkeyLearn 的目標是讓世界上的每一個軟體開發者都能夠使用 NLP,並且還希望能夠帶來下一代智慧應用。想象一下,透過將通常僅限於資料科學家的領域轉變成一種每個人都能夠使用的技術,那會有怎樣的無盡可能!


未來我們將看到 NLP、機器學習和人工智慧能走多遠。有時候我會想,我們會看到隨處可見的機器都能透過圖靈測試的那一天嗎? 

相關文章