1. 程式人生 > >淺談自然語言處理(NLP)和 自然語言理解(NLU)

淺談自然語言處理(NLP)和 自然語言理解(NLU)

自然語言處理主要步驟包括:

        1. 分詞(只針對中文,英文等西方字母語言已經用空格做好分詞了):將文章按片語分開
        2. 詞法分析:對於英文,有詞頭、詞根、詞尾的拆分,名詞、動詞、形容詞、副詞、介詞的定性,多種詞意的選擇。比如DIAMOND,有菱形、棒球場、鑽石3個含義,要根據應用選擇正確的意思。
        3. 語法分析:通過語法樹或其他演算法,分析主語、謂語、賓語、定語、狀語、補語等句子元素。
        4. 語義分析:通過選擇詞的正確含義,在正確句法的指導下,將句子的正確含義表達出來。方法主要有語義文法、格文法。
        但是以上的分析,僅適用於小規模的實驗室研究,遠不能應用到實際語言環境中,比如說語法,我們能總結出的語法是有限的,可是日常應用的句子,絕大部分是不遵守語法的,如果讓語法包羅所有可能的應用,會出現爆炸的景象。

自然語言處理的應用方向主要有:

        1. 文字分類和聚類:主要是將文字按照關鍵字詞做出統計,建造一個索引庫,這樣當有關鍵字詞查詢時,可以根據索引庫快速地找到需要的內容。此方向是搜尋引擎的基礎,在早期的搜尋引擎,比如北大開發的“天問系統”,採用這種先蒐集資料、在後臺做索引、在前臺提供搜尋查詢服務。目前GOOGLE,百度的搜尋引擎仍舊類似,但是採用了自動“蜘蛛”去採集網路上的資訊,自動分類並做索引,然後再提供給使用者。我曾經在我的文章中做過測試,當文章中有“十八禁”這樣的字眼時,點選次數是我其他文章點選次數的幾十倍,說明搜尋引擎將“十八禁”這個詞列為熱門索引,一旦有一個“蜘蛛”發現這個詞,其他“蜘蛛”也會爬過來。
       2. 資訊檢索和過濾:這是網路瞬時檢查的應用範疇,主要為網警服務,在大流量的資訊中尋找關鍵詞,找到了就要做一些其他的判斷,比如報警。
        3. 資訊抽取:(抄書)資訊抽取研究旨在為人們提供更有力的資訊獲取工具,以應對資訊爆炸帶來的嚴重挑戰。與資訊檢索不同,資訊抽取直接從自然語言文字中抽取事實資訊。過去十多年來,資訊抽取逐步發展成為自然語言處理領域的一個重要分支,其獨特的發展軌跡——通過系統化、大規模地定量評測推動研究向前發展,以及某些成功啟示,如部分分析技術的有效性、快速自然語言處理系統開發的必要性,都極大地推動了自然語言處理研究的發展,促進了自然語言處理研究與應用的緊密結合。回顧資訊抽取研究的歷史,總結資訊抽取研究的現狀,將有助於這方面研究工作向前發展。
        4. 問答系統:目前仍侷限於80年代的專家系統,就是按照LISP語言的天然特性,做邏輯遞迴。LISP語言是括號式的語言,比如A=(B,C,D),A=(B,E,F),提問:已知B,C,能得到什麼樣的結論?結論是A,D;若提問改為已知B,結論則是C,D,A或E,F,A。比如一個醫療用的專家系統,你若詢問“感冒”的治療方法,系統可能給出多種原因帶來的感冒極其治療方法,你若詢問“病毒性感冒”的治療方法,則系統會給出比較單一的、明確的治療方法。你有沒有用過AUTOCAD系統,這個就是建立在LISP語言上的括號系統,在用的時候會出現上述情況。
        5. 拼音漢字轉換系統:這應該是中文輸入法應用範疇的東西,再多的東西我就沒想過。
        6. 機器翻譯:當前最熱門的應用方向,這方面的文章最多。國際上已經有比較好的應用系統,美國有個AIC公司推出過著名的實時翻譯系統,歐共體的SYSTRAN系統可以將英、法、德、西、意、葡六種語言實時對譯,美、日、德聯合開發的自動語音翻譯系統,成功進行了10多分鐘對話。我國軍事科學院、中科院也開發過此類系統。但是這裡邊的問題也很多,最主要的是“滿篇洋文難不住,滿篇譯文看不懂”,就是脫離了人類智慧的機器翻譯,總會搞出讓人無法理解的翻譯,比如多意詞選擇哪個意思合適、怎麼組織出通順的語句,等等。所以目前微軟、GOOGLE的新趨勢是:翻譯+記憶,類似機器學習,將大量以往正確的翻譯儲存下來,通過檢索,如果碰到類似的翻譯要求,將以往正確的翻譯結果拿出來用。GOOGLE宣稱今後幾年就可以推出商業化的網頁翻譯系統。
        7. 新資訊檢測:這個我不知道,沒思路。

        以上已經回答了自然語言發展方向的問題。我認為機器翻譯是最有前途的方向,其難點在於機器翻譯還不具備人類智慧,雖然翻譯已經達到90%以上的正確程度,然而還是不能象人類翻譯那樣,可以準確表達。為什麼存在這樣的難點?關鍵是自然語言處理做不到人類對自然語言的理解,“處理”和“理解”是天差地別的兩個概念。“處理”好比控制眼睛、耳朵、舌頭的神經,他們將接收的資訊轉化成大腦可以理解的內部資訊,或者反過來,他們的功能就是這麼多。而“理解”則是大腦皮層負責語言理解那部分,多少億的腦細胞共同完成的功能。一個人因為其自身家庭背景、受教育程度、接觸現實中長期形成的條件反射刺激、特殊的強列刺激、當時的心理狀況,這麼多的因素都會影響和改變“理解”的功能,比如我說“一個靚女開著BMW跑車”,有人心裡會想這是二奶吧?有人心裡會仇視她,聯想到她會撞了人白撞;做汽車買賣的人則會去估量這部車的價值;愛攀比的人也許會想,我什麼時候才能開上BWM?所以“理解”是更加深奧的東西,涉及更多神經學、心理學、邏輯學領域。

       還有上下文理解問題,比如這句:“我們90平方米以後會佔的分量越來越大,那麼這樣他的價格本身比高檔低很多,所以對於整體把這個價格水平給壓下來了,這個確實非常好的。” 你能理解麼?估計很難或者理解出多種意思,但是我把前文寫出來:“去年國家九部委聯合釋出了《建設部等部門關於調整住房供應結構穩定住房價格意見的通知》,對90平方米以下住房須佔總面積的70%以上作出了硬性規定,深圳市經過一年的調控,目前已做到每個專案的75%都是90平方米以內。深圳市國土資源和房產管理局官員說”看了後面的你才能知道是根據國家的通知,深圳做了相應的調整。

