本文介紹常見的文本表示模型,One-hot、詞袋模型(BOW)、TF-IDF、N-Gram和Word2Vechtml
1、離散表示
一、One-hot編碼
one-hot編碼是經常使用的方法,咱們能夠用one-hot編碼的方式將句子向量化,大體步驟爲:git
- 用構造文本分詞後的字典
- 對詞語進行One-hot編碼
John likes to watch movies. Mary likes toogithub
John also likes to watch football games.網絡
上面的兩句話分詞後能夠構造一個字典,字典內容以下,字典的鍵是詞語,值是ID分佈式
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}
咱們能夠根據ID值對每一個詞語進行向量化,用0和1表明這個詞是否出現函數
# John [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] # too [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
one-hot 詞向量構造起來簡單,但一般不是一個好的選擇,它有明顯的缺點:優化
- 維數太高。咱們這裏只有短短的2句話,每一個詞語已是一個10維的向量了,隨着語料的增長,維數會愈來愈大,致使維數災難
- 矩陣稀疏。利用One-hot編碼的另外一個問題就是矩陣稀疏,從上面也能夠看到,每個詞向量只有1維是有數值的,其餘維上的數值都爲0
- 不能保留語義。用這種方式獲得的結果不能保留詞語在句子中的位置信息, 「我愛你」 和 「你愛我」 的向量化結果並無什麼不一樣。
二、詞袋(BOW)模型
詞袋模型(Bag-of-words model,BOW),BOW模型假定對於一個文檔,忽略它的單詞順序和語法、句法等要素,將其僅僅看做是若干個詞彙的集合,文檔中每一個單詞的出現都是獨立的,不依賴於其它單詞是否出現。ui
John likes to watch movies. Mary likes too編碼
John also likes to watch football games.spa
使用以前一樣的例子,跟前面同樣,將上面的兩句話中看做一個文檔集,列出文檔中出現的全部單詞(忽略大小寫與標點符號),構造一個字典
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}
再用再將句子向量化,維數和字典大小一致,第 $i$ 維上的 數值 表明 ID 爲 $i$ 的詞語在這個句子裏出現的頻次
# 第一個文本 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] # 第二個文本 [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
以第一個文本的向量化結果 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 爲例,2在第二維上,ID爲2的詞語是likes,在第一個文本中出現了2次,因此第二維上的數值是2
這種方式不像one-hot編碼那樣致使維數很是大,但也有本身的缺點
- 不能保留語義:不能保留詞語在句子中的位置信息,「你愛我」 和 「我愛你」 在這種方式下的向量化結果依然沒有區別。「我喜歡北京」 和 「我不喜歡北京」 這兩個文本語義相反,利用這個模型獲得的結果卻能認爲它們是類似的文本。
- 維數高和稀疏性:當語料增長時,那麼維數也會不可避免的增大,一個文本里不出現的詞語就會增多,致使矩陣稀疏
三、TF-IDF
TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的經常使用加權技術。TF意思是詞頻(Term Frequency),IDF意思是逆文本頻率指數(Inverse Document Frequency)。
字詞的重要性隨着它在文件中出現的次數成正比增長,但同時會隨着它在語料庫中出現的頻率成反比降低。一個詞語在一篇文章中出現次數越多, 同時在全部文檔中出現次數越少, 越可以表明該文章。
TF-IDF公式以下:
$TF(t,d)$表示 詞語t 在 文檔d 中出現的頻率,$IDF(t)$是逆文本頻率指數,它能夠衡量 單詞t 用於區分這篇文檔和其餘文檔的重要性。IDF的公式以下,分母加1是爲了不分母爲0
好比在10篇文檔中,1篇是猴子的,9篇是關於人的,關於人的文章中不出現 「尾巴」 這個詞語,10篇文章中都出現 「嘴巴」 這個詞語,那麼 「尾巴」 這個詞在這些文章中就頗有區分度。從公式的角度也很容易看出。以10爲底數的話,$IDF(尾巴)$ = 0.70, $IDF(嘴巴)$ = -0.04,說明 「尾巴」 重要性更高點,它有區分性。
前面說的缺點依然存在,它依然不能保留詞語在句子中的位置關係。
四、N-Gram
N-Gram語言模型的思想就是,給定一串字母,下一個最大可能出現的詞語是什麼?好比 「今天你」,後面跟 「吃飯」 可能性大,但跟着 「後天」 的可能性就很小。
N=1時稱爲unigram,N=2稱爲bigram,N=3稱爲trigram,假設下一個詞的出現依賴它前面的一個詞,即 bigram,假設下一個詞的出現依賴它前面的兩個詞,即 trigram,以此類推。
如下面的文本爲例
你幫我
我幫你
它的bigram依次爲:
你,你幫,幫,幫我,我
我,我幫,幫,幫你,你
一樣地,咱們能夠構造一個字典
{"你": 1, "你幫"; 2, "幫": 3,"幫我": 4, "我": 5, "我幫": 6, "幫你": 7}
向量化結果能夠表示爲
# 第一個文本 [1, 1, 1, 1, 1, 0, 0] # 第二個文本 [1, 0, 1, 0, 1, 1, 1]
N-Gram基於一個假設:第n個詞出現與前n-1個詞相關,而與其餘任何詞不相關(這也是隱馬爾可夫當中的假設)。整個句子出現的機率就等於各個詞出現的機率乘積,公式以下:
上面的表達式並很差計算,引入馬爾科夫假設,那麼能夠將式子寫成
馬爾可夫鏈(Markov chain)爲狀態空間中通過從一個狀態到另外一個狀態的轉換的隨機過程。該過程要求具有「無記憶」的性質:下一狀態的機率分佈只能由當前狀態決定,而與以前的狀態無關
特別地,對unigram,有
對bigram,有
對trigram,有
N-Gram考慮了詞的順序,信息量更充分。
但缺點是隨着N的增大,詞表迅速膨脹,數據出現大量稀疏的問題。
五、總結
因爲存在如下的問題,對於通常的NLP問題,是可使用離散表示文本信息來解決問題的,但對於要求精度較高的場景就不適合了。
- 沒法衡量詞向量之間的關係。
- 詞表的維度隨着語料庫的增加而膨脹。
- n-gram詞序列隨語料庫增加呈指數型膨脹,更加快。
- 離散數據來表示文本會帶來數據稀疏問題,致使丟失了信息,與咱們生活中理解的信息是不同的。
2、分佈式表示
科學家們爲了提升模型的精度,又發明出了分佈式的表示文本信息的方法。
用一個詞附近的其它詞來表示該詞,這是現代統計天然語言處理中最有創見的想法之一。當初科學家發明這種方法是基於人的語言表達,認爲一個詞是由這個詞的周邊詞彙一塊兒來構成精確的語義信息。就比如,物以類聚人以羣分,若是你想了解一我的,能夠經過他周圍的人進行了解,由於周圍人都有一些共同點才能彙集起來。
一、共現矩陣
共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(topic),用於主題模型,如LSA。
局域窗中的word-word共現矩陣能夠挖掘語法和語義信息,例如:
I like deep learning.
I like NLP.
I enjoy flying.
有以上三句話,設置滑窗(對稱窗口)爲2,能夠獲得一個詞典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。
咱們能夠獲得一個共現矩陣(對稱矩陣):
中間的每一個格子表示的是行和列組成的詞組在詞典中共同出現的次數,也就體現了共現的特性。好比例如:「I like」出如今第1,2句話中,一共出現2次,因此=2。 對稱的窗口指的是,「like I」也是2次
存在的問題:
- 向量維數隨着詞典大小線性增加。
- 存儲整個詞典的空間消耗很是大。
- 一些模型如文本分類模型會面臨稀疏性問題。
- 模型會欠穩定,每新增一份語料進來,穩定性就會變化。
二、Word2Vec
谷歌2013年提出的Word2Vec是目前最經常使用的詞嵌入模型之一。Word2Vec實際 是一種淺層的神經網絡模型,它有兩種網絡結構,分別是CBOW(Continues Bag of Words)連續詞袋和Skip-gram。
2.一、CBOW
CBOW是一個三層神經網絡,特色是輸入已知上下文,輸出對當前單詞的預測。 CBOW經過中間詞來預測窗口中上下文詞出現的機率模型,把中間詞當作y,把窗口中的其它詞當作x輸入,x輸入是通過one-hot編碼過的,而後經過一個隱層進行求和操做,最後經過激活函數softmax,能夠計算出每一個單詞的生成機率,接下來的任務就是訓練神經網絡的權重,使得語料庫中全部單詞的總體生成機率最大化,而求得的權重矩陣就是文本表示詞向量的結果。。
舉一個例子,咱們有如下文本
I drink coffee everyday
假設咱們輸入爲 I, drink, everyday,那麼咱們訓練的神經網絡要使 coffee 的輸出機率最大。首先,咱們將原來的文本的單詞用One-hot編碼表示,以下圖所示
初始化輸入權重矩陣 $W$ 和輸出權重矩陣 $W^{'}$,利用這個權重矩陣W和One-hot編碼完的向量相乘,能夠獲得惟一的向量 $V$,至關於根據One-hot編碼中1的位置取出W中的對應的列,除非兩列徹底相同,不然獲得的向量不會是同樣的。
咱們這裏有3個輸入值,將3個輸入值與 $W$ 相乘獲得的向量相加作平均,獲得隱藏層向量
隱藏層向量再乘以輸出權重矩陣 $W^{'}$ ,獲得一個輸出向量
對輸出向量作softmax,獲得輸出機率
2.二、Skip-Gram
Skip-Gram與CBOW相反,即已知某個詞語,預測周圍的詞語。經過當前詞來預測窗口中上下文詞出現的機率模型,把當前詞當作 $x$,把窗口中其它詞當作 $y$,依然是經過一個隱層接一個Softmax激活函數來預測其它詞的機率。
如下圖舉例,咱們選定句子「The quick brown fox jumps over lazy dog」,設定咱們的窗口大小爲2(window_size=2),也就是說咱們將輸入詞先後各兩個詞和輸入詞進行組合做爲訓練樣本。下圖中,藍色表明input word,方框內表明位於窗口內的單詞。
以第一條爲例,The爲輸入詞,可是The開頭,前面沒有詞跟它組合,因此只能和後面兩個單詞分別組合。
當quick輸入時,它前面只有1個單詞,因此一共只有3個組合。
從brown開始,前面纔會有2個及以上的單詞,因此從這裏開始有4個組合。
咱們的模型將會從每對單詞出現的次數中習得統計結果。例如,咱們的神經網絡可能會獲得更多相似(「可樂「,」百事「)這樣的訓練樣本對,而對於(」可樂「,」醬油「)這樣的組合卻看到的不多。所以,當咱們的模型完成訓練後,給定一個單詞」可樂「做爲輸入,輸出的結果中」百事「「要比」醬油「的機率高。
2.三、加速優化方法
有Hierarchical Softmax(層次Softmax)和Negative Sample(負採樣)兩個加速方法,參考如下連接
- Hierarchical Softmax:http://www.javashuo.com/article/p-enrvxzho-ec.html,https://cloud.tencent.com/developer/article/1387413
- Negative Sample:http://www.javashuo.com/article/p-pnxwarnk-ek.html
參考資料:
https://github.com/mantchs/machine_learning_model/tree/master/Word2Vec
https://www.jianshu.com/p/f8300129b568
https://blog.csdn.net/weixin_43112462/article/details/88669902
https://blog.csdn.net/lxg0807/article/details/78615917
https://www.cnblogs.com/bep-feijin/p/9430164.html
https://blog.csdn.net/yu5064/article/details/79601683
https://www.jianshu.com/p/471d9bfbd72f