自然語言處理和編譯器的對比


知無言說無言說故智慧不生有無即離。皆不可得故自性定無。 - 佛性論

 

從早餐閱讀,到處理電子郵件,再到電商購物,每天面對各種工作上的和生活中的信息,文本是我們需要處理的最主要的數據形式,即便是圖片圖像等更豐富的媒體形式也不可能脫離文本單獨存在。如何用計算機幫助處理這些文本的歸納、理解、提煉、反饋正是自然語言處理(Natural Language Processing, NLP)要解決的問題。

NLP 屬於人工智能的一個子領域,相對人工智能的其他領域還很年輕。在眾多人工智能處理問題的方法中大致可分成基於規則,模擬出“智能”行為;以及基於數據,讓智能算法自己擬合出規則這兩種方式。自然語言也可以從這兩個角度處理問題,基於規則和基於數據並不是不相容,二者有各自的適用范疇,並且可以搭配處理自然語言。其中基於規則的 NLP 算法能有效適用於很多方面。如考慮計算效率,基於規則的方案更有其優勢。因編譯原理和基於規則的 NLP 有很多技術重疊點和相似性,本文對二者做簡單對比,並細數 NLP 的一些關鍵技術點。

 

一、編譯原理基礎

編譯原理成型於五六十年代;而 NLP 到八九十年代才迎來黃金年代,可謂年輕。編譯原理最基礎的理論並非由計算機科學家,而是由語言學家開啟用來對自然語言做建模的。后來卻被廣泛用在編譯原理中。不妨先描述一下編譯原理中這部分的的關鍵基礎知識。

 

1. 文法表示理論

20 世紀 50 年代中期,著名語言學家 Chomsky 描述了四種文法,在他的體系中,根據產生式的形式,文法被分成四類。

設文法 G = (V, T, P, S),逐層增加限制,則:

1.1 G 叫作 0 型文法(type 0 grammar)或短語結構文法(Phrase Structure Grammar, PSG),能力相當於圖靈機。

1.2 如果對於,均有成立,則稱 G 1 型文法(type 1 grammar)即上下文有關文法(Context Sensitive Grammar, CSG)。

1.3 如果對於,均有,並且成立,則稱 G 2 型文法(type 2 grammar)即上下文無關文法(Context Free Grammar, CFG)。

1.4 如果對於均具有形式,其中,則稱 G 3 型文法(type 3 grammar)即正則文法(Regular Grammar, RG)。

其中上下文無關文法和正則文法可用於描述程序設計語言的語法。

在 Chomsky 取得關於語言分類的研究成果之后不久,John Backus 1959 年的國際會議上發表了一篇描述 ALGOL 58 的具有里程碑意義的論文,並在其中介紹了表示程序設計語言語法的一種新的形式化標記方法。后被 Peter Naur 稍作修訂,這種語法描述方法稱為巴科斯-諾爾范式,簡稱 BNF

然而有些程序設計語言的結構特點很難用 BNF 描述,有些根本無法描述。類型兼容性規則就是用 BNF 很難表示的語法規則的一個例子。例如在 Java 中浮點值不能賦值給整型變量,而反過來卻是可以的。雖然這個限制可以用 BNF 表示,但是需要額外的非終結符和規則。如果 Java 所有的類型規則都有 BNF 來表示,文法將變得太大而無法使用,因為方法規模的大小決定的語法分析器的大小。作為 BNF 無法表示的語法規則的一個例子,考慮所有變量必須在引用前先聲明這一常見規則。人們已經證明,這條規則無法用 BNF 來表示。於是為了完整有效的描述這種靜態語義,人們發明了屬性文法。另外,屬性文法還用於自然語言的處理系統。

轉到描述程序設計語言中表達式、語句和程序單元的動態語義(或意義)這一困難層面,目前還沒有被普遍接受的其他標記方法可用來描述動態語義,盡管人們已經為描述局部規則發明了操作語義、指稱語義、公理語義等。

 

2. 從編譯到執行

