知無言說,無言說故;智慧不生,有無即離。皆不可得故,自性定無。 - 佛性論前端
從早餐閱讀,處處理電子郵件,再到電商購物,天天面對各類工做上的和生活中的信息,文本是咱們須要處理的最主要的數據形式,即使是圖片圖像等更豐富的媒體形式也不可能脫離文本單獨存在。如何用計算機幫助處理這些文本的概括、理解、提煉、反饋正是天然語言處理(Natural Language Processing, NLP)要解決的問題。程序員
NLP 屬於人工智能的一個子領域,相對人工智能的其餘領域還很年輕。在衆多人工智能處理問題的方法中大體可分紅基於規則,模擬出「智能」行爲;以及基於數據,讓智能算法本身擬合出規則這兩種方式。天然語言也能夠從這兩個角度處理問題,基於規則和基於數據並非不相容,兩者有各自的適用範疇,而且能夠搭配處理天然語言。其中基於規則的 NLP 算法能有效適用於不少方面。如考慮計算效率,基於規則的方案更有其優點。因編譯原理和基於規則的 NLP 有不少技術重疊點和類似性,本文對兩者作簡單對比,並細數 NLP 的一些關鍵技術點。web
1、編譯原理基礎算法
編譯原理成型於五六十年代;而 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 即止,另外一些編譯器生成和目標機器無關的中間碼(或字節碼)以供運行時解釋或二次編譯後再執行。
這種流程只是典型的理論表述,真正的工業編譯器並不嚴格按照前面的步驟來編譯程序。但原理上對從程序到目標代碼的處理過程都並沒有二致。
2、天然語言的特色
使人沮喪的是,你極少在文本處理和 NLP 的書籍文檔裏見到用編譯原理那一套文法描述方案來描述天然語言的。NLP 比編譯原理髮展慢 30 年,但這種滯後並非其現狀不盡如人意的「因」。一個編譯器的構造能夠看做對「從程序語言到目標代碼」這一總體過程的層次化分解,分解出的每一層要解決的子問題都不難,而且最終機器在執行目標代碼時只是一臺圖靈機對程序這條「紙帶」按邏輯步進與讀寫,甚至邏輯上並不比炒菜、烹飪複雜;NLP 要面對的人類天然語言因其多種多樣,以及天生的模糊、歧義、隱含、無限、上下文相關等特性而難以有效處理。故 NLP 和編譯原理的成熟度差距是天然語言自己就難以捉摸的「果」。
1. 天然語言的分類
曾經有古代權貴召集一堆人想修個通天的巴別塔,結果這事就由於來幹活的人說不一樣語言而沒幹成,人類天然語言的多樣程度可見一斑。形態類型學根據語言的主要的形態現象把語言劃分紅若干組。在衆多分類法中,簡單基於詞、詞素及其特徵的數量關係可作以下劃分。
1.1 孤立型(isolating)或分析型(analytic)語言不包含或僅少許包含可被劃分爲多個詞素的詞(典型成員包括漢語、越南語、泰語,英語通過演化,如今已經呈現出分析型趨勢)。這類語言的特色在於其通常不是經過詞形變化來表達語法的做用,而是經過獨立的虛詞和固定的詞序來表達語法意義。
1.2 綜合型(synthetic)語言可在一個單詞中合併多個詞素,可進一步被區分爲黏着語和屈折語。
1.3 黏着語(agglutinative)的詞素一次只能有一個功能(如韓語、日語、芬蘭語、泰米爾語等)。語法意義主要由加在詞根的詞綴來表示的,詞綴分爲前綴、中綴、後綴,常見的有前綴、後綴。
1.4 屈折語(fusional)定義爲其詞素特徵比大於 1 的語言(如阿拉伯語、捷克語、拉丁語、梵語、德語等)。詞形變化豐富,每每經過詞格、性、數的變化表達不一樣的語法意義。
2. 電腦和人腦的區別
人類對宇宙的奧祕已經有所瞭解,但對咱們本身的大腦卻知之甚少。甚至很難給「智能」下一個精準的定義,更不要說評判由海量神經元基於固定理化規則表現出的高層適應性和不肯定性就算是「智能」了嗎。
人腦具備感性、模糊、有抽象能力、可處理過程化事物、有情緒、會疲憊、不可預測的特質;電腦反之,具理性、精確、只作具體任務、處理離散事物、無思想情緒、只耗電不疲憊不生不死、可設計可預測的特質。當面對語言的時候,人腦能本能的應對,如處理上下文相關、歧義與拼寫不規範、俚語反語潛臺詞、基於經驗反饋循環的自我完善(即語言技巧的提升)等;而電腦擅長上下文無關、語義明確、簡單直接的數據,且難以開發具備反饋完善自身處理過程的系統。
簡單來講電腦處理天然語言最大的難處是語言中普遍存在的歧義。人類語言不是孤立存在的信息,它集語音(聲音處理)和文字(文本處理)爲一體,並結合視覺等其餘感官對世界的認識。哲學和宗教是人類對自身人性和社會性思辨的最高產物,《佛性論》中說道,「知無言說,無言說故;智慧不生,有無即離。皆不可得故,自性定無。」意思是沒有心性智慧語言也無從談起。不難大膽猜測,在 NLP 和機器視覺及其餘與人類認知世界對等的人工智能可以充分搭配整合以前,孤立發展的 NLP 毫不會表現出超越或達到人類水平。
3、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 的歧義問題從分詞階段就開始引入了。如,多語言標點符號問題,好比大部分語言書面形式的疑問句和感嘆句在句末加標點,但西班牙語在句前句後皆有符號。在實踐當中由用戶輸入的文本中,標點符號多是誤用最多的元素。
多語言分詞問題,誠如前文所述,人類語言多種多樣。漢語沒有空格做自然詞邊界,像「北京大學生運動會」便可以分紅「北京」「大學生」「運動會」,也能夠分紅「北京大學」「生」「運動會」,後者顯然是不合理的;對於英文這種以空格自然分詞的語言,「can’t」在有些方案中被分紅「can」「’t」兩個成分,另外一些方案中當成一個總體詞;考慮韓語的詞彙緊縮,及其餘黏着語的狀況,分詞成了 NLP 的第一個重要問題……
多義詞在不少語言裏廣泛存在,如漢語中,「特別」便可以表示副詞 very (如「特別-好吃」),又能夠表示形容詞 special (如「吃法-特別」),這類詞性、詞義消歧義也是不得不考慮的問題。
不得不說阿拉伯數字是最適合數字化處理的數字表示方法。考慮語言中原生的量詞、時間表示,量詞、時間識別就成了分詞時須要面對的另外一個問題。如漢語中能夠寫出「二千零一十六」,「肆拾貳」,「1斤3兩」,「三點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 是更高級語言處理技術的馬步功夫。
4、總結
本人才疏學淺,若有謬誤歡迎指正。如今機器愈來愈像人,人愈來愈像機器,但願這篇文字能讓你從一個小的側面,以淡然的心態認識接受人工智能,而不成爲「一篇文章從入門到放棄天然語言處理」。NLP 這事很難,但正由於其難,以及現狀的不盡如人意,進一步馴服它才具備意義。不是嗎。
瞭解更多人工智能資訊長按識別或掃碼關注:
微信公衆號:分享最新最特別的人工智能資訊