自然語言處理(NLP)的一些常見任務有:文字分類、指代消歧、自動摘要、機器翻譯、主題識別等。傳統的處理方法是基於規則的,現在更傾向於使用機器學習或深度學習的方法解決。那麼如何在計算機中表達一段文字/一個詞的意思呢?第一步必然是將這些語言特徵轉化為量化的表達方式。本篇文章總結一下NLP中常用的文字特徵表示方式,並提供實際案例和程式碼實現,用於解決文字分類問題。
1. 離散表示(Discrete Representation)
1.1 One-Hot,獨熱表示法
NLP 中最常用、最傳統的詞特徵表示方式是採用One-Hot 編碼,即每一個詞特徵都被表示成一個很長的向量,其長度等於詞表大小,當前詞對應位置為1,其他位置為0。
舉個簡單的例子,如果語料中有以下三段內容:
建立的詞表中詞彙依次為:I,like,deep,learning,NLP,enjoy, flying .
將第一句中的詞彙用 One-Hot 的方法表示:
但是這種表示方式存在顯而易見的問題:
1. 不同詞之間總是正交的,無法衡量不同詞之間的相似關係。
2. 只能反映每個詞是否出現,但無法突出詞之間重要性的區別。
1.2 Bag of Words(BOW),詞袋錶示法
在One-Hot 表示法的基礎上,對詞表中的每一個詞在該文字出現的頻次進行記錄,以表示當前詞在該文字的重要程度。例如,對上例中的文字進行 Bag of Words表示:
但這種表示方式只能表達詞在當前文字中的重要程度。很多停用詞由於頻次較高,權重很大。為了表示詞特徵在整個語料中重要程度,可以使用TF-IDF對詞特徵加權。
>> TF:詞頻,即每個詞在該文字中的頻數,表示該詞的重要程度。
>> IDF: 倒排文件頻率。如果有些詞在所有文章中出現的次數(DF,文件頻率)都很多,可能是停用詞或者常見詞,一般重要性不高。IDF是DF的倒數形式,值越大說明該詞越重要。
TF*IDF提供了一種詞重要程度的較合理的度量。
對上述文字進行TF-IDF權重表示後的結果:
1. 詞之間是獨立的,無法提供詞序資訊和上下文資訊。
2. 資料十分稀疏。
1.3 N-Gram,N元組表示法
上述提到的Bag of Words表示方法每個詞都是獨立的,忽略了詞序問題。增加N-Gram特徵可以獲取區域性的上下文資訊。
以 Bigram 為例重新構建詞典:I, like, deep, learning, NLP, enjoy, flying, I like, deep learning, like deep,like NLP, I enjoy, enjoy flying
注意到詞彙表的長度從7增加到13, 使用One-Hot 每個詞被表示為13維的向量:
當然,這種方法也有它自己的缺陷:
1. N-Gram 中隨著N的增大增加了更多前後文資訊,但是詞表的維度也會急劇增大。(通常選取2~3)
2. 語料庫的增加會導致詞表維度不斷增大,同時N-Gram詞序列也急劇增大。
3. 基於詞表示:詞之間的關係無法度量 。
4. 資料十分稀疏。
1.4 例項: Bag of Words + SVM 分類實現
下面舉個簡單的例子來展示詞袋模型的應用。
>> 訓練語料:一些公開網站的資訊流新聞語料,使用其中的語料標題和網站提供的分類標籤。
>> 特徵表示:使用 jieba 進行分詞,並進行 Bag of Words 表示。
>> 模型: 使用機器學習模型SVM 實現文字分類。本次實現使用 sklearn中的SGD分類器,設定loss為hinge損失。
程式碼實現:
2. 分佈表示(Distributed Representation)
Distributed representation 被稱為“Word Representation”或“Word Embedding”, 中文也叫“詞向量”或“詞嵌入”,1986 年由Hinton 在論文《Learning distributed representations of concepts》中提出。
2.1 Co-Occurrence 詞向量
上文中提到的幾種離散表示方式存在諸多問題,如無法提供充分的上下文的資訊、詞之間的聯絡無法度量,即使間接的增加n-gram特徵也會導致詞表維度急劇增大。一種解決辦法是使用上下文來表示單詞,這是NLP中很現代的一種想法。2005 年 Rohde等在《An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence》中介紹了使用共現矩陣(Co-Occurrence matrix) 結合SVD降維處理的方法,實現了使用上下文表示單詞。
共現是指不同的詞同時出現的文件數。繼續使用上面的例子,選擇窗寬為1,共現矩陣表示為
對上例中的共現矩陣進行分解後,各詞在二維座標中的位置:
1. 時間複雜度高,尤其對百萬級的單詞或者文件表現就很糟糕了。
2. 新詞或新文字難以做到及時更新。
3. 相對於 deep learning 模型, 會有不同的學習框架。
2.2 Word2Vec 詞向量
2013年Google 開源了一款直接計算低維詞向量的工具 ——Word2Vec,不僅能夠在百萬級的詞典億級資料集上高效訓練,而且能夠很好的度量詞與詞之間的相似性。
先回顧一下統計語言模型,2003年Bengio等人用三層的神經網路構建了統計語言模型的框架(Neural Network Language Model,簡稱NNLM),其基本思想是:
1. 假定詞表中的每個詞都對應一個連續的特徵向量。
2. 假定一個連續平滑的機率模型,輸入一段詞向量序列,可以輸出這個序列的聯合機率。
3. 同時學習詞向量和機率模型中的引數。
模型的網路結構如下圖:
NNLM 的問題是:只能處理定長序列,而且訓練速度慢。
2013 年Mikolov對原始NNLM 進行了一些改造:
1. 移除前向反饋神經網路中的非線性hidden layer,直接將中間層的embedding layer 與 softmax layer 連線。
2. 輸入所有詞向量到一個embedding layer 中 。
3. 將特徵詞嵌入上下文環境。這是Word2Vec的第一個模型——CBoW。
CBoW的結構圖如下:
從數學上看CBoW等價與一個詞袋模型的向量乘以一個embedding 矩陣,從而得到一個embedding 向量。實際上CBoW是從周邊詞到中心詞的訓練中學習到的詞向量,相反如果從中心詞到周邊詞訓練得到詞向量的方法是word2vec的另一個模型——Skip-Gram。
Skip-Gram 的主要思路:預測一箇中心詞視窗內(視窗長度為c)的周邊單詞機率。
Skip-Gram 本質是計算輸入詞的輸入向量與目標詞的輸出向量之間的餘弦相似度,再經過softmax 歸一化。顯然對詞典裡的所有詞計算相似度並歸一化是一件極其耗時的事情。因此,Mikolov 引入兩種最佳化演算法:Herarchical Softmax 和 Negative Sampling。
2.3 GloVe 詞向量
比較以Co-Occurrence為代表的計數方法和word2vec為代表的直接預測方法。
GloVe 思路和Word2Vec很相似,但充分考慮了詞的共現情況。而且訓練速度更快,在大規模、小規模語料上效能都能表現的很好。其最佳化目標函式為:
2.4 例項: fastText 分類中訓練詞向量
類似於 Word2Vec 中 CBoW 模型,fastText 的分類模型更靈活的使用了 Hierarchical Softmax,主要體現在:
1. Wordvec 最終在輸入層得到詞向量,輸出層對應的 Herarchical Softmax 也會生成一系列的向量,但最終都不會使用。而fastText的輸出層對應是分類的label,目的是遍歷分類樹的所有葉節點,找到機率最大的label。
2. Word2Vec的輸入是上下文視窗內的詞,而fastText 對應的整個文字,包括周邊詞和 N-Gram的內容。
模型: 繼續使用上面處理好的test和train資料,訓練fastText 的分類模型。
3. 小結(Brief Summary)
文字特徵的向量表示是NLP的基礎,也是直接影響模型效果的重要因素。離散的表示結合傳統的機器學習模型已經有了較好的效果,但存在缺少上下文資訊、資料稀疏等問題。分散式的表達方式不僅能夠使用到上下文資訊進行表徵、建立詞與詞之間的聯絡,而且在具體任務中也能很好地利用神經網路進行傳播。
4. 參考資料(Reference Material)
>> A Neural Probabilistic Language Model(Bengio et al., 2003)
>> word2vec(Mikolov et al. 2013)
>> Improving Word Representations via Global Context and Multiple Word Prototypes(Eric H. Huang et al. 2012)
>> Bag of Tricks for Efficient Text Classification (A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, 2016)
>> A Primer on Neural Network Models for Natural Language Processing(Yoav Goldberg , 2015)
>> 史丹佛大學“深度學習與自然語言處理”課程:CS224d: Deep Learning for Natural Language Processing,word vector部分的slides
5. 作者介紹(About The Author;)
章潔,機器學習演算法工程師,參與自然語言處理,遊戲AI 演算法等相關專案。