2.1 詞法分析。線性字符串 to 帶屬性的線性表示。輸入源程序,對構成源程序的字符串進行掃描和分解,識別出一個個的單詞(亦稱單詞符號或簡稱符號),如關鍵字、標識符、常量、運行符和分隔符等。

2.2 語法分析。線性表示 to 抽象語法樹(Abstract Syntax Tree, AST。在詞法分析的基礎上,根據語言的語法規則把單詞符號串分解成各類語法單位,如短語、子句、語句、程序段和程序等。通過語法分析,確定整個輸入串是否構成語法上正確的程序。

2.3 語義分析。AST to 中間代碼。對語法分析所識別出的各類語法范疇,分析其含義,並進行中間代碼生成。

2.4 代碼生成。中間代碼 to 目標代碼。由中間代碼生成目標代碼,並進行必要的加工變換,以期在最后階段能產生出(在空間上或時間上)更為高效的目標代碼。

2.5 代碼執行。目標機器對目標代碼進行裝載、執行。

其中不包括代碼執行,之前的步驟都叫編譯期,代碼執行叫運行時;詞法分析、語法分析負責從程序語言文本到 AST 的轉換,稱作編譯器的前端,語義分析和代碼生成負責從 AST 到目標代碼的生成和優化,稱作編譯器的后端。在編譯期,某些解釋器只生成到 AST 即止,另一些編譯器生成和目標機器無關的中間碼(或字節碼)以供運行時解釋或二次編譯后再執行。

這種流程只是典型的理論表述,真正的工業編譯器並不嚴格按照前面的步驟來編譯程序。但原理上對從程序到目標代碼的處理過程都並無二致。

 

二、自然語言的特點

令人沮喪的是,你極少在文本處理和 NLP 的書籍文檔里見到用編譯原理那一套文法描述方案來描述自然語言的。NLP 比編譯原理發展慢 30 年,但這種滯后並不是其現狀不盡如人意的“因”。一個編譯器的構造可以看作對“從程序語言到目標代碼”這一整體過程的層次化分解,分解出的每一層要解決的子問題都不難,並且最終機器在執行目標代碼時只是一台圖靈機對程序這條“紙帶”按邏輯步進與讀寫,甚至邏輯上並不比炒菜、烹飪復雜;NLP 要面對的人類自然語言因其多種多樣,以及天生的模糊、歧義、隱含、無限、上下文相關等特性而難以有效處理。故 NLP 和編譯原理的成熟度差距是自然語言本身就難以捉摸的“果”。

 

1. 自然語言的分類

曾經有古代權貴召集一堆人想修個通天的巴別塔,結果這事就因為來干活的人說不同語言而沒干成,人類自然語言的多樣程度可見一斑。形態類型學根據語言的主要的形態現象把語言划分成若干組。在眾多分類法中,簡單基於詞、詞素及其特征的數量關系可做如下划分。

1.1 孤立型isolating)或分析型analytic)語言不包含或僅少量包含可被划分為多個詞素的詞(典型成員包括漢語、越南語、泰語,英語經過演化,現在已經呈現出分析型趨勢)。這類語言的特點在於其一般不是通過詞形變化來表達語法的作用,而是通過獨立的虛詞和固定的詞序來表達語法意義。

1.2 綜合型synthetic)語言可在一個單詞中合並多個詞素,可進一步被區分為黏着語和屈折語。

1.3 黏着語agglutinative)的詞素一次只能有一個功能(如韓語、日語、芬蘭語、泰米爾語等)。語法意義主要由加在詞根的詞綴來表示的,詞綴分為前綴、中綴、后綴,常見的有前綴、后綴。

1.4 屈折語fusional)定義為其詞素特征比大於 1 的語言(如阿拉伯語、捷克語、拉丁語、梵語、德語等)。詞形變化豐富,往往通過詞格、性、數的變化表達不同的語法意義。

 

2. 電腦和人腦的區別

人類對宇宙的奧秘已經有所了解,但對我們自己的大腦卻知之甚少。甚至很難給“智能”下一個精准的定義,更不要說評判由海量神經元基於固定理化規則表現出的高層適應性和不確定性就算是“智能”了嗎。

