計算機是如何理解自然語言的?| NLP基礎

  • 2019 年 11 月 29 日
  • 筆記

NLP基礎系列

1. 淺論語言與認知的關係

2. 為什麼要處理自然語言 計算機是如何理解自然語言的?

讓計算機理解自然語言

「教」計算機理解人類的自然語言這部分工作,稱作自然語言理解(Natural Language Understanding, NLU)。

可以算作自然語言處理(Natural Language Processing, NLP)的一部分。

具體要做的事情,就是讓計算機「明白」人類正常講話時使用的語言,而不是幾個英文關鍵字加一堆參數的格式化的指令。

這是怎麼做到的呢?讓我們先來看看——

人類如何理解自然語言

舉個例子,我說「蘋果」這個詞,你會想到什麼?

一種酸酸甜甜紅紅綠綠的球狀水果,對吧。想起來的時候,或許腦子裡會出現蘋果的圖像,回味起它香甜的味道;或者想起和蘋果有關的其他水果、食物……

我們人類理解語言的時候,是把一個抽象的詞語和一個具體的事物關聯起來。這個事物是我們頭腦中知識庫圖譜里的一個節點,和周圍若干節點直接相連,和更多節點間接相連……

計算機如何理解自然語言

我們用鍵盤敲出「蘋果」兩個字的時候,計算機並不會幻視出一個水果,也不會像人那樣「意識到」這個單詞的含義。

無論通過輸出設備顯示成什麼樣子,計算機所真正能夠處理的,是各種各樣的數值。

要想讓計算機理解人類的語言,就需要把人類的語言轉化成它可以用來讀取、存儲、計算的數值形式。

當若干自然語言被轉換為數值之後,計算機通過在這些數值之上的一系列運算來確定它們之間的關係,再根據一個全集之中個體之間的相互關係,來確定某個個體在整體(全集)中的位置。

這麼說有點繞,還是回到例子上。很可能,我說「蘋果」的時候,有些人首先想到的不是水果,而是喬幫主的公司創造的各種科技產品。

但是,我繼續說:「蘋果一定要生吃,蒸熟了再吃就不脆了。」——在這句話里,「蘋果」一詞確定無疑指的是水果,而不是公司。

因為在我們的知識庫里,都知道水果可以吃,但是公司不能吃。出現在同一句話中的 「吃」對「蘋果」起到了限定作用——這是人類的理解。

自然語言的數值化和計算

對於計算機,當若干包含「蘋果」一詞的文檔被輸入進去的時候,「蘋果」被轉化為一個數值Va。經過計算,這個數值和對應「吃」的數值Ve產生了某種直接的關聯,而同時和Ve產生關聯的還有若干數值,它們對應的概念可能是「香蕉」(Vb)、「菠蘿」(Vp)、「獼猴桃」(Vc)……

那麼據此,計算機就會發現Va,Vb,Vp,Vc之間的某些關聯。怎麼利用這些關聯,就要看具體的處理需求了。

計算機處理自然語言必經由兩個步驟:i)數值化,和 ii)計算。

換句話說,機器理解人類語言,需要把「人話」轉化成一系列數值,再對這些數值進行計算。

I. 數值化

如何把人話(自然語言)轉換為數值呢?

首先需要注意一點:說到數值,大家可能本能的想到int, double, float……

但如果將一個語言要素對應成一個標量的話,太容易出現兩個原本相差甚遠的概念經過簡單運算相等的情況。

假設「蘋果「被轉化為2,而」香蕉「被轉化為4,難道說兩個蘋果等於一個香蕉嗎?

因此,一般在處理時會將自然語言的單位語素轉化成n維向量

只要轉化方式合理,規避向量之間因為簡單運算而引起歧義的情況還是比較容易的。

此處需要一個步驟,把原始文字形式的訓練數據轉化為數值形式。為了做到這一點,我們需要構建一個向量空間模型(Vector Space Model/VSM)。

VSM負責將一個個自然語言文檔轉化為一個個向量。說到具體的轉化方法,我們之後再介紹。

II. 計算

自然語言已經轉化為了數值形式,那麼下一步,究竟進行怎樣的計算呢?

這就要看你具體要做什麼事情了。在自然語言理解(NLU)中,負責來進行具體計算的那個部分,叫做:模型

根據要做的事情不同,模型也是各種各樣的。

比如,在開發問題解決型聊天機械人的過程中,為了理解用戶用自然語言提出的問題,我們就需要意圖識別和實體提取模型。

模型是什麼

一個已經訓練好的模型可以被理解成一個公式 y=f(x),我們把數據(對應其中的x)輸入進去,得到輸出結果(對應其中的y)。

這個輸出結果可能是一個數值,也可能是一個標籤,它會告訴我們一些事情。

比如,我們把用戶說的一句話輸入識別用戶意圖的分類模型。模型經過 一番運算,吐出一個標籤,這個標籤,就是這句話的意圖。

在把這句話再輸入到實體提取模型裏面。模型會吐出一個List,其中每一個element都是一個實體。

模型是怎麼得到的?

模型是基於數據,在算法的控制下,經由訓練得到的。

訓練又是怎麼回事?

當我們把模型當做y=f(x)時,x就是其中的自變量,y是因變量。從x計算出y要看f(x)是一個具體什麼樣的公式,這個公式中還有哪些參數,這些參數的值都是什麼。

訓練的過程就是得到具體的某個f(x),和其中各個參數的具體取值的過程。

在開始訓練的時候,我們所有的是x的一些樣本數據,這些樣本本身即有自變量(特徵)也有因變量(預期結果)。對應於y=f(x)中的x和y取值實例。

這個時候,因為已經選定了模型類型,我們已經知道了f(x)的形制,比如是一個線性模型y=f(x)=ax^2+bx+c,但卻不知道裏面的參數a,b,c的值。

訓練,就是要將已有樣本經過依據某種章法的運算,得到那些參數的值,由此得到一個通用的f(x)。

這些運算的章法,就叫做:算法

說到算法,就涉及到了機器學習的內容,經過幾十年的研究,已經有很多現成的算法可以用於獲得不同類型的模型。

此處有一點和之前呼應,就是:任何算法的處理對象都是數值。

用於訓練模型的數據有個專名的名稱稱呼它們:訓練數據。訓練數據的集合叫做訓練集。

將訓練數據輸入給算法進行計算,最終就得到了我們想要的模型:訓練數據 + 算法 => 模型

然後用得出的模型去處理更多的數據,用來獲取模型對這些新數據的判斷——例如:識別意圖,或者抽取實體——計算機也就因此而理解了人類的自然語言。