「你指尖躍動的代碼,是我此生不變的信仰,唯我NLP永世長存」

1. 從NLP和知識圖譜說起

本人的主要領域是知識圖譜的方向,但是自然語言處理是知識圖譜是繞不開的話題,一種普遍看法是知識圖譜是自然語言處理的基石,而知識圖譜靠自然語言處理的應用落地。

為什麼是這樣呢? 我們可以從兩者的定義出發。

什麼是知識圖譜?

借鑒其中一個理解:起源於語義網路,主要的目標是用來描述真實世界中間存在的各種實體和概念,以及它們之間的關聯關係。

什麼是NLP?

也借鑒一個理解,機器接受用戶自然語言形式的輸入,並在內部通過人類所定義的演算法進行加工、計算等系列操作,以模擬人類對自然語言的理解,並返回用戶所期望的結果。

從上述描述中可以看到相近的幾個辭彙:「語義網路」、「自然語言」、「自然客觀世界」。所以NLP和知識圖譜是為了解決同一個目的: 讓機器和人類有相同的思考理解能力,並且機器可以和人類進行擬人化的交互。

在實際應用中,知識圖譜和NLP的目的也是相同的,比如:智能問答、翻譯、推薦系統等。知識圖譜的構建離不開NLP技術對於自然語言的抽取、NLP的應用離不開知識圖譜的關聯方分析和推理能力。

所以在研究知識圖譜的過程中,自然語言處理是無法迴避的領域。

2. 想理解,先分詞

如果用搜索引擎搜索「蘋果和鎚子」, 你猜會不會出現一個河神問你想搜索的是金蘋果還是金鎚子。如果你回答你想搜索的是鐵蘋果,你就能獲贈一個金鎚子手機。

你可以用任何一個搜索引擎去試驗,僅僅是搜索「蘋果和鎚子」這兩個完全沒有前後語境的詞語,搜索返回的結果會全部都是關於「蘋果手機」和「鎚子手機」。 但是如果單獨搜索「蘋果」或者「鎚子」,如果不是網站記錄了搜索偏好,返回的結果里多少都會包含非手機的「蘋果」和「鎚子」。

出現這樣情況的原因,是搜索網站的知識圖譜里一定存在「手機」「蘋果」「鎚子」之間的關聯關係。所以機器能夠把三者之間建立聯繫並且返回結果。如果搜索的是一句話呢:「蘋果和鎚子哪個更好」。那麼機器可能首先要從這個句子中正確的提取出「蘋果」和「鎚子」兩次詞語了。而不是提取出「萍、果和、錘、子」。

所以搜索「蘋果和鎚子哪個更好」的時候,搜索引擎幹了很多事情,其中至少包含了這兩件事情: 理解輸入、遍歷圖譜。其中,理解輸入就是一個自然語言處理過程。這個過程大概可以分為:詞法分析、句法分析、語義分析。

搜引擎收到輸入,首先將每個句子切割為詞語,然後進行詞性標註,接著對標註過的句子進行命名實體識別,最後搜索實體間可能存在的關係。所以在對文句子進行命名實體識別之前必須對進行分詞和詞性標註。

所以詞法分析是自然語言處理的第一個環節,把詞法分析細分步驟即為:分詞、詞性標註、命名實體識別和詞義消歧。

其中命名實體和詞義消歧是知識圖譜構建的關鍵流程,而分詞是詞法分析最基本的任務。關於分詞的演算法當前已經比較成熟了,準確率基本可以達到90%以上了,而剩下不到10%卻是技術落地應用的巨大鴻溝。出現這樣的情況是因為在實際應用中對於分詞準確度的要求極高,用一個常見的例子舉例:「南京市長江大橋」,這裡涉及到三個基本問題:

  • 分詞粒度。「長江大橋」是一個詞還是兩個詞。
  • 語境歧義。比如「南京市長江大橋」可以理解為「南京市/長江大橋」,,也可以理解為「南京/市長/江大橋」。
  • 詞典未錄入。如果「江大橋」沒有在詞典里,是否能夠判斷出這是一個詞語。

3. 分詞演算法綜述

如上所訴,分詞是自然語言處理中最經典同時也是最基礎的問題。而分詞首先要面臨的場景是不同的語言「分詞」的重點是完全不同的。對於英文等語言來說,句子中的詞語是通過單詞天然分割的,所以對這類語言來說更多工作是集中在實體識別、詞性標註等。對於像中文這樣的語言來說,文章是由句子組成、句子是由詞語組成、詞語是由字組成,所以切割句子抽取詞語是理解文章句子最基礎的一步。

這裡主要討論中文分詞的演算法,但是中文定義一個句子中的詞語是很難的。以前看到過一個調查是對以漢語為母語的人進行測試,對於句子中詞語的認同率只有70%左右。人尚且如此,對於機器來說就更是一個巨大的挑戰。