人腦具有感性、模糊、有抽象能力、可處理過程化事物、有情緒、會疲憊、不可預測的特質;電腦反之,具理性、精確、只做具體任務、處理離散事物、無思想情緒、只耗電不疲憊不生不死、可設計可預測的特質。當面對語言的時候,人腦能本能的應對,如處理上下文相關、歧義與拼寫不規范、俚語反語潛台詞、基於經驗反饋循環的自我完善(即語言技巧的提高)等;而電腦擅長上下文無關、語義明確、簡單直接的數據,且難以開發具有反饋完善自身處理過程的系統。

簡單來說電腦處理自然語言最大的難處是語言中廣泛存在的歧義。人類語言不是孤立存在的信息,它集語音(聲音處理)和文字(文本處理)為一體,並結合視覺等其他感官對世界的認識。哲學和宗教是人類對自身人性和社會性思辨的最高產物,《佛性論》中說道,“知無言說,無言說故;智慧不生,有無即離。皆不可得故,自性定無。”意思是沒有心性智慧語言也無從談起。不難大膽猜想,在 NLP 和機器視覺及其他與人類認知世界對等的人工智能能夠充分搭配整合之前,孤立發展的 NLP 絕不會表現出超越或達到人類水平。

 

三、NLP 淺析

對人類而言,在對話或文章中提取出感興趣的含義包含深度抽象、綜合以及常識的應用三個過程。對軟件而言,它也同樣需要做類似的處理。下面分別談談面對不同應用場景時 NLP 的側重點,以及一種利用 NLP 技術的問答系統實踐。

 

1. 不同應用的不同側重

1.1 搜索引擎。我認為一項技術成熟的標志是它被大規模應用時,用戶會把它當成自然而然的東西,不會覺得它有多特別。搜索引擎就是一個典型例子,很多 NLP 和其他人工智能技術手段被應用在我們每天的搜索過程中。

詞性標注,即在對爬蟲抓取到的文本進行處理時對詞匯詞性的判定,分詞和詞性標注是 NLP 的最基本處理,除搜索引擎外的其他應用場景均需要處理這兩個問題。

對於目標文檔,需要構建從詞、句到主題的邊界划分和結構表示,但是用戶給出的搜索關鍵字未必符合其在文檔中出現的順序,因此需要亂序匹配

對於同一件事物,有時能用幾條同義詞表達,比如“電腦”和“計算機”,搜索時應當把用戶輸入的關鍵字及其同義詞一起考慮進來作同義詞擴展

互聯網上的文檔經常被轉載的到處都是。采用自動將相似項分組並以摘要方式展示結果的文本聚類自動化處理是種很好的方式,這樣不需要閱讀所有或大部分內容就可以通讀大量文本或搜索結果。

1.2 問答系統。顧名思義,問答系統被設計成在提出自然語言問題的情況下以自然語言的方式給出應答。比起單純使用關鍵詞的搜索,問答系統更加直觀,表達也更清晰。可能是 NLP 領域綜合性最高的一種應用。

首先成熟的語義理解是任何 NLP 系統的關鍵。其次,問答不光需要整合從線性文本到結構化表示的轉換,以及從結構化結果到線性文本輸出的轉換;為了做出令人滿意的應答,還需要對客觀知識的查詢推理,即需要知識表達機器推理(Knowledge Representation and Reasoning),對於一些沒有明文表示的事實型問題列表型問題定義型問題關系問題觀點問題,需要能夠處理間接和隱含關系的深層的推理能力。

1.3 光學字符識別(Optical Character Recognition, OCR)和口語對話系統。輸入的數據不再是文本。對於圖像和聲音,其本身相比文本更難以划分邊界,到文本的轉換以及在詞匯層面的處理就不可能用基於規則方案。以字符序列建模的基於大量語料庫數據、詞向量的處理方式更適合做這類系統的前置處理。

 

2. 問答系統處理流程

問答系統有潛力成為下一代搜索引擎,會話交互也有可能是下一代操作系統的主流形態, NLP 應用於問答系統為例,典型的處理流程分成:

