文本處理是NLP領域的一個重要分支,其細分領域又包括文本聚類、分類、機器翻譯、人機交互等等,而這一切的前提都是將文本表示成計算機可以理解和易于處理的數據。
經過成千上萬年的進化,人類的語言本身變得十分抽象和復雜,要搞懂一段文字,那么要理解詞本身的意義、語義關系、上下文關系(蘋果好吃/蘋果公司),如何將文字用計算機語言表達出來,并盡量減少編碼過程中造成的信息損失,一直是一個業界難題和很重要的研究方向。本文總結一下目前熱門的Word Embedding表示方法的歷史和原理,以供參考。
1. Word Embedding的基本概念
1.1 什么是Word Embedding?
現有的機器學習方法往往無法直接處理文本數據,因此需要找到合適的方法,將文本數據轉換為數值型數據,由此引出了Word Embedding的概念。如果將word看作文本的最小單元,可以將Word Embedding理解為一種映射,其過程是:將文本空間中的某個word,通過一定的方法,映射或者說嵌入(embedding)到另一個數值向量空間(之所以稱之為embedding,是因為這種表示方法往往伴隨著一種降維的意思,詳見下文的討論)。
1.2 Word Embedding的輸入
Word Embedding的輸入是原始文本中的一組不重疊的詞匯,假設有句子:apple on a apple tree。那么為了便于處理,我們可以將這些詞匯放置到一個dictionary里,例如:["apple", "on", "a", "tree"],這個dictionary就可以看作是Word Embedding的一個輸入。
1.3 Word Embedding的輸出
Word Embedding的輸出就是每個word的向量表示。對于上文中的原始輸入,假設使用最簡單的one hot編碼方式,那么每個word都對應了一種數值表示。例如,apple對應的vector就是[1, 0, 0, 0],a對應的vector就是[0, 0, 1, 0],各種機器學習應用可以基于這種word的數值表示來構建各自的模型。當然,這是一種最簡單的映射方法,但卻足以闡述Word Embedding的意義。下文將介紹常見的Word Embedding的方法和優缺點。
2 Word Embedding的類型
Word Embedding也是有流派的,主流有以下兩種:
- 基于頻率的Word Embedding(Frequency based embedding)
- 基于預測的Word Embedding(Prediction based embedding)
下面分別介紹之。
2.1 基于頻率的Word Embedding
基于頻率的Word Embedding又可細分為如下幾種:
- Count Vector
- TF-IDF Vector
- Co-Occurence Vector
其本質都是基于one-hot表示法的,以頻率為主旨的加權方法改進,下面逐一介紹。
2.1.1 Count Vector
假設有一個語料庫C,其中有D個文檔:{d1, d2, ..., dD},C中一共有N個word。這N個word構成了原始輸入的dictionary,我們據此可以生成一個矩陣M,其規模是D X N。
假設語料庫內容如下:
D1: He is a boy.
D2: She is a girl, good girl.
那么可以構建如下2 × 7維的矩陣。
該矩陣便是一個counter vector matrix。每個文檔用詞向量的組合來表示,每個詞的權重用其出現的次數來表示。
當然,如果語料庫十分龐大,那么dictionary的規模亦會十分龐大,因此上述矩陣必然是稀疏的,會給后續運算帶來很大的麻煩。通常的做法是選取出現次數最頻繁的那些詞來構建dictionary(例如,top 10,000個詞),這樣會有效縮減上述矩陣的規模。
2.1.2 TF-IDF
上一小節中,在構建詞的權重時,只考慮了詞頻TF(Term Frequncy),也就是詞在單個文檔中出現的頻率。直覺上來看,TF越大,說明詞在本文檔中的重要性越高,對應的權重也就越高。這個思路大體上來說是對的,例如,對于一個主題是Cat的文檔,顯然Cat這個詞匯在本文檔中的出現頻率會相對高。
但如果我們把視野擴展到整個語料庫,會發現,像is,a等通用詞匯,幾乎在每個文檔里出現的頻率都很高。由此,我們可以得到這樣的結論:對于一個word,如果在特定文檔里出現的頻率高,而在整個語料庫里出現的頻率低,那么這個word對于該文檔的重要性就比較高。因此我們可以引入逆文檔頻率IDF(Inverse Document Frequency)的概念:IDF=log(N/n)。其中,N代表語料庫中文檔的總數,n代表某個word在幾個文檔中出現過;當一個word出現地越頻繁,那么IDF就越小。顯然,IDF用于懲罰那些常用詞匯,而TF用于獎勵那些在特定文檔中出現頻繁的詞匯。二者的乘積TF X IDF用來表示詞匯的權重,顯然合理性大大增強。
舉例:
語料庫中共有2個文檔,其中有一個文檔名為d。
共有1個文檔出現了cat這個詞匯;且在特定文檔d中,共有8個詞匯,cat出現了4次。
共有2個文檔出現了is這個詞匯;且在特定文檔d中,共有8個詞匯,is出現了4次。
那么根據定義,可以得到:
TF("cat", d)=4/8=0.5
TF("is", d)=4/8=0.5
IDF("cat", d) = log2(2/1)=0.301
IDF("is", d) = log2(2/2)=0
TFIDF("cat", d)=TF("cat", d)*IDF("cat", d)=0.5*0.301=0.15
TFIDF("is", d)=TF("is", d)*IDF("is", d)=0.5*0=0
可見,TFIDF算法極大地懲罰了is這個詞匯,從而增加了權重設置的合理性。
2.1.3 Co-Occurence Vector
本文最開頭有所提及,自然語言一大特色是語義和上下文。有如下著名的研究結果:相似的單詞趨向于有相似的上下文(context)。舉例:
- 那個人是個男孩。
- 那個人是個女孩。
男孩和女孩從概念上來說相似,他們也具有相似的上下文。
根據如上思想,我們可以構建一套算法,來實現基于上下文的特征構建。
這里需要引入兩個概念:
-
Context Window:
上面我們提到了context,但context的長度需要有一個界定,也就是說,對于一個給定的word,需要有一個Context Window大小的概念。
contex window
如上圖所示,如果指定Context Window大小為2,范圍為前后兩個word,那么對于such這個詞,它的Context Window如上圖所示。
-
Co-Occurence(共現):
有了Context Window的概念,Co-Occurence就好理解了。對于such這個單詞來說,在其上下文窗口內,它分別與[she, is, a, beautiful]這四個單詞各出現了一次共現。如果我們在語料庫中所有such出現的地方,計算其共現的單詞,并按次數累加,那么我們就可以利用其上下文范圍內的單詞來表示such這個詞,這就是Co-Occurence Vector的計算方法。.
假設有如下語料庫:
He is not lazy. He is intelligent. He is smart.
如果Context Window大小為2,那么可以得到如下的共現矩陣:
我們可以看看He和is的共現次數4是如何計算出來的:
顯然地,直接使用共現矩陣,也會存在維數過大的問題,通常可以采取矩陣分解等手段來進行降維優化,在此不做深入討論。
共現矩陣最大的優勢是這種表示方法保留了語義信息,例如,通過這種表示,就可以知道,man和woman是更加接近的,而man和apple是相對遠的。相比前述的兩種方法,更具有智能的味道。
2.2 基于預測的Word Embedding
從上文2.1.3節中已經得知,詞的表示中如果蘊含了上下文信息,那么將會更加接近自然語言的本質;并且,由于相似的詞有相似的表示方法,甚至可以進行一些運算,例如:人類-男人=女人。但是,上述討論中,有一個很大的缺陷,那就是詞的向量表示維度過大,一個詞要用大量其余的詞來表示,為后續運算帶來了很大的麻煩。因此,我們需要找到一種更好的表示方法,這種方法需要滿足如下兩點要求:
- 攜帶上下文信息
- 詞的表示是稠密的
事實證明,通過神經網絡來進行建模,可以滿足這兩點要求。主流的建模方法又有兩種:CBOW和Skip – Gram,下面分別介紹其思想。
2.2.1 CBOW(continues bag of words)
CBOW的全稱是continuous bag of words。其本質是通過context來預測word。
如上圖所示,首先語料庫內的每個word都可以用one-hot的方式編碼。假設選取Context Window為2,那么模型中的一對input和target就是:
- input:He和is的one-hot編碼
- target:a的one-hot編碼
接著通過一個淺層神經網絡來擬合該結果,如下圖所示:
過程簡單介紹如下(實際算法會用到哈夫曼編碼等降維技巧,這里僅以理解為目的簡介基本原理):
- 輸入為C個V維的vector。其中C為上下文窗口的大小,V為原始編碼空間的規模。例如,示例中的C=2,V=4.兩個vector分別為4維的He和is的one-hot編碼形式;
- 激活函數相當簡單,在輸入層和隱藏層之間,每個input vector分別乘以一個VxN維度的矩陣,得到后的向量各個維度做平均,得到隱藏層的權重。隱藏層乘以一個NxV維度的矩陣,得到output layer的權重;
- 隱藏層的維度設置為理想中壓縮后的詞向量維度。示例中假設我們想把原始的4維的原始one-hot編碼維度壓縮到2維,那么N=2;
- 輸出層是一個softmax層,用于組合輸出概率。所謂的損失函數,就是這個output和target之間的的差(output的V維向量和input vector的one-hot編碼向量的差),該神經網絡的目的就是最小化這個loss;
- 優化結束后,隱藏層的N維向量就可以作為Word-Embedding的結果。
如此一來,便得到了既攜帶上下文信息,又經過壓縮的稠密詞向量。
2.2.2 Skip – Gram
Skip-Gram模型可以認為是CBOW的一個網絡翻轉。CBOW建模的出發點是利用context預測word。Skip-Gram模型的目的則是通過word來預測context。其目的都是為了通過構建一個神經網絡模型來獲取壓縮后的詞向量。這里不再詳述。
3 Word Embedding的應用
現今流行的Word Embedding算法攜帶了語義信息且維度經過壓縮便于運算,因此有了很多用武之地,例如:
- 計算相似度,比如man和woman的相似度比man和apple的相似度高
- 在一組單詞中找出與眾不同的一個,例如在如下詞匯列表中:[dog, cat, chicken, boy],利用詞向量可以識別出boy和其他三個詞不是一類。
- 直接進行詞的運算,例如經典的:woman+king-man =queen
- 由于攜帶了語義信息,還可以計算一段文字出現的可能性,也就是說,這段文字是否通順。
本質上來說,經過Word Embedding之后,各個word就組合成了一個相對低維空間上的一組向量,這些向量之間的遠近關系則由他們之間的語義關系決定。
4 總結
詞的表示一直是NLP很活躍的一個領域,本文主要是提供了一個脈絡,簡介了一下Word Embedding的原理。感興趣的讀者可以就每種表示方法進行深入了解,基于各自的優缺點在實踐中應用。