在NLP(天然語言處理)領域,文本表示是第一步,也是很重要的一步,通俗來講就是把人類的語言符號轉化爲機器可以進行計算的數字,由於普通的文本語言機器是看不懂的,必須經過轉化來表徵對應文本。早期是基於規則的方法進行轉化,而現代的方法是基於統計機器學習的方法。git
數據決定了機器學習的上限,而算法只是儘量逼近這個上限,在本文中數據指的就是文本表示,因此,弄懂文本表示的發展歷程,對於NLP學習者來講是必不可少的。接下來開始咱們的發展歷程。文本表示分爲離散表示和分佈式表示:github
One-hot簡稱讀熱向量編碼,也是特徵工程中最經常使用的方法。其步驟以下:算法
例如:John likes to watch movies. Mary likes too微信
John also likes to watch football games.網絡
以上兩句能夠構造一個詞典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **機器學習
每一個詞典索引對應着比特位。那麼利用One-hot表示爲:分佈式
**John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] **函數
likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] .......等等,以此類推。學習
One-hot表示文本信息的缺點:優化
詞袋模型(Bag-of-words model),像是句子或是文件這樣的文字能夠用一個袋子裝着這些詞的方式表現,這種表現方式不考慮文法以及詞的順序。
文檔的向量表示能夠直接將各詞的詞向量表示加和。例如:
John likes to watch movies. Mary likes too
John also likes to watch football games.
以上兩句能夠構造一個詞典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **
那麼第一句的向量表示爲:[1,2,1,1,1,0,0,0,1,1],其中的2表示likes在該句中出現了2次,依次類推。
詞袋模型一樣有一下缺點:
TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的經常使用加權技術。TF意思是詞頻(Term Frequency),IDF意思是逆文本頻率指數(Inverse Document Frequency)。
字詞的重要性隨着它在文件中出現的次數成正比增長,但同時會隨着它在語料庫中出現的頻率成反比降低。一個詞語在一篇文章中出現次數越多, 同時在全部文檔中出現次數越少, 越可以表明該文章。
,分母之因此加1,是爲了不分母爲0。
那麼,,從這個公式能夠看出,當w在文檔中出現的次數增大時,而TF-IDF的值是減少的,因此也就體現了以上所說的了。
**缺點:**仍是沒有把詞與詞之間的關係順序表達出來。
n-gram模型爲了保持詞的順序,作了一個滑窗的操做,這裏的n表示的就是滑窗的大小,例如2-gram模型,也就是把2個詞當作一組來處理,而後向後移動一個詞的長度,再次組成另外一組詞,把這些生成一個字典,按照詞袋模型的方式進行編碼獲得結果。改模型考慮了詞的順序。
例如:
John likes to watch movies. Mary likes too
John also likes to watch football games.
以上兩句能夠構造一個詞典,{"John likes」: 1, "likes to」: 2, "to watch」: 3, "watch movies」: 4, "Mary likes」: 5, "likes too」: 6, "John also」: 7, "also likes」: 8, 「watch football」: 9, "football games": 10}
那麼第一句的向量表示爲:[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],其中第一個1表示John likes在該句中出現了1次,依次類推。
**缺點:**隨着n的大小增長,詞表會成指數型膨脹,會愈來愈大。
因爲存在如下的問題,對於通常的NLP問題,是可使用離散表示文本信息來解決問題的,但對於要求精度較高的場景就不適合了。
科學家們爲了提升模型的精度,又發明出了分佈式的表示文本信息的方法,這就是這一節須要介紹的。
**用一個詞附近的其它詞來表示該詞,這是現代統計天然語言處理中最有創見的想法之一。**當初科學家發明這種方法是基於人的語言表達,認爲一個詞是由這個詞的周邊詞彙一塊兒來構成精確的語義信息。就比如,物以類聚人以羣分,若是你想了解一我的,能夠經過他周圍的人進行了解,由於周圍人都有一些共同點才能彙集起來。
共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(topic),用於主題模型,如LSA。
局域窗中的word-word共現矩陣能夠挖掘語法和語義信息,例如:
有以上三句話,設置滑窗爲2,能夠獲得一個詞典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。
咱們能夠獲得一個共現矩陣(對稱矩陣):
中間的每一個格子表示的是行和列組成的詞組在詞典中共同出現的次數,也就體現了共現的特性。
存在的問題:
NNLM (Neural Network Language model),神經網絡語言模型是03年提出來的,經過訓練獲得中間產物--詞向量矩陣,這就是咱們要獲得的文本表示向量矩陣。
NNLM說的是定義一個前向窗口大小,其實和上面提到的窗口是一個意思。把這個窗口中最後一個詞當作y,把以前的詞當作輸入x,通俗來講就是預測這個窗口中最後一個詞出現機率的模型。
如下是NNLM的網絡結構圖:
input層是一個前向詞的輸入,是通過one-hot編碼的詞向量表示形式,具備V*1的矩陣。
C矩陣是投影矩陣,也就是稠密詞向量表示,在神經網絡中是w參數矩陣,該矩陣的大小爲D*V,正好與input層進行全鏈接(相乘)獲得D*1的矩陣,採用線性映射將one-hot表 示投影到稠密D維表示。
output層(softmax)天然是前向窗中須要預測的詞。
經過BP+SGD獲得最優的C投影矩陣,這就是NNLM的中間產物,也是咱們所求的文本表示矩陣,經過NNLM將稀疏矩陣投影到稠密向量矩陣中。
谷歌2013年提出的Word2Vec是目前最經常使用的詞嵌入模型之一。Word2Vec實際 是一種淺層的神經網絡模型,它有兩種網絡結構,**分別是CBOW(Continues Bag of Words)連續詞袋和Skip-gram。**Word2Vec和上面的NNLM很相似,但比NNLM簡單。
CBOW
CBOW是經過中間詞來預測窗口中上下文詞出現的機率模型,把中間詞當作y,把窗口中的其它詞當作x輸入,x輸入是通過one-hot編碼過的,而後經過一個隱層進行求和操做,最後經過激活函數softmax,能夠計算出每一個單詞的生成機率,接下來的任務就是訓練神經網絡的權重,使得語料庫中全部單詞的總體生成機率最大化,而求得的權重矩陣就是文本表示詞向量的結果。
Skip-gram:
Skip-gram是經過當前詞來預測窗口中上下文詞出現的機率模型,把當前詞當作x,把窗口中其它詞當作y,依然是經過一個隱層接一個Softmax激活函數來預測其它詞的機率。以下圖所示:
優化方法:
**負例採樣(Negative Sampling):**這種優化方式作的事情是,在正確單詞之外的負樣本中進行採樣,最終目的是爲了減小負樣本的數量,達到減小計算量效果。將詞典中的每個詞對應一條線段,全部詞組成了[0,1]間的剖分,以下圖所示,而後每次隨機生成一個[1, M-1]間的整數,看落在哪一個詞對應的剖分上就選擇哪一個詞,最後會獲得一個負樣本集合。
Word2Vec存在的問題
word2vec模型的問題在於詞語的多義性。好比duck這個單詞常見的含義有 水禽或者下蹲,但對於 word2vec 模型來講,它傾向於將全部概念作歸一化 平滑處理,獲得一個最終的表現形式。
歡迎添加微信交流!請備註「機器學習」。