分析 -> 識別 -> 知識查詢 -> 查詢結果評分 -> 返回 -> [反饋]

雖然編譯原理的方法表示方法在 NLP 的理論資料中並不常見,但在實踐中,完全可以參考 BNF 的方式描述句法規則,甚至以此建立各階段的領域特定語言(Domain Specific Language, DSL)。下面分別解釋各階段的詳情和一些重點。

2.1 知識建模不同於只需要對文本做結構化和分類的系統,問答系統需要按自然語言輸入到某個地方查詢客觀知識,然后給出合理應答。因此需要一種有效的對客觀知識建模的數據庫。

2.2 分詞完成“線性 to 帶屬性標注的線性節點”的轉換。

可以說 NLP 的歧義問題從分詞階段就開始引入了。如,多語言標點符號問題,比如大部分語言書面形式的疑問句和感嘆句在句末加標點,但西班牙語在句前句后皆有符號。在實踐當中由用戶輸入的文本中,標點符號可能是誤用最多的元素。

多語言分詞問題,誠如前文所述,人類語言多種多樣。漢語沒有空格作天然詞邊界,像“北京大學生運動會”即可以分成“北京”“大學生”“運動會”,也可以分成“北京大學”“生”“運動會”,后者顯然是不合理的;對於英文這種以空格天然分詞的語言,“cant”在有些方案中被分成“can”“t”兩個成分,另一些方案中當成一個整體詞;考慮韓語的詞匯緊縮,及其他黏着語的情況,分詞成了 NLP 的第一個重要問題……

多義詞在很多語言里普遍存在,如漢語中,“特別”即可以表示副詞 very (如“特別-好吃”),又可以表示形容詞 special (如“吃法-特別”),這類詞性、詞義消歧義也是不得不考慮的問題。

不得不說阿拉伯數字是最適合數字化處理的數字表示方法。考慮語言中原生的量詞、時間表示,量詞、時間識別就成了分詞時需要面對的另一個問題。如漢語中可以寫出“二千零一十六”,“肆拾貳”,“13兩”,“三點14”,“兩點半”…… NLP 需要正確處理各種花樣量詞、時間寫法,特別說明,其中又存在一些歧義字,如“米”即可指糧食又可指長度單位;“兩”即是數字 2 又是重量單位;“號”即是 number 的意思又可以是日期的意思……

人、地點、事物或者說名詞在語言中擔任重要角色。它們承載句子的主語,並且往往也承載句子的賓語,出於其重要性,在文本處理時識別並在應用中使用名詞往往十分有用,該任務稱命名實體識別

對於一些會使用到專有名詞的場合,中英混合數據是另一個需要處理的情況。另外,分詞階段還需要處理上文提及的同義詞擴展等問題

2.3 句法分析。完成“帶屬性標注的線性節點 to 結構化”的轉換。類似於編譯器的語法分析階段,NLP 需要把線性數據轉換成結構化數據以便后續處理。句法分析完成從帶屬性標注的線性節點到划分出基本語法成份的結構化表示。在下一個編譯生成 AST 階段,結構化表示將被進一步處理成獨立於自然語言的謂詞-論元結構表示。

對自然語言中的成語,以及慣用短語,往往很難用通用的句法結構表示,或表示出來對於后續處理只會徒增復雜度,因此這類詞做為整體來表示。

針對現代漢語,其句法成份的順序相對固定,經筆者實踐,利用類似編譯原理中的自頂向下語法分析技術就能在短語結構、短距離句式結構方面達到相當滿意的效果。

依存圖的主要思想是連接短語的中心詞與其依存詞,用有向邊把中心詞與依存詞連接起來,依存圖與短語結構樹類似,是和很多不同的語言學框架一致的一種表示方法。中心詞與依存詞的關系可以是語義上的(中心詞-修飾語),也可以是句法上的(中心詞-限定語)。對於長距離的句子結構利用這項技術來幫助分析。

