將文本數據表示成計算機可以運算的數字或向量python
思想:git
將語料庫中全部的詞拉成一個向量,給每一個詞一個下標,就獲得對應的詞典。每一個分詞的文本表示爲該分詞的比特位爲1,其他位爲0的矩陣表示。github
思想:算法
把每篇文章當作一袋子詞,並忽略每一個詞出現的順序。具體來看:將整段文本表示成一個長向量,每一維表明一個單詞。該維對應的權重表明這個詞在原文章中的重要程度。數組
例子:網絡
句1:Jane wants to go to Shenzhen. 句2:Bob wants to go to Shanghai.機器學習
使用兩個例句構造詞袋: [Jane, wants, to, go, Shenzhen, Bob, Shanghai]分佈式
兩個例句就能夠用如下兩個向量表示,對應的下標與映射數組的下標相匹配,其值爲該詞語出現的次數函數
句1:[1,1,2,1,1,0,0] 句2:[0,1,2,1,0,1,1]工具
思想:
字詞的重要性隨着它在文件中出現的次數成正比增長,但同時會隨着它在語料庫中出現的頻率成反比降低。若是某個單詞在一篇文章中出現的頻率TF高,而且在其餘文章中不多出現,則認爲此詞或者短語具備很好的類別區分能力,適合用來分類。
公式:
缺點:
(1)沒有考慮特徵詞的位置因素對文本的區分度,詞條出如今文檔的不一樣位置時,對區分度的貢獻大小是不同的。
(2)按照傳統TF-IDF,每每一些生僻詞的IDF(反文檔頻率)會比較高、所以這些生僻詞常會被誤認爲是文檔關鍵詞。
(3)IDF部分只考慮了特徵詞與它出現的文本數之間的關係,而忽略了特徵項在一個類別中不一樣的類別間的分佈狀況。
(4)對於文檔中出現次數較少的重要人名、地名信息提取效果不佳。
使用:
# 參數爲 CounterVectorizer 和 TfidfTransformer 的全部參數 tfidf=TfidfVectorizer(tokenizer=jieba.lcut,stop_words=stopwords,norm='l2',use_idf=True,smooth_idf=True,sublinear_tf=False) res=tfidf.fit_transform(contents)#直接對文檔進行轉換提取tfidf特徵 res.toarray()#一步就獲得了tfidf向量思想:
統計語言模型:
是一個基於機率的判別模型。統計語言模型把語言(詞的序列)看做一個隨機事件,並賦予相應的機率來描述其屬於某種語言集合的可能性。給定一個詞聚集合 V,對於一個由 V 中的詞構成的序列S = ⟨w1, · · · , wT ⟩ ∈ Vn,統計語言模型賦予這個序列一個機率P(S),來衡量S 符合天然語言的語法和語義規則的置信度。用一句簡單的話說,統計語言模型就是計算一個句子的機率大小的這種模型。
思想:
N-Gram是一種基於統計語言模型的算法。它的基本思想是將文本里面的內容按照字節進行大小爲N的滑動窗口操做,造成了長度是N的字節片斷序列。每個字節片斷稱爲gram,對全部gram的出現頻度進行統計,而且按照事先設定好的閾值進行過濾,造成關鍵gram列表,也就是這個文本的向量特徵空間,列表中的每一種gram就是一個特徵向量維度。把這些生成一個字典,按照詞袋模型的方式進行編碼獲得結果。
例子:
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次,依次類推。
主要思想是用周圍的詞表示該詞
思想:
「共現」,即共同出現,如一句話中共同出現,或一篇文章中共同出現。這裏給共同出現的距離一個規範——窗口,若是窗口寬度是2,那就是在當前詞的先後各2個詞的範圍內共同出現。能夠想象,實際上是一個總長爲5的窗口依次掃過全部文本,同時出如今其中的詞就說它們共現。
例子:
思想:
NNLM是從語言模型出發(即計算機率角度),構建神經網絡針對目標函數對模型進行最優化,訓練的起點是使用神經網絡去搭建語言模型實現詞的預測任務,而且在優化過程後模型的副產品就是詞向量。
進行神經網絡模型的訓練時,目標是進行詞的機率預測,就是在詞環境下,預測下一個該是什麼詞,目標函數以下式, 經過對網絡訓練必定程度後,最後的模型參數就可當成詞向量使用。
最後關心的並非輸出層的預測機率,而是經過BP+SGD獲得的中間產物:最優投影矩陣C,將其做爲文本表示矩陣。
機率函數:\(f(w_{t},w_{t-1},...,w_{t-n+2}, w_{t-n+1})=p(w_{t} | {w_{1}}^{t-1})\)
目標函數:
訓練過程就是學習θ的最大似然, 其中R(θ) 是正則項。
模型結構:
模型分爲兩部分:特徵映射和計算條件機率分佈
特徵映射:對應結構圖中最底部的紫色虛線Matrix C
計算條件機率分佈:通過神經網絡的輸入層隱藏層後,經softmax作歸一化計算機率獲得輸出層
神經網絡結構
直連矩陣W能夠加快模型訓練速度,但對效果提高不大。直連能夠合併詞向量不通過隱含層,直接右乘直連矩陣 W 獲得 \(v \times 1\) 維輸出後與前述的 \(v \times 1\) 維輸出向相加,獲得一個最終的 \(v \times 1\) 維輸出向量。
CBOW
Skip-Gram
優化tricks
層次Softmax
負例採樣(Negative Sampling)
在正確單詞之外的負樣本中進行採樣,最終目的是爲了減小負樣本的數量,達到減小計算量效果。將詞典中的每個詞對應一條線段,全部詞組成了[0,1]間的剖分,以下圖所示,而後每次隨機生成一個[1, M-1]間的整數,看落在哪一個詞對應的剖分上就選擇哪一個詞,最後會獲得一個負樣本集合。
若是 vocabulary 大小爲10000時, 當輸入樣本 ( "fox", "quick") 到神經網絡時, 「 fox」 通過 one-hot 編碼,在輸出層咱們指望對應 「quick」 單詞的那個神經元結點輸出 1,其他 9999 個都應該輸出 0。在這裏,這9999個咱們指望輸出爲0的神經元結點所對應的單詞咱們爲 negative word. negative sampling 的想法也很直接 ,將隨機選擇一小部分的 negative words,好比選 10個 negative words 來更新對應的權重參數。
假設原來模型每次運行都須要300×10,000(其實沒有減小數量,可是運行過程當中,減小了須要載入的數量。) 如今只要300×(1+10)減小了好多。
選擇negative samples:常出現的高頻詞有更大的機率被選爲負例。直接基於詞頻的權重分佈得到機率分佈進行抽樣
GloVe的全稱叫Global Vectors for Word Representation,它是一個基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具,它能夠把一個單詞表達成一個由實數組成的向量,這些向量捕捉到了單詞之間一些語義特性,好比類似性(similarity)、類比性(analogy)等。咱們經過對向量的運算,好比歐幾里得距離或者cosine類似度,能夠計算出兩個單詞之間的語義類似性。
實現步驟
構建共現矩陣
根據語料庫(corpus)構建一個共現矩陣(Co-ocurrence Matrix)X,矩陣中的每個元素 Xij 表明單詞 i 和上下文單詞 j 在特定大小的上下文窗口(context window)內共同出現的次數。通常而言,這個次數的最小單位是1,可是GloVe不這麼認爲:它根據兩個單詞在上下文窗口的距離 d,提出了一個衰減函數(decreasing weighting):decay=1/d 用於計算權重,也就是說距離越遠的兩個單詞所佔總計數(total count)的權重越小。
構建詞向量和共現矩陣之間的近似關係
構建損失函數
\(J = \sum_{i,j=1}^{V} f(X_{ij})(w_{i}^{T}\tilde{w_{j}} + b_i + \tilde{b_j} – \log(X_{ij}) )^2 \tag{2}\)
Glove與LSA、word2vec的比較
LSA(Latent Semantic Analysis)是一種比較早的count-based的詞向量表徵工具,它也是基於co-occurance matrix的,只不過採用了基於奇異值分解(SVD)的矩陣分解技術對大矩陣進行降維,而咱們知道SVD的複雜度是很高的,因此它的計算代價比較大。還有一點是它對全部單詞的統計權重都是一致的。而這些缺點在GloVe中被一一克服了。而word2vec最大的缺點則是沒有充分利用全部的語料,因此GloVe實際上是把二者的優勢結合了起來。從這篇論文給出的實驗結果來看,GloVe的性能是遠超LSA和word2vec的,但網上也有人說GloVe和word2vec實際表現其實差很少。
思想
模型結構:與CBOW類似
fastText與CBOW不一樣點
CBOW的輸入是目標單詞的上下文,fastText的輸入是多個單詞及其n-gram特徵,這些特徵用來表示單個文檔;
CBOW的輸入單詞被one-hot編碼過,fastText的輸入特徵是被embedding過;
CBOW的輸出是目標詞彙,fastText的輸出是文檔對應的類標。
值得注意的是,fastText在輸入時,將單詞的字符級別的n-gram向量做爲額外的特徵;在輸出時,fastText採用了分層Softmax,大大下降了模型訓練時間。
分類效果
fastText與Word2Vec的異同
相同點
不一樣點
層次softmax:CBOW的葉子節點是詞和詞頻,fasttext葉子節點裏是類標和類標的頻數。
word2vec的目的是獲得詞向量,該詞向量最終是在輸入層獲得的,輸出層對應的h-softmax也會生成一系列的向量,可是最終都被拋棄,不會使用。
fastText則充分利用了h-softmax的分類功能,遍歷分類樹的全部葉節點,找到機率最大的label
代碼實現