第二章自然語言處理的主要課題
第一節 主要研究內容簡介
自然語言處理主要研究人際交往與人機交互中的語言問題,目前一個顯著的特點是隨著語料庫建設和語料庫語言學的崛起,大規模真實文本的處理成為自然語言處理的主要戰略目標。為了讓本篇的內容介紹更加條理化,有必要把自然語言處理的四大研究方向做一個簡單介紹。語言學方向的研究重點是語法形式化理論和數學理論,該領域只研究語言及語言處理與計算相關方面的理論,而不管自然語言在計算機上的具體實現。在數據處理方向是把自然語言處理作為開發語言來研究相關程序並進行語言數據的處理,早期有資料庫的建設、機器可讀電子詞典的開發,近年來則有大規模的語料庫的湧現。在人工智慧和認知科學這個方向上,自然語言處理被作為在計算機上實現自然語言能力,探索自然語言理解的智能機制和認知機制。在語言工程方向主要是把自然語言處理作為面向實踐的、工程化的軟體語言開發來研究,俗稱「人類語言技術」或者「語言工程」。
本章重點介紹的內容是計算機自然語言處理,它是用計算機通過可計算的方法對自然語言的各級語言單位進行轉換、傳輸、存貯、分析等加工處理的科學。是一門與語言學、計算機科學、數學、心理學、資訊理論、聲學相聯繫的交叉性學科。希望通過本章的介紹,使讀者掌握自然語言處理技術的基本概念、基本原理和主要方法,了解當前國際國內語言處理技術的發展概貌,接觸語言處理技術的前沿課題,為大家具備運用基本原理和主要方法解決科研工作中出現的實際問題的能力提供一些有益的思路。
第二節 詞法分析與分詞
自然語言處理可分為詞法分析、句法分析和語義分析三個層面。詞法分析包括分詞、詞性標註、命名實體識別和詞義消歧。詞法分析器(Lexer)一般以函數的形式存在,供語法分析器調用,其核心任務是掃描、識別單詞並完成定性、定長的處理。簡單來說詞法分析就是把字元串轉換成語法樹(sytax tree)。而分詞(tokenize)是把字元流轉換成帶有某種歸類或屬性的字元串(token stream),目的之一是能夠承載語義,能使後面與語義有關的分析更準確;分詞的另一個作用是切斷上下文耦合,降低詞序之間的影響。
文本分類的演算法大都假設文本特徵之間是相互獨立的。如果不分詞而以單字為特徵,那「為什麼要分詞」這句話中,「為、什、么」、「分、詞」每個引號內的幾個字都非常相關,但是「為什麼」和「分詞」之間的關聯性卻很低。因此如果我們以單字為特徵,那麼「特徵之間相互獨立」這個假設顯然很難成立,演算法的分類結果可以想像。詞法分析就是讓文本各組合之間的耦合性降低,並以組合為特徵,使其更接近我們的演算法假設。因為這個組合的過程和分詞很像,也有人說「分詞」這個動作是「詞」通過「詞法」(lexical grammar)來界定,因而完成「分詞」是目的,而「詞法分析」(lexical
analysis)是手段。在實踐中一個編譯器的前端可以同時做這兩件事,甚至可以和語法分析一起完成。基於詞庫的分詞往往不能識別未登錄詞。新詞,特定領域的專有詞,如人名、機構名、地名、產品名、商標名、簡稱、省略語等都是自動分詞的難點。歧義切分主要包括交集型歧義和組合型歧義,在這方面使用基於n-gram的分詞方法往往不能保證詞在切分過程中的語義獨立性。另外有些歧義無法在句子內部解決,需要結合篇章上下文進行切分。
第三節 分詞與中文分詞的介紹
和大部分西方語言不同,書面漢語的詞語之間沒有明顯的空格標記,因此正確分詞對中文語料的處理來說非常重要。雖然英文也同樣存在短語的劃分,不過在這個問題上中文要複雜得多。中文詞的定義非常抽象且很難計算,自動分詞的主要難題就是詞的顆粒度選擇。"結合緊密、使用穩定"是分詞顆粒度的界定準則,但如何選擇與要處理的具體問題緊密相關。比如有些問題要求速度快,而有些需求注重的是精度。在機器翻譯中,通常顆粒度大翻譯效果好;而在網頁搜索中,小的顆粒度就更有優勢,因此演算法要跟著需求走。
一個良好的分詞系統應由詞典和統計兩套系統組成。後者為前者識別新詞、構造可持續更新的詞典,同時對消岐部分進行匹配。分詞過程中好的詞典很重要,目前已經有很多開源工具可以使用,很多分詞是用條件隨機場(CRF)和隱馬(HMM)等序列標註模型,通過對詞語的位置標註和詞性等特徵來進行分詞。
基於字元串匹配的分詞就是掃描字元串,如果發現字元串的子串和詞相同就算匹配成功。這類 分詞通常會加入一些啟發式規則,比如「正向/反向最大匹配」,「長詞優先」等策略,其優點是速度塊,都是O(n)時間複雜度,缺點就是對歧義和未登錄詞處理不好。基於統計和機器學習的分詞方式是用人工標註的詞性和統計特徵來對中文進行建模,根據標註好的語料對模型參數進行估計訓練。在分詞階段再通過模型計算各種分詞出現的概率並輸出概率最大的分詞結果。這類分詞演算法能很好處理歧義和未登錄詞問題,目前市場上比較好用的分詞器有哈工大的LTP、清華大學的THULAC和結巴分詞。
第四節 詞性標註
詞性標註是給句子中每個詞一個詞性類別的任務,也就是根據句子的上下文信息給句中的每個詞確定一個最為合適的詞性標記。比如,給定一個句子:「我中了一張彩票」。對其的標註結果可以是:「我/代詞中/動詞/了/助詞/一/數詞/張/量詞/彩票/名詞。/標點」
詞性兼類是詞性標註的主要難點,它是指自然語言中一個詞語的有多個詞性的語言現象。詞性兼類是自然語言中的普遍現象,例如下面的句子:S1=「他是山西大學的教授。」; S2=「他在山西大學教授計算語言學。」句子S1中,「教授」是一個表示職稱的名詞,而句子S2中「教授」是一個動詞。對人來說,這樣的詞性歧義現象比較容易排除,但是對於沒有先驗知識的機器來說是比較困難的。據不完全統計,常見的詞性兼類現象有幾十種,這些兼類現象具有以下分布特徵:l)在漢語辭彙中,兼類詞的數量不多,約佔總詞條的5一11%。2)兼類詞的實際使用頻率很高,約佔總詞次的40一45%。也就是說,越是常用的詞,其詞性兼類現象越嚴重。3)兼類詞現象分布不均:在孫茂松等的統計中,僅動名兼類就佔全部兼類現象的49.8%;在張民門的統計中,動名兼類和形副兼類就佔全部113種兼類現象的62.5%。
詞性兼類的消歧常採用概率的方法,如隱馬爾科夫模型。這些方法的有效性依賴於兼類詞性的概率分布。但是有些兼類的詞性的概率分布近似,特別是高頻的詞性兼類現象,如漢語的動詞名詞兼類,對於這些兼類現象,傳統的概率方法很難奏效,如何解決這個問題目前詞性標註面臨的主要困難之一。
第五節 命名實體識別與詞義消歧
命名實體識別是指識別文本中具有特定意義的實體,通常包括實體邊界識別和確定實體類別兩個環節。具體就是識別出待處理文本中三大類(實體類、時間類和數字類)、七小類(人名、機構名、地名、時間、日期、貨幣和百分比)實體。英語中的命名實體具有比較明顯的形式標誌(即實體中的每個詞的第一個字母要大寫),因此其任務的重點是確定實體的類別。
漢語分詞和命名實體識別是互相影響的,不同的命名實體具有不同的內部特徵,不能用統一的模型來刻畫所有的實體內部特徵。外國人名、譯名和地名是存在於漢語中的兩類特殊實體類型,現代漢語文本中常出現中英文交替使用,造成漢語命名實體識別任務更加複雜。許多自然語言處理領域中的問題最終都是處理詞語的歧義問題,每個詞在使用的時候是根據詞語所處的環境來決定它的實際意思的,只有知曉了它上下文中的關鍵詞的時候才能說到底表示什麼意思。基於統計學習理論中有監督的詞義消歧方法是現今詞義消歧領域中較為主流的方法之一,它的可擴展性較好,可以適應語言的不斷變化。
詞義消歧的特徵提取方法包括語料的解析過程、特徵的選擇和特徵的提取。基於語義的特徵提取方法主要包括單層語義信息、三層語義信息、詞形信息三種不同的方法,進而建立特徵向量集並用來構建基於語義信息的貝葉斯詞義消歧分類器,通過對比實驗來驗證新方法的詞義消歧性能。關於詞義消歧準確率的評判方法和權威評價體系以及仍待解決的問題可以參考有關文獻。
第六節 語法分析
自然語言處理中說的語法包含了詞法和句法。語法分析是編譯過程的核心邏輯階段,它的任務是在詞法分析的基礎上根據語言的語法規則進行分析,從詞法分析的結果中識別出相應的語法範疇,同時進行語法檢查並將單詞序列組合成各類語法短語。如果不存在語法錯誤即輸出正確的結果,並為語義分析和代碼生成做準備。語法分析程序判斷源程序在結構上是否正確,源程序的結構由上下文無關的文法描述。給定文法G和字元串A(A∈VT*),檢查、判定A∈L(G)?即檢查、判定A是否是文法G所能產生的合法的句子,同時報告和處理語法錯誤。
就產生語法樹的方向而言,可大致把他們分為自底向上和自頂向下兩大類。自上而下語法分析方法:給定文法G和源程序串r。從G的開始符號S出發,通過反覆使用產生式對句型中的非終結符進行替換(推導),逐步推導出r 。是一種產生的方法,面向目標的方法。分析的主旨是選擇產生式的合適的侯選式進行推導,逐步使推導結果與r匹配.自下而上語法分析方法:從給定的輸入串r開始,不斷尋找子串與文法G中某個產生式P的候選式進行匹配,並用P的左部代替(歸約)之,逐步歸約到開始符號S。是一種辨認的方法,基於目標的方法:分析的主旨是尋找合適的子串與P的侯選式進行匹配,直到歸約到G的S為止。
LALR分析器是一種規範LR分析方法的簡化形式。它可以對上下無關文法進行語法分析。LALR即「Look-AheadLR」。其中,Look-Ahead為「向前看」,L代表對輸入進行從左到右的檢查,R代表反向構造出最右推導序列。 LALR分析器可以根據一種程序設計語言的正式語法的產生式而對一段文本程序輸入進行語法分析,從而在語法層面上判斷輸入程序是否合法。實際應用中的LALR分析器並不是由人手工寫成的,而是由類似於YACC和GNU Bison之類的LALR語法分析器生成工具構成。由機器自動生成的代碼相比較於程序員手工的代碼,擁有更好的運行效率而且減少了程序員的工作量。
第七節 句法分析與語義分析的關係
句法分析技術從短語結構、句法依存、通用依存到語義依存圖在不斷地發展。短語結構句法(上下文無關語法)是比較經典的模型,著眼點在鄰接成分之間的拼接關係。它將輸入文本中的句子從序列形式變成樹狀結構,從中捕捉到句子內部詞語之間的搭配或者修飾關係並幫助上層的語義分析。依存語法與上下文無關語法相反,處理的著眼點在個體詞語之間點對點發生的關聯關係,由於表示形式簡潔靈活,易於理解和標註,容易表示詞語之間的語義關係(施事,受事,時間等關係)現在已經成為研究句法分析的熱點。
語義分析的最終目的是理解句子表達的真實語義,語義角色標註是比較成熟的淺層語義分析技術,就是在給定句子中標註出一個謂詞的施事、受事、時間、地點等參數,它一般都在句法分析的基礎上完成。句法分析不涉及語義,但能標註出句中的主謂賓定狀補以及結構上的依存關係進而可以分析語義,但研究表明句法和語義之間聯繫並不密切。
比如「我去廚房拿了一瓶水」,通過句法分析知道「拿了」是謂語,用謂語制導的語義分析知道這是一種行為,需要一個發起者和一個承受者。再根據句法「我」是行為的發起者,而行為的承受者是「水」,所以程序會繼續閱讀後文來進一步地理解,我們通過句子的結構結合詞義分析出了這句話的語義。對程序語義分析能力的檢測方式主要是基於一些類似於閱讀理解的題目來判斷,而上面的分析明顯對於閱讀理解是有效的。也就是說句法分析可以引導出有效的語義分析。類似的,在編譯器中大都是用關鍵詞和符號制導的語義分析,但這真的就揭示語義的本質了么?每個人理解語義都需要這樣去理解么?有沒有這樣理解不了的語義結構呢?答案應該分別是否定、否定、肯定的吧
第八節 依存句法分析與語義依存分析
1959年法國語言學家提出的依存句法分析思想能通過分析語言單位內成分之間的依存關係從而揭示其句法結構。它能識別句子中的「主謂賓」、「定狀補」這些語法成分,並分析各成分之間的關係。句法就是規定句子里成分是按照什麼規則組織在一起的,而依存句法就是這些成分之間有一種依賴關係,它的基本任務是確定句式的句法結構(短語結構)或句子中辭彙之間的依存關係,可以標註出14種依存關係。依存句法分析最重要的兩棵樹是依存樹和依存投射樹。
所謂「語義」就是說句子的含義,語義依存分析則是對句子更深層次的分析,目標是跨越句子表層句法結構的束縛,直接獲取深層的語義信息,它主要分析句子各個語言單位之間的語義關聯,並將語義關聯以依存結構的形式呈現。使用語義依存刻畫句子語義好處在於不需要去抽象辭彙本身,而是通過辭彙所承受的語義框架來描述該辭彙。依存句法強調介詞、助詞等的劃分作用,語義依存注重實詞之間的邏輯關係。
依存句法隨著字面詞語變化而不同,語義依存不同字面詞語可以表達同一個意思,句法結構不同的句子語義關係可能相同。依存句法分析和語義分析相結合使用,對對方說的話進行依存和語義分析後,一方面可以讓計算機理解句子的含義,從而匹配到最合適的回答。另外如果有已經存在的依存、語義分析結果,還可以通過置信度匹配來實現聊天回答。分詞詞性、依存樹庫、語義角色都需要做人工標註,有了這寫人工標註之後,就可以做機器學習來分析新的句子的依存句法了。如何利用國內領先的中文語言技術平台實現依存句法分析已經有很多成果,當然有可用的工具我們就不會重複造輪子了。
第九節 深度學習在語義分析中的應用
深度學習的獨特之處在於可以自動地學習一個特徵的層次結構,不同底層特徵的不同方式的組合可以構建出不同的高層特徵。深度學習應用於語義分析首先需要解決的是什麼樣的語言特徵對任務是最有用的,這些特徵可以是專家人工定義的,也可以是機器學習得到的。
由於語音和圖像在處理過程中的輸入信號可以在向量空間內表示,深度學習已經在這兩方面取得重大進展。然而自然語言處理通常需要在辭彙一級進行,因此將獨立的辭彙轉換為向量並作為神經網路的輸入是將深度學習應用於自然語言處理的基礎。自然語言任務中通常要處理各種遞歸結構,語言模型、詞性標註等需要對序列進行處理,而句法分析、機器翻譯等則對應更加複雜的樹形結構。這些結構化的處理通常需要特殊的神經網路。
因為詞法、句法和語義分析具有很大的局限性,對此科洛貝爾等人基於深度神經網路提出了一個統一的多任務框架來處理詞性標註、淺層句法分析、命名實體識別和語義角色標註等問題,並發布了基於這個框架的開源工具SENNA。當然深度學習本質上是否可以涵蓋語義分析也還是說不清的,比如像word2vector
無論是設計還是實驗結果均表明這只是相當於上下文統計結果的一種低秩表示而已。為了理解語言的含義,我們要把語言符號和它所代表的信息聯繫起來,我們要為文法的每個語法符號附加一些屬性。而附加到程序的語義規則告知我們這些屬性是怎麼得來的以及文法符號屬性之間的關係是怎樣的。目前針對特殊任務的辭彙表達的學習以及辭彙之間關係的探索越來越受到重視,處理自然語言的結構化輸出需要更為複雜的神經網路。第十節 驗證型實驗-語義分析程序的調試
本實驗目的是通過分析調試TEST語言的語義分析和中間代碼生成程序,加深對語法制導翻譯思想的理解,掌握將語法分析所識別的語法範疇變換為中間代碼的語義翻譯方法。語法制導的基本思想就是對文法中的每個產生式都附加一個語義動作或語義子程序,且在語法分析過程中,每當需要使用一個產生式進行推導或歸約時,語法分析程序除執行相應的語法分析動作外,還要執行相應的語義動作或調用相應的語義子程序。基本思路是根據翻譯的需要設置文法符號的屬性,以描述語法結構的語義。例如,一個變數的屬性有類型,層次,存儲地址等。表達式的屬性有類型,值等。屬性值的計算和產生式相聯繫,隨著語法分析的進行執行屬性值的計算,完成語義分析和翻譯的任務。
翻譯方案設計原理:為文法符號引進一組屬性及相應求值規則和動作,得到屬性翻譯文法,並引進一個符號表(包括變數名,變數數據是否有效,變數地址,變數的具體數據,數據類型等),在進行語法分析的同時,結合符號表完成語義分析與檢測,同時根據屬性翻譯文法的屬性及相關動作得到中間代碼(抽象機式彙編指令),最後通過模擬的抽象機運行出結果。實驗過程中首先理解代碼或觀看相關的知識的PPT,深入理解屬性反應文法的作用,在實驗之前寫好的語法分析基礎上進行修改,寫出語義分析代碼。在語義分析里增加「不可引用未賦初值變數」的規則,在init()、showVarTable()、checkInitValue()中增加相關操作。然後,結合棧式抽象機及其彙編指令相關命令的操作含義,模擬寫出TEST語言的抽象機模型用以運行文法生成的中間代碼以及執行中間代碼的虛擬機程序。最後,編寫TEST語言程序進行代碼實例測試,調試觀察運行過程及結果,並調試修改程序BUG,代碼完成後,測試、完善。
首先了解語法制導翻譯和屬性翻譯文法以及語義分析和代碼生成等過程,對所需知識點有個大致的了解,然後對書上的代碼進行研究,充分理解了語義分析在語法分析程序的基礎上所需要添加的屬性翻譯和相關動作的程序。然後嘗試在語義分析代碼中添加語義分析程序。完成語義分析之後,再添加賦初值的相關代碼,然後使用書上的抽象機模擬程序,經過調試完成了試驗的代碼。
實驗方法:① 通過看書看PPT看代碼,充分理解原理;② 分析以前的語法分析代碼,研究該怎麼增加語義分析;③
修改語法分析代碼,加入語義動作;④分析抽象機模擬程序再在自己語法語義分析程序中加入抽象機模擬程序;⑤ 測試;實驗結果完成了如引用未賦初值變數報錯等要求,通過模擬棧式抽象機指令的動作,構造了抽象機,能運行中間代碼完成實驗的測試。這個實驗主要幫助對語法制導翻譯技術和抽象機模擬程序有了更深的了解。在語義分析的實驗中,通過TEST屬性文法的翻譯設計,了解了語法制導的基本過程及方法,明白了屬性文法的基本推導與構造原理,了解了不同屬性之間的傳遞關係,動作的執行流程,也了解了棧式抽象機及其彙編指令的執行原理,了解了TEST語言抽象機的原理。同時,綜合其它相關幾次實驗,可以對編譯器的原理和詞法分析,語法分析,語義分析,抽象機模擬器等幾個核心功更加了解。有興趣可以自己嘗試一下。
推薦閱讀:
※嶺回歸-嶺回歸
※基於知識庫的問答:seq2seq模型實踐
※學習筆記CB004:提問、檢索、回答、NLPIR
※Learning to Skim Text 閱讀筆記
※《Attention is all you need》
TAG:自然語言處理 |