NLP問題之word2vec

NLP(Natural Language Processing),也就是人們常說的「自然語言處理」,就是研究如何讓計算機讀懂人類語言。

其用於有如下的 從「中文分詞」、「詞雲畫像」、「詞性分析」到「自動摘要」、「關係挖掘」、「情感分析」、「知識圖譜」等

開源的NLP庫 Apache OpenNLP:一種機器學習工具包,提供標記器,句子分段,詞性標註,命名實體提取,分塊,解析,共參考解析等等。 自然語言工具包(NLTK):提供用於處理文本,分類,標記化,詞法分析,標記,解析等模塊的Python庫。 斯坦福的NLP:一套NLP工具,提供詞性標註,命名實體識別器,共識解析系統,情感分析等等。

word2vec的大概流程如下:

  1. 分詞 / 詞幹提取和詞形還原。 中文和英文的nlp各有各的難點,中文的難點在於需要進行分詞,將一個個句子分解成一個單詞數組。而英文雖然不需要分詞,但是要處理各種各樣的時態,所以要進行詞幹提取和詞形還原。 (2) 構造詞典,統計詞頻。這一步需要遍歷一遍所有文本,找出所有出現過的詞,並統計各詞的出現頻率。 (3) 構造樹形結構。依照出現概率構造Huffman樹。如果是完全二叉樹,則簡單很多,後面會仔細解釋。需要注意的是,所有分類都應該處於葉節點,像下圖顯示的那樣[4]

image.png

(4)生成節點所在的二進制碼。拿上圖舉例,22對應的二進制碼爲00,而17對應的是100。也就是說,這個二進制碼反映了節點在樹中的位置,就像門牌號一樣,能按照編碼從根節點一步步找到對應的葉節點。 (5) 初始化各非葉節點的中間向量和葉節點中的詞向量。樹中的各個節點,都存儲着一個長爲m的向量,但葉節點和非葉結點中的向量的含義不同。葉節點中存儲的是各詞的詞向量,是作爲神經網絡的輸入的。而非葉結點中存儲的是中間向量,對應於神經網絡中隱含層的參數,與輸入一起決定分類結果。 (6) 訓練中間向量和詞向量。對於CBOW模型,首先將詞A附近的n-1個詞的詞向量相加作爲系統的輸入,並且按照詞A在步驟4中生成的二進制碼,一步步的進行分類並按照分類結果訓練中間向量和詞向量。舉個栗子,對於綠17節點,我們已經知道其二進制碼是100。那麼在第一個中間節點應該將對應的輸入分類到右邊。如果分類到左邊,則表明分類錯誤,需要對向量進行修正。第二個,第三個節點也是這樣,以此類推,直到達到葉節點。因此對於單個單詞來說,最多隻會改動其路徑上的節點的中間向量,而不會改動其他節點。

模型拆解 word2vec模型其實就是簡單化的神經網絡。

在word2vec出現之前,自然語言處理經常把字詞轉爲離散的單獨的符號,也就是One-Hot Encoder。

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0] 上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]

比如上面的這個例子,在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值爲1,其餘都爲0。但是使用One-Hot Encoder有以下問題。一方面,城市編碼是隨機的,向量之間相互獨立,看不出城市之間可能存在的關聯關係。其次,向量維度的大小取決於語料庫中字詞的多少。如果將世界所有城市名稱對應的向量合爲一個矩陣的話,那這個矩陣過於稀疏,並且會造成維度災難。

image.png

輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax迴歸。我們要獲取的dense vector其實就是Hidden Layer的輸出單元。有的地方定爲Input Layer和Hidden Layer之間的權重,其實說的是一回事。

image.png

word2vec的2種模式 CBOW與Skip-Gram模式 word2vec主要分爲CBOW(Continuous Bag of Words)和Skip-Gram兩種模式。CBOW是從原始語句推測目標字詞;而Skip-Gram正好相反,是從目標字詞推測出原始語句。CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好。 對同樣一個句子:Hangzhou is a nice city。我們要構造一個語境與目標詞彙的映射關係,其實就是input與label的關係。

這裏假設滑窗尺寸爲1(滑窗尺寸……這個……不懂自己google吧-_-|||) CBOW可以製造的映射關係爲:[Hangzhou,a]—>is,[is,nice]—>a,[a,city]—>nice Skip-Gram可以製造的映射關係爲(is,Hangzhou),(is,a),(a,is), (a,nice),(nice,a),(nice,city)

image.png

訓練優化 額,到這裏,你可能會注意到,這個訓練過程的參數規模非常巨大。假設語料庫中有30000個不同的單詞,hidden layer取128,word2vec兩個權值矩陣維度都是[30000,128],在使用SGD對龐大的神經網絡進行學習時,將是十分緩慢的。而且,你需要大量的訓練數據來調整許多權重,避免過度擬合。數以百萬計的重量數十億倍的訓練樣本意味着訓練這個模型將是一個野獸。 一般來說,有Hierarchical Softmax、Negative Sampling等方式來解決。

github上的相關東西。

Angel Word2Vec

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章