分詞演算法按照規則來說可以分為:按照字典的分詞和按照字的分詞。

按照技術發展來說可以分為:基於規則的分詞、基於統計學的分詞、基於神經網路的分詞。

下面將介紹最基本的三種分詞演算法:

  • 基於規則的方法:最大匹配分詞演算法;
  • 基於統計的方法:n-gramn分詞演算法;
  • 基於神經網路的方法:BiLSTM+CRF

3.1. 最大匹配分詞演算法

最大匹配演算法是基於詞典的演算法即首先要有一個詞典作為語料庫,所匹配到的詞語是提前錄入到詞典中的詞語。演算法的基本原理其實很直接,按照現代正常的閱讀習慣從左往右進行,去匹配可以匹配到的詞典中最長詞語,若組不了詞的字則單獨劃分。

演算法需要兩個輸入,一個是分詞詞典(已知的詞語集合),另一個是需要被分詞的句子。以下舉一個簡單的例子來說明匹配過程:

分詞詞典:{「今天」,」好吃的」,」吃」,」什麼」}

待分詞句子:今天吃什麼?

找第一個詞的分詞過程:

今天吃什麼 =>
今天吃什 =>
今天吃 =>
今天 => 得到詞語:今天

上述例子是正向匹配,還可以進行逆向匹配,進一步可以結合最小切分和限定最大詞語長度提高匹配的準確率。但是該演算法在實際使用的準確率仍舊是很差的,因為很容易就構造出反例,比如剛剛提到的「南京市長江大橋」,根據分詞詞典有可能得到「南京市長」這樣的結果。另外一個問題是該演算法依賴於已知的詞典,如果出現新詞不在詞典里則無法得到正確的結果。

3.2. n-gramn分詞演算法

N-Gram是一種基於統計語言模型的演算法,利用概率判斷詞語的組成情況。演算法基於一個前提:句子中包含常見詞語的可能性會肯定大於包含生僻詞的可能性,所以該演算法的目的是「為分詞尋找最有可能的結果」。

求概率最直接的方法就是數個數,比如對於剛剛的例子「南京市長江大橋」有各種分詞方法:

  • 南京/市/長江/大橋
  • 南京/市/長江大橋
  • 南京市/長江大橋
  • 南京/市長/江/大橋
  • 南京/市長/江大橋

……

每種分詞在語料庫中出現的次數為m,語料庫的總數為n,則每種分詞的概率為m/n。

上述的方法在理論上是沒問題的,但是對於實際應用場景來說,語料庫不可能包含所有的句子,所以,如何高效的數個數是問題關鍵。

該演算法思想不複雜,但是介紹起來卻要寫很多,這裡只大概描述下過程,詳細演算法介紹可以很輕鬆找到!

在介紹演算法之前作如下兩個定義:

  • 詞語序列: w_1, w_2, w_3, … , w_n
  • 鏈式規則: P(w_1, w_2, w_3, … ,w_n)=P(w_1)P(w2_|w_1)P(w_3|w_1w_2)P(w_4|w_1w_2w_3)…P(w_n|w_1w_2…w_n-1)

現在我們要計算「南京市/長江/大橋」的概率,按照貝葉斯公式則有:

P(「南京市」,「長江」,「大橋」) = P(「南京市」)P(「長江」 | 「南京市」)P(「大橋」 | 「南京市" , "長江」),

仔細想想上面的計算,其中,

P(「大橋」 | 「南京市" , "長江」)=P(「南京市" ,"長江" , "大橋」) / P(「南京市" ,"長江」)

納尼?!P(「南京市" ,"長江" , "大橋」) 不就是我們要計算的概率么,要計算P(A)要先已知P(A)?!

廢話這麼多,終於輪到N-Gram演算法上場了。該演算法基於以下假設:第n個詞w_n只與前面n-1個詞有關,該假設也叫作馬爾可夫假設。

N-Gram中的N是窗口長度,

n=1時,P( w_1, w_2, … , w_{n-1},w_n)=prod_{i=1}^{n}P(w_i)

n=2時, P( w_1, w_2, … , w_{n-1},w_n)=prod_{i=1}^{n}P(w_i|w_{i-1})

n=3時, P( w_1, w_2, … , w_{n-1},w_n)=prod_{i=1}^{n}P(w_i|w_{i-1}w_{i-2})

比如n=2時,則

P(「南京市」,「長江」,「大橋」) = P(「南京市」)P(「長江」 | 「南京市」)P(「大橋」 | 「長江」)

P(「長江」 | 「南京市」)=Count("南京市" , "長江")/Count("南京市")

然後再用數數的方法就可以得到以上結果。

把所有分詞可能用圖的方式表示出來,就是求一個有向加權圖的最短路徑問題。概率最大的分詞結果即為所得。在實際應用中還是會覺得計算空間很大,比如有5000個詞語,那麼2-gram就是 5000 * 5000個二維組合,但是相比於直接用貝葉斯公式也會小很多。另外還會採用數據平方式減少上述二維表的稀疏性。