前文我們多次提到歧義情況,然而有些詞義消歧義直到句法分析階段才能消除,例如“給----笑話”和“把---我”這兩句話,前者“給”字作介詞 for 釋義,后者作動詞 give;還有漢語中“打”這一個動詞在不同短語中能被多種解讀……

需要注意的是對於計算機處理而言,嚴格按照語言學中對句法的分析並不一定是最高效的。漢語作為通用虛詞和詞序表達語義的分析語,並沒有時態、語態、詞格的概念,但為了處理方便,可以靈活的為語言在計算機中的表示綜合利用不同語言體系的便利。如在短語層面時態識別可以用固定的規則來分析,形如“將要, 動詞”識別成將來時,“動詞, 過”識別成完成時。

對於句子邊界檢測,一些標點符號如逗號有時表示同等地位的語法成份間的軟停頓(或間隔),而另一些時候是兩個並列的句子的硬停頓。這種句邊界划分的歧義到句法分析時更方便消除。

除此之外需要特別指出,在分詞階段無法消解的歧義,和在 OCR、口語識別系統中無法消解的句子邊界,需要在句法分析時回溯處理;而句法分析階段也會產生新的無法消解的歧義結構,需要在后面的編譯生成和語義理解階段回溯處理,下文不再贅述。

共指消歧義與命名實體識別關系密切,包括檢測某種提及的邊界並有選擇的確定其語義類型(如人物或組織機構)及其他屬性(如名稱、名詞或者是代詞)。對於問答系統,這種提及有可能是跨語句的,供檢測用的命名實體緩存的作用類似於編譯原理中的符號表。在共指消歧之后,還需要進一步的尋找實體間的語義關系,這種關系即存在於自然語言輸入中,又存在於知識數據庫中,影響着知識查詢推理的效果。如果將關系抽取視為“分類”問題的話,亦可以用機器學習來做處理。

2.4 編譯生成 AST完成“結構化 to 波蘭表達式(Polish Expression, PE)”的轉換。句法分析的輸出雖然已經轉換成了結構化表示,但其節點順序依然和原始自然語言相關。為了后續內部處理的統一性,我們有必要把它轉換成和具體自然語言無關的表示方式。

把說明動作或表示祈使的成分前置,主語(可能包含疑問詞)賓語隨后,可以得到一種類似波蘭表達式的謂詞-論元結構。例如考慮由祈使成份(COMP),謂詞(PRED),主語(SBJ),賓語(OBJ),助詞(AUX)組成的簡單表達式:

  • (PRED, SBJ, OBJ, [AUX])

  • (PRED, SBJ, [AUX])

  • (COMP, PRED, SBJ, OBJ, [AUX])

  • (COMP, PRED, SBJ, [AUX])

2.5 AST 語義理解,知識查詢。對編譯生成的樹型 AST 結構進行遍歷並做語義理解,並在知識數據庫中抽取必要知識,做出機器推理,並生成結果 AST,完成“PE think to PE”的過程。

這一步的輸入是上一步編譯出來的 PE AST,輸出也是用同一套規范表達的 PE AST。和軟件工程中的其他數據庫類似,我們可以對客觀世界的對象做建模處理,在這一步中一個語句即一條查詢,而每條查詢可以對應一組查詢元語的組合。具體實現細節將在另一篇文章中解釋,這里僅舉例一部分筆者在實踐中用到的查詢元語:

  • SELECT:后跟一串對象關系路徑參數,以此在數據庫中查詢對象細節

  • COMPARE:用於多個對象的比較查詢和關系查詢,如“iOS 和 Android 哪個好用”,“成都到北京有多遠”

  • DECLARE:對於用戶輸入的陳述句用聲明(declare)處理,實踐中會維護一個和會話用戶對應的數據庫,此元語對一條聲明做簡單的真假判斷,並存儲到會話數據庫中

  • IMPETRATE:供祈使句處理使用,一些情況中此元語僅充當其他元語的前置語氣,並無實際邏輯作用,如“告訴我月亮離地球有多遠”,實際是對地月距離的 COMPARE;另一些則以祈使句為主體,如“給我唱首歌”,“講個笑話”

  • EXTRACT:在元語搭配中,EXTRACT 以其他元語查詢的結果為中間數據,進一步抽取出細節作為結果