自然語言理解

1. 語義表示

自然語言理解的結果,就是要獲得一個語義表示(semantic representation):

這裡寫圖片描述

語義表示主要有三種方式:

       1. 分佈語義,Distributional semantics
       2. 框架語義,Frame semantics
       3. 模型論語義,Model-theoretic semantics

1.1 分佈語義表示(Distributional semantics)

       說distributional semantics大家比較陌生,但如果說word2vec估計大家都很熟悉,word2vec的vector就是一種distributional semantics。distributional semantics就是把語義表示成一個向量,它的理論基礎來自於Harris的分佈假設:語義相似的詞出現在相似的語境中(Semantically similar words occur in similar contexts)。具體的計算方法有多種,比如LSA(Latent Semantic Analysis)、LDA(Latent Dirichlet Allocation)及各種神經網路模型(如LSTM)等。

       這種方法的優點在於,它完全是資料驅動的方法,並且能夠很好的表示語義,但一個很大的缺點在於,它的表示結果是一個整體,沒有進一步的子結構。

1.2 框架語義表示(Frame semantics)

       顧名思義,這種方法把語義用一個frame表示出來,比如我們一開始舉得例子:“訂一張明天北京去杭州的機票,國航頭等艙”,表示如下:

這裡寫圖片描述

       在計算方法上,典型的比如語義角色標註(Semantic Role Labeling),具體可以分為兩個步驟:frame identification和argument identification,frame identification用於確定frame的型別,argument identification用於計算各個屬性的具體值。這種方法和distributional semantics相比,能夠表達豐富的結構。

1.3 模型論語義表示(Model-theoretic semantics)

       模型輪語義表示的典型框架是把自然語言對映成邏輯表示式(logic form)。比如對於下圖中的“中國面積最大的省份是哪個?”,將其表示成邏輯表示式就是圖中紅色字型部分,進一步那這個邏輯表示式去知識庫中查詢,就得到了答案。在計算方法上,典型的就是構建一個semantic parser。

這裡寫圖片描述

       模型論語義表示是對世界知識的完整表示,比前兩種方法表達的語義更加完整,但是缺點是semantic parser的構建比較困難,這大大限制了該方法的應用。

1.4 目前採用的語義表示

       目前常用的是frame semantics表示的一種變形:採用領域(domain)、意圖(intent)和屬性槽(slots)來表示語義結果。
       其中,領域是指同一型別的資料或者資源,以及圍繞這些資料或資源提供的服務,比如“餐廳”,“酒店”,“飛機票”、“火車票”、“電話黃頁”等;意圖是指對於領域資料的操作,一般以動賓短語來命名,比如飛機票領域中,有“購票”、“退票”等意圖;屬性槽用來存放領域的屬性,比如飛機票領域有“時間”“出發地”“目的地”等;
       對於飛機票領域,我們的語義表示結構如下圖所示:

這裡寫圖片描述

       進一步,我們對於世界的語義描述(又稱為domain ontology)如下:

這裡寫圖片描述

2. 自然語言理解技術難點

       在確定了自然語言理解的語義表示方法後,我們把技術方案抽象為如下兩步:
這裡寫圖片描述

       這和前文提到的語義角色標註把過程分為frame identification和argument identification類似,領域分類和意圖分類對應frame identification,屬性抽取對應argument identification。無論對於分類還是對於抽取來說,都需要有外部知識的支援。在實現的過程中,我們面臨著如下的困難:

(1)如何構建知識庫
       “總參”除了表示總參謀部外,還是南京一家很火的火鍋店;“中華冷麵”除了是一種麵條,還是一首歌名;“王菲的紅豆”是指王菲唱的紅豆這首歌,但如果說“韓紅的紅豆”就不對了,因為韓紅沒有唱過紅豆這首歌。要想把這些知識都理解對,就需要一個龐大的知識庫,這個知識庫中的實體詞數以千萬計,怎麼挖掘,怎麼清洗噪音,都是很大的挑戰。

(2)如何理解使用者語句的意圖
       “東三環堵嗎”這句話意圖是查詢路況,“下水道堵嗎”就不是查路況了;“今天的天氣”是想問天氣狀況,“今天的天氣不錯”則無此意;“附近哪兒可以喝咖啡”是想找咖啡館,但“牛皮癬能喝咖啡嗎”就是一個知識問答了。類似上述的例子舉不勝舉,更別說語言理解還受時間、位置、裝置、語境等等問題的影響。

(3)如何構建可擴充套件的演算法框架
       現實世界包含眾多的領域,而我們不可能一次性的把所有領域都定義清楚並且實現之,那我們就需要一個可擴充套件的演算法框架,每當修改或者新增某個領域的時候,不會對其他領域造成干擾。

(4)如何構建資料驅動的計算流程
       大資料時代,如果一個演算法或者流程不是資料驅動的,不是隨著資料的增加而自動提升效果,那這個演算法框架就沒有持續的生命力。

(5)如何融入上下文知識
       在對話場景中,每句話都有對話上下文,同樣的句子在不同的上下文中理解結果是不一樣的,比如如下的例子,同樣的一句話“今天天氣好嗎”在左側圖中屬於天氣領域,而在右側圖中則屬於音樂領域。

這裡寫圖片描述