用gensim学习word2vec
20211224
?輸入為分詞列表
import gensim
# Train Word2Vec model
model = gensim.models.Word2Vec(all_data_test['seller_id_path'].astype(str).apply(lambda x: x.split(' ')), size=100, window=5, min_count=5, workers=4) 在word2vec原理篇中,我們對word2vec的兩種模型CBOW和Skip-Gram,以及兩種解法Hierarchical Softmax和Negative Sampling做了總結。這里我們就從實踐的角度,使用gensim來學習word2vec。
1. gensim安裝與概述
gensim是一個很好用的Python NLP的包,不光可以用于使用word2vec,還有很多其他的API可以用。它封裝了google的C語言版的word2vec。當然我們可以可以直接使用C語言版的word2vec來學習,但是個人認為沒有gensim的python版來的方便。
安裝gensim是很容易的,使用"pip install gensim"即可。但是需要注意的是gensim對numpy的版本有要求,所以安裝過程中可能會偷偷的升級你的numpy版本。而windows版的numpy直接裝或者升級是有問題的。此時我們需要卸載numpy,并重新下載帶mkl的符合gensim版本要求的numpy,下載地址在此:http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy。安裝方法和scikit-learn 和pandas 基于windows單機機器學習環境的搭建這一篇第4步的方法一樣。
安裝成功的標志是你可以在代碼里做下面的import而不出錯:
from gensim.models import word2vec 2. gensim word2vec API概述
在gensim中,word2vec 相關的API都在包gensim.models.word2vec中。和算法有關的參數都在類gensim.models.word2vec.Word2Vec中。算法需要注意的參數有:
1)?sentences: 我們要分析的語料,可以是一個列表,或者從文件中遍歷讀出。后面我們會有從文件讀出的例子。
2)?size: 詞向量的維度,默認值是100。這個維度的取值一般與我們的語料的大小相關,如果是不大的語料,比如小于100M的文本語料,則使用默認值一般就可以了。如果是超大的語料,建議增大維度。
3)?window:即詞向量上下文最大距離,這個參數在我們的算法原理篇中標記為cc,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,則算法中的xwxw為上下文的詞向量之和,為1則為上下文的詞向量的平均值。在我們的原理篇中,是按照詞向量的平均值來描述的。個人比較喜歡用平均值來表示xwxw,默認值也是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一起調參,來選擇合適的三個值。
以上就是gensim word2vec的主要的參數,下面我們用一個實際的例子來學習word2vec。
3. gensim ?word2vec實戰
我選擇的《人民的名義》的小說原文作為語料,語料原文在這里。
完整代碼參見我的github:?https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/word2vec.ipynb
拿到了原文,我們首先要進行分詞,這里使用結巴分詞完成。在中文文本挖掘預處理流程總結中,我們已經對分詞的原理和實踐做了總結。因此,這里直接給出分詞的代碼,分詞的結果,我們放到另一個文件中。代碼如下, 加入下面的一串人名是為了結巴分詞能更準確的把人名分出來。
# -*- coding: utf-8 -*-import jieba
import jieba.analysejieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田國富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('鐘小艾', True)
jieba.suggest_freq('陳巖石', True)
jieba.suggest_freq('歐陽菁', True)
jieba.suggest_freq('易學習', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孫連城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁義珍', True)
jieba.suggest_freq('鄭西坡', True)
jieba.suggest_freq('趙東來', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('趙瑞龍', True)
jieba.suggest_freq('林華華', True)
jieba.suggest_freq('陸亦可', True)
jieba.suggest_freq('劉新建', True)
jieba.suggest_freq('劉慶祝', True)with open('./in_the_name_of_people.txt') as f:document = f.read()#document_decode = document.decode('GBK')document_cut = jieba.cut(document)#print ' '.join(jieba_cut) //如果打印結果,則分詞效果消失,后面的result無法顯示result = ' '.join(document_cut)result = result.encode('utf-8')with open('./in_the_name_of_people_segment.txt', 'w') as f2:f2.write(result)
f.close()
f2.close() 拿到了分詞后的文件,在一般的NLP處理中,會需要去停用詞。由于word2vec的算法依賴于上下文,而上下文有可能就是停詞。因此對于word2vec,我們可以不用去停詞。
現在我們可以直接讀分詞后的文件到內存。這里使用了word2vec提供的LineSentence類來讀文件,然后套用word2vec的模型。這里只是一個示例,因此省去了調參的步驟,實際使用的時候,你可能需要對我們上面提到一些參數進行調參。
# import modules & set up logging
import logging
import os
from gensim.models import word2veclogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt') model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100) 模型出來了,我們可以用來做什么呢?這里給出三個常用的應用。
第一個是最常用的,找出某一個詞向量最相近的詞集合,代碼如下:
req_count = 5
for key in model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100):if len(key[0])==3:req_count -= 1print key[0], key[1]if req_count == 0:break; 我們看看沙書記最相近的一些3個字的詞(主要是人名)如下:
高育良 0.967257142067
李達康 0.959131598473
田國富 0.953414440155
易學習 0.943500876427
祁同偉 0.942932963371 第二個應用是看兩個詞向量的相近程度,這里給出了書中兩組人的相似程度:
print model.wv.similarity('沙瑞金'.decode('utf-8'), '高育良'.decode('utf-8'))
print model.wv.similarity('李達康'.decode('utf-8'), '王大路'.decode('utf-8')) 輸出如下:
0.961137455325
0.935589365706 第三個應用是找出不同類的詞,這里給出了人物分類題:
print model.wv.doesnt_match(u"沙瑞金 高育良 李達康 劉慶祝".split()) ? word2vec也完成的很好,輸出為"劉慶祝"。
以上就是用gensim學習word2vec實戰的所有內容,希望對大家有所幫助。
總結
以上是生活随笔為你收集整理的用gensim学习word2vec的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ELMo解读(论文 + PyTorch源
- 下一篇: gensim的word2vec如何得出词