N-Gram演算法最典型應用是搜索引擎或者輸入法的詞語聯想補全。輸入前面幾個字的時候,會自動聯想出最有可能的接下來的詞。

3.3. BiLSTM+CRF分詞演算法

該演算法實際上是兩個演算法的合成,即BiLSTM和CRF演算法。這兩個演算法,如果真的詳細介紹起來會涉及很多基礎知識,包括馬爾科夫鏈、神經網路等。以後有機會詳細寫一篇博客來介紹兩者的細節,這裡暫時簡單羅列下。

CRF想比較於傳統統計學的方法的最大優勢在於考慮了上下文場景,對多意詞和詞典未錄入的詞有更好的效果,但是效率比較低,需要的大量的訓練和計算時間。

LSTM為RNN變種的一種,在一定程度上解決了RNN在訓練過程中梯度消失和梯度爆炸的問題。雙向(Bidirectional)循環神經網路分別從句子的開頭和結尾開始對輸入進行處理,將上下文信息進行編碼,提升預測效果。相比於其它模型,可以更好的編碼當前字等上下文信息。基本步驟是:

  1. 標註序列;
  2. 雙向LSTM網路預測標籤;
  3. Viterbi演算法求解最優路徑

BiLSTM-CRF是兩種演算法模型的結合,可以保證最終預測結果是有效的。演算法輸入是詞嵌入向量,輸出是每個單詞對應的預測標籤。

4. NLP技術工程化

語言理解是人工智慧領域皇冠上的明珠」 ——比爾蓋茨。

通常認為人工智慧是機器從感知到認知的過程。在感知階段,最知名的應該是計算機視覺技術。視覺感知在理論上已經達到了一個很成熟的階段,不止能夠識別物體圖像,甚至還能預測物體的下一個動作。在應用上,視覺技術在大部分場景種對於準確度的要求並不會太嚴苛,相比於自然語言處理則是「差之毫厘謬之千里」。

在技術上,NLP的最難的問題是以下四類場景:問答、翻譯、複述、文摘。

問答即人和機器進行聊天交互,聊天可以是語音識別也可以是文字交互,機器要能理解聊天內容,內容的情感,並且能夠給出合適的回應,再進一步能夠根據聊天內容進行自我學習增長知識。翻譯是機器要理解多種不同的語言,在語法語境語義上能夠相互轉化。複述可以更加廣義的理解為把一種結構的數據轉化成另外一種結構。文摘是將一大段內容進行抽象提煉,通過更少的內容概括更多的內容。

以上的應用場景會涉及一整套自然語言處理方法流程,包括: 詞法分析、句法分析、文檔分析、語義分析、分類、相似度匹配等。

將以上的基礎問題包裝成具體的業務場景,即為常見的:自動問答、糾錯消歧、詞典翻譯、自動編文、標籤分類、情感分析、推薦系統、爬蟲系統等。

自然語言處理如何落地到具體應用?

個人認為當前對於NLP的應用落地來說最重要的是「兩端問題」,即頂層產品和底層數據。在底層是否有面向垂直領域的足夠大的語料庫,在頂層是否有足夠好的交互系統。

在底層,不管是自然語言處理還是知識圖譜,多數努力的方向都是建立一個通用的知識庫和詞典等。而在面向垂直領域則有很高的市場壁壘,一方面是基於數據安全和數據資產的原因,大部分數據都是非公開的,無法直接使用。另外一方面是垂直領域建模需要有深入的業務理解,這也是需要在一個行業深耕的經驗為基礎。 通過針對具體的業務特點做定製化構造一個面向垂直領域的知識圖譜,以及基於這個圖譜的NLP應用,才能真正的提升相關業務的生產力

在頂層,需要用產品將理論落地。除了產品本身符合正確的業務流程,更需要良好的交互來提升用戶體驗。比如智能客服應用,對於多輪交互肯定無法做到100%,但是可以通過友好的交互使用戶願意接受結果。如果交互做的不好,即便技術上準確率會很高也會被抱怨。再比如對於語音實施翻譯來說,又會面臨噪音、遠場、口音等問題。所以將NLP技術落地會涉及很多定製化場景,除去技術,對於產品經理也提出了很高的要求。

有意思的是知識圖譜被看作是人工智慧的基石,而NLP被稱作人工智慧皇冠上的明珠。這句話足以體現兩者間的互相依賴,知識圖譜需要藉助自然語言處理技術去構建圖譜,而自然語言處理需要藉助知識圖譜完成推理。技術演算法是通用的,但是業務場景確是定製化的。產品經理對於技術落地需要做非常深入的思考,如何把理論技術工程化、產品化、最後商業化變現?用技術講故事的同時,要求更多的乾貨來提升業務目標。

推薦閱讀:

相关文章