如果將問答系統用於實用助手類應用場景,則可擴展查詢元語,類似編程語言中的多態性,擴展出更多功能,例如天氣查詢、航班、股市、休閑消費的查詢等。

需要注意人類語言中存在反語委婉表達的情況,基於規則的 NLP 對此作用有限,識別用戶的真正意圖是語義理解中非常值得去突破的難點。

2.6 情感處理。在試圖讓機器表現的盡可能像人的努力中,對語義情感的理解處理直接影響最終的人機交互體驗。世界上找不到兩片完全相同的葉子,受人類自身原因的影響,不同文化背景、成長經歷的人的情感表達和理解習慣,以及應對模式完全不一樣。因此詞性標注到基於語料庫的處理,依然只能有限處理情感分析。對於問答系統以外的情況,如跨段落、多文檔的時候,更加大了情感分析的難度。

2.7 應答 AST 生成。完成“PE to 結構化”的轉換。AST 語義理解,知識查詢可以說是 NLP 問答系統中樞的中樞,情感處理是它的輔助。在這一步得到等待輸出的 PE AST 結構時處理流程就是語義理解之前的逆過程。

使用和自然語言無關的 AST 表示方法的好處現在就體現出來了。在應答 AST 生成這一步里,將 PE AST 生成和具體自然語言相關的 AST 表示方法,這種流程可以便於開發“A 語言進,B 語言出”,如果把語義理解簡化掉一部分,就可以達到基本的機器翻譯的要求。

這一步的難點是自然語言中的慣用法,如漢語中修飾名詞間是否加助詞“的”(“機械-鍵盤” vs. “程序員--品味”),介詞意 from 的表達方法(“由from---生” vs. “從from-現在-開始”),動詞 do 的表達方法(“打do-醬油” vs. “做do-事情”)……

2.8 應答拼裝。完成“結構化 to 線性”的轉換。最終,結構化的表示處理成線性表示,最終生成輸出文本。作為擴展,利用語料庫數據可以對線性串做進一步的潤色處理。

除了上述要點,另一些擴展技術對 NLP 的效果具有不可忽視的助益。比如如何合理表示和高效輸入領域特定知識;從 web 自動抓取知識並擴充知識數據庫;為提升應答滿意度問答系統的自我反饋學習等等。

可以看出對語言文本的分詞、句法分析、語義理解和編譯器的前端大致相同,也可以用類似的工程手段實現,不妨稱這一部分為 NLP 問答系統的前端(以下簡稱前端)。除問答系統,機器翻譯自動文摘輿情分析(情感分析)和口語對話亦可共用類似的前端。這些系統不一定需要對客觀知識的深層推理,也不一定要求用自然語言做輸出,而知識查詢及后面的部分則是 NLP 問答系統所特有的,這部分超出了和編譯原理的對比范疇,稍后我將另寫一篇描述我實現的一種問答系統,包括一些實踐細節。

和編譯器一樣,NLP 也是一個環環相扣的處理流程。由於自然語言的不規則性,歧義性,能產性,其文法不可能用有限規則描述出來,且對歧義的失誤處理會在后續環節被放大;但是基於規則的 NLP 依然可以高效處理足量的自然語言問題,並且可作為和其他人工智能算法搭配使用的必要組成部分。基於規則的 NLP 是更高級語言處理技術的馬步功夫。

 

四、總結

本人才疏學淺,如有謬誤歡迎指正。現在機器越來越像人,人越來越像機器,希望這篇文字能讓你從一個小的側面,以淡然的心態認識接受人工智能,而不成為“一篇文章從入門到放棄自然語言處理”。NLP 這事很難,但正因為其難,以及現狀的不盡如人意,進一步馴服它才具有意義。不是嗎。


 

了解更多人工智能資訊長按識別或掃碼關注:


微信公眾號:分享最新最特別的人工智能資訊

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM