word2vec代码_Word2Vec-——gensim实战教程
最近斯坦福的CS224N開課了,看了下課程介紹,去年google發表的Transformer以及最近特別火的Contextual Word Embeddings都會在今年的課程中進行介紹。NLP領域確實是一個知識迭代特別快速的領域,每年都有新的知識冒出來。所以身處NLP領域的同學們要時刻保持住學習的狀態啊。筆者又重新在B站上看了這門課程的第一二節課。這里是課程鏈接。前兩節課的主要內容基本上圍繞著詞向量進行。所以這篇文章筆者想簡單的介紹一下詞向量,以及如何利用python的gensim訓練一個自己的詞向量。
詞向量簡介
詞向量指的是一個詞的向量表示。如果你希望計算機能夠進行一些復雜點的文本語義學習,你必須得將文本數據編碼成計算機能夠處理的數值向量吧,所以詞向量是一個自然語言處理任務中非常重要的一環。
one-hot representations
很久很久之前,一個詞用onehot進行編碼,如下圖所示,這種方式簡單粗暴,將一個詞用一個只有一個位置為1,其他地方為0的向量表示。1的位置就代表了是什么詞。
這種表示有如下缺點: + 占用空間大 + 詞與詞之間的向量是正交關系,沒有任何語義關聯
Distributional representations
為了克服onehot表示的兩個缺點,Distributional representations的詞向量應運而生。Distributional representations的詞向量指的是將單詞從原先所屬的空間(一般是one-hot編碼)映射到新的低維空間中去,同時,低維空間的詞向量還能表達出一些語義,比如,詞的相似性(similarity)或者一對詞與一對之間的類比關系(analogy)。 詞的相似性(similarity): 老婆 和 妻子 類比關系(analogy): 國王 - 男人 = 王后 -女人
詞向量模型
Word2vec簡介
那我們如何得到上述具有語義Distributional representations的詞向量呢,2013年提出的word2vec的方法就是一種非常方便得到高質量詞向量的方式。其主要思想是:一個詞的上下文可以很好的表達出詞的語義,它是一種通過無監督的學習文本來用產生詞向量的方式。word2vec中有兩個非常經典的模型:skip-gram和cbow。
模型任務:
- skip-gram:已知中心詞預測周圍詞。
- cbow:已知周圍詞預測中心詞。
比如 "the quick brown fox jumps over the lazy dog" 如果定義window-size為2的話, 就會產生如下圖所示的數據集,window-size決定了目標詞會與多遠距離的上下文產生關系: Skip-Gram:(the,quick) ,其中the 是模型的輸入,quick是模型的輸出。 Cbow: ((quick,brown),the) ,其中 (quick,brown)是模型的輸入,the是模型的輸出。
模型架構:
skip-gram,cbow的模型架構都是一層單層的神經網絡,如下圖所示,需要注意的部分是:神經網絡的參數就是我們最后得到的詞向量,神經網絡訓練過程就是學習詞向量(網絡參數)的過程。
Fasttext簡介
gensim 中Fasttext 模型架構和Word2Vec的模型架構差幾乎一樣,只不過在模型詞的輸入部分使用了詞的n-gram的特征。這里需要講解一下n-gram特征的含義。舉個例子,如果原詞是一個很長的詞:你吃了嗎。jieba分詞結果為["你","吃了","嗎"]。 unigram(1-gram)的特征:["你","吃了","嗎"] bigram(2-gram) 的特征: ["你吃了","吃了嗎"] 所以大家發現沒,n-gram的意思將詞中連續的n個詞連起來組成一個單獨的詞。 如果使用unigram和bigram的特征,詞的特征就會變成:["你","吃了","嗎","你吃了","吃了嗎"]這么一長串。使用n-gram的詞向量使得Fast-text模型可以很好的解決未登錄詞(OOV——out-of-vocabulary)的問題。
gensim實戰部分
首先導入必要的python包,jieba,gensim等必要的包。
from gensim.models import fasttext from gensim.models import word2vec import pandas as pd import logging import jieba數據載入與預處理
這里筆者用的是某個比賽的一些評論文本數據,讀入評論文本數據之后對每一條評論進行分詞。代碼如下:
data = pd.read_csv("data_train.csv",sep="t",encoding='gbk',header=None) sentance = list(data[2]) ## 對句子進行分詞分詞 def segment_sen(sen):sen_list = []try:sen_list = jieba.lcut(sen)except:passreturn sen_list # 將數據變成gensim中 word2wec函數的數據格式 sens_list = [segment_sen(i) for i in sentance]最終將文本數據處理如下格式:一個list ——包含每一條分詞后的文本list。
[['烤鴨', '還是', '不錯', '的', ',', '別的', '菜', '沒什么', '特殊', '的'], ['使用', '說明', '看不懂', '!', '不會', '用', ',', '很多', '操作', '沒', '詳細', '標明', '!'], ['越來越', '不好', '了', ',', '菜品', '也', '少', '了', ',', '服務', '也', '不', '及時', '。'], ['是', '在', '是', '不', '知道', '該', '吃', '什么', '好', '、', '就', '來', '了'], ......]
Word2vec模型訓練
這里筆者簡單介紹一下word2vec.Word2Vec這個API的一些重要參數。 + size: 表示詞向量的維度,默認值是100。 + window:決定了目標詞會與多遠距離的上下文產生關系,默認值是5。 + sg: 如果是0, 則是CBOW模型,是1則是Skip-Gram模型,默認是0即CBOW模型。
這里筆者都是采用默認參數。即采用CBOW模型——通過周圍詞預測中心詞的方式訓練詞向量。
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) model = word2vec.Word2Vec(sens_list,min_count=1,iter=20) model.save("word2vec.model")模型訓練過程如下圖所示,筆者的數據一個有61678不同的詞,所以會得到一個61678個詞向量模型。
Fasttext模型訓練
fasttext.FastText API一些重要參數: + size: 表示詞向量的維度,默認值是100。 + window:決定了目標詞會與多遠距離的上下文產生關系,默認值是5。 + sg: 如果是0, 則是CBOW模型,是1則是Skip-Gram模型,默認是0即CBOW模型。
上方參數和word2vec.Word2Vec API的參數一模一樣。 + word_ngrams :({1,0}, optional) 1表示使用n-gram的信息,0代表不使用n-gram的信息,如果設置為0就等于CBOW或者Skip-gram。
下方是模型訓練代碼:
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) model1 = fasttext.FastText(sens_list,min_count=1,iter=20) model1.save("fast_text.model")模型訓練過程如下圖所示,由于數據沒變:同樣有61678不同的詞,依然會得到一個61678個詞向量模型。
兩種模型詞向量優劣勢的對比
接下來筆者隨機找了幾個詞測試了下兩種方式訓練的詞向量效果如何,model 是 cbow的詞向量模型,model1是fasttext的詞向量模型。從下方兩張圖片可以看出,cbow的詞向量的語義相似度的判斷能力要好于fasttext的詞向量。
可是倘若碰到未登錄詞(OOV),cbow的詞向量模型就無法處理這些沒有見過的詞。
而fasttext可以計算未登錄詞n-gram詞(subword)的詞向量的平均值,從而得到未登錄詞的詞向量,最終求得和未登錄詞比較相似的詞。
結語
這里筆者只是簡單的介紹了一下詞向量的含義,兩種訓練詞向量的方法,同時對比了一下這兩種方法的優劣勢。對于詞向量的訓練技術依然有很多沒有介紹到,比如負采樣,分層softmax等加速模型訓練技術,還有對于高頻詞的下采樣技術。這里筆者在參考文獻放了一些博客供你學習,當然這些技術gensim都封裝好了,你只需調用就可以啦。
參考文獻:
https://blog.csdn.net/sinat_26917383/article/details/83041424 http://mccormickml.com/tutorials/
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的word2vec代码_Word2Vec-——gensim实战教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树 随机森林 xgboost_决策树
- 下一篇: python登录系统的实现方法_pyth