在word2vec出現以前,天然語言處理常常把字詞轉爲one-hot編碼類型的詞向量,這種方式雖然很是簡單易懂,可是數據稀疏性很是高,維度不少,很容易形成維度災難,尤爲是在深度學習中;其次這種詞向量中任意兩個詞之間都是孤立的,存在語義鴻溝(這樣就不能體現詞與詞之間的關係)而有Hinton大神提出的Distributional Representation 很好的解決了one-hot編碼的主要缺點。解決了語義之間的鴻溝,能夠經過計算向量之間的距離來體現詞與詞之間的關係。Distributional Representation 詞向量是密集的。word2vec是一個用來訓練Distributional Representation 類型的詞向量的一種工具。算法
一、CBOW與Skip-Gram模型網絡
word2vec模型其實就是簡單化的神經網絡,主要包含兩種詞訓練模型:CBOW模型和Skip-gram模型。模型的結構圖以下(注意:這裏只是模型結構,並非神經網絡的結構)函數
CBOW模型根據中心詞W(t) 周圍的詞來預測中心詞;Skip-gram模型則根據中心詞W(t) 來預測周圍的詞。工具
1)CBOW模型的第一層是輸入層,輸入的值是周圍每一個詞的one-hot編碼形式,隱藏層只是對輸出值作了權值加法,沒有激活函數進行非線性的轉換,輸出值的維度和輸入值的維度是一致的。學習
2)Skip-gram模型的第一層是輸入層,輸入值是中心詞的one-hot編碼形式,隱藏層只是作線性轉換,輸出的是輸出值的softmax轉換後的機率。編碼
神經網絡結構以下spa
神經網絡的訓練是有監督的學習,所以要給定輸入值和輸出值來訓練神經網絡,而咱們最終要得到的是隱藏層的權重矩陣。由於隱藏層的輸出事實上是每一個輸入單詞的 「嵌入詞向量」。咱們來看個圖code
上如中左邊的式子是輸入詞向量和隱藏層權重矩陣的乘積,在作這個乘法時是不會進行矩陣的運算的,而是直接經過輸入值中1的位置索引來尋找隱藏層中的權重矩陣中對應的索引的行。xml
詞向量的兩個優勢:blog
1)下降輸入的維度。詞向量的維度通常取100-200,對於大樣本時的one-hot向量甚至可能達到10000以上。
2)增長語義信息。兩個語義相近的單詞的詞向量也是很類似的。
二、word2vec API講解
在gensim中,word2vec 相關的API都在包gensim.models.word2vec中。和算法有關的參數都在類gensim.models.word2vec.Word2Vec中。算法須要注意的參數有:
1) sentences:咱們要分析的語料,能夠是一個列表,或者從文件中遍歷讀出(word2vec.LineSentence(filename) )。
2) size:詞向量的維度,默認值是100。這個維度的取值通常與咱們的語料的大小相關,若是是不大的語料,好比小於100M的文本語料,則使用默認值通常就能夠了。若是是超大的語料,建議增大維度。
3) window:即詞向量上下文最大距離,window越大,則和某一詞較遠的詞也會產生上下文關係。默認值爲5,在實際使用中,能夠根據實際的需求來動態調整這個window的大小。
若是是小語料則這個值能夠設的更小。對於通常的語料這個值推薦在[5;10]之間。
4) sg:即咱們的word2vec兩個模型的選擇了。若是是0, 則是CBOW模型;是1則是Skip-Gram模型;默認是0即CBOW模型。
5) hs:即咱們的word2vec兩個解法的選擇了。若是是0, 則是Negative Sampling;是1的話而且負採樣個數negative大於0, 則是Hierarchical Softmax。默認是0即Negative Sampling。
6) negative:即便用Negative Sampling時負採樣的個數,默認是5。推薦在[3,10]之間。這個參數在咱們的算法原理篇中標記爲neg。
7) cbow_mean:僅用於CBOW在作投影的時候,爲0,則算法中的xw爲上下文的詞向量之和,爲1則爲上下文的詞向量的平均值。在咱們的原理篇中,是按照詞向量的平均值來描述的。我的比較喜歡用平均值來表示xw,默認值也是1,不推薦修改默認值。
8) min_count:須要計算詞向量的最小詞頻。這個值能夠去掉一些很生僻的低頻詞,默認是5。若是是小語料,能夠調低這個值。
9) iter:隨機梯度降低法中迭代的最大次數,默認是5。對於大語料,能夠增大這個值。
10) alpha:在隨機梯度降低法中迭代的初始步長。算法原理篇中標記爲η,默認是0.025。
11) min_alpha: 因爲算法支持在迭代的過程當中逐漸減少步長,min_alpha給出了最小的迭代步長值。隨機梯度降低中每輪的迭代步長能夠由iter,alpha, min_alpha一塊兒得出。這部分因爲不是word2vec算法的核心內容,所以在原理篇咱們沒有提到。
對於大語料,須要對alpha, min_alpha,iter一塊兒調參,來選擇合適的三個值。
word2vec是能夠進行增量式訓練的,所以能夠實現一:在輸入輸入值時能夠將數據用生成器的形式導入到模型中;二:能夠將數據一個磁盤中讀取出來,而後訓練完保存模型;以後加載模型再從其餘的磁盤上讀取數據進行模型的訓練。初始化模型的類似度以後,模型就沒法再進行增量式訓練了,至關於鎖定模型了。
三、三個最多見的應用
當訓練完模型以後,咱們就能夠用模型來處理一些常見的問題了,主要包括如下三個方面:
1)找出某一個詞向量最相近的集合
model.wv.similar_by_word()
從這裏能夠衍生出去尋找類似的句子,好比「北京下雨了」,能夠先進行分詞爲{「北京」,「下雨了」},而後找出每一個詞的前5或者前10個類似的詞,好比」北京「的前五個類似詞是
{「上海」, 「天津",」重慶「,」深圳「,」廣州「}
"下雨了"的前五個類似詞是
{」下雪了「,」颳風了「,」天晴了「,」陰天了「,」來臺風了「}
而後將這兩個集合隨意組合,能夠獲得25組不一樣的組合,而後找到這25組中發生機率最大的句子輸出。
2)查看兩個詞向量的相近程度
model.wv.similarity()
好比查看"北京"和」上海「之間的類似度
3)找出一組集合中不一樣的類別
model.wv.doesnt_match()
好比找出集合{「上海」, 「天津",」重慶「,」深圳「,」北京「}中不一樣的類別,可能會輸出」深圳「,固然也可能輸出其餘的