gensim word2vec |来自渣渣硕的学习笔记
最近写论文跑模型,要用到word2vec,但是发现自己怎么也看不懂网上的帖子,还是自己笨吧,所以就有了我的第一篇博客!!! 关于word2vec工具打算写一个系列的,当然今天这篇文章只打算写:
- 如何加载word2vec模型
- 如何利用word2vec模型求解词向量
- 如何保存word2vec模型
一、word2vec 简介
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。关于word2vec工具的内在算法我懂得不是很多,看过几篇博客,链接如下感兴趣得朋友可以看看:
https://www.cnblogs.com/guoyaohua/p/9240336.html
二、word2vec的使用
1 #加载模型
2 from gensim.models import word2vec
3
4 #加载语料库,语料库的格式
5
6 sentences=[['外形', '外观', '好看', '屏幕', '音效', '挺大', '待机时间', '长', '拍照', '效果', '特别'], ['手机', '好看', '段时间'], ['手机', '收到', '很漂亮', '后续', '评价']]
7
8 #加载模型
9 model=model=word2vec.Word2Vec(sentences,size=4,window=5,min_count=1)
10 #求解词向量以及相似度
11 model.most_similar(u'外形')
12 model['外形']
13
1 #输出
2 #外形的相似度,默认是输出10个最相似的词语,输出形式是list
3
4 [('挺大', 0.7367413640022278), ('音效', 0.657544732093811), ('后续', 0.5379071235656738), ('长', 0.5151427984237671), ('段时间', 0.4361593723297119), ('手机', 0.33148619532585144), ('特别', 0.19552142918109894), ('评价', 0.09857006371021271), ('待机时间', 0.08498627692461014), ('收到', -0.01799720525741577)]
5
6
7 #输出“外形”一词的词向量
8
9 array([-0.03313196, 0.04037894, -0.11632963, -0.08618639], dtype=float32)
看完上面的例子,是不是觉得超级简单,当然上面只是一个简单的例子,接下来你们会看到对于一个txt文件,拿到之后经过哪些处理可以作为参数输入,下面先插播一下word2vec函数的参数详解:
#参数详解
word2vec.Word2Vec(sentences=None,size=100,alpha=0.025,window=5,
min_count=5, max_vocab_size=None, sample=0.001,seed=1,
workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5,
cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0,
trim_rule=None, sorted_vocab=1, batch_words=10000)
---sentence:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
---size:是词向量的维度,默认是100
---window:表示当前词与预测词在一个句子中的最大距离是多少,在求解词向量的时候我们会考虑当前词所在句子的前后window个词语
--- sg:用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
---alpha: 是学习速率
---seed:用于随机数发生器。与初始化词向量有关。
---min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
---max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
---sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
---workers参数控制训练的并行数。
---hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
---negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
---cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
---hashfxn: hash函数来初始化权重。默认使用python的hash函数
---iter: 迭代次数,默认为5
---trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
---sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
---batch_words:每一批的传递给线程的单词的数量,默认为10000
下面举个使用word2vec工具进行txt文件词向量的求解的例子:
1 #文本处理 语料库使用了3个文本,文本自行爬取吧
2 import jieba
3 from zhon.hanzi import punctuation
4 path1='C:/Users/Administrator/Desktop/data/新闻/健康新闻/2019年“世界流感日”科普活动 暨学术会议在京召开.txt'
5 path2='C:/Users/Administrator/Desktop/data/新闻/健康新闻/67岁产妇称自然受孕产女 专家感到困惑.txt'
6 path3='C:/Users/Administrator/Desktop/data/新闻/健康新闻/90后养生:保健品“吃不掉”健康焦虑.txt'
7
8 def get_load(path):
9 f=open(path,'r',encoding='utf-8')
10 data=f.read()
11 new_s=re.sub(r'[%s,\t,\\]+'%punctuation, " ", data)
12 cut_s=jieba.lcut(new_s)
13 sentences=[]
14 for word in cut_s:
15 if word !='\n'and word !=' ':
16 sentences.append(word)
17 return sentences
18 data1=get_load(path1)
19 data2=get_load(path2)
20 data3=get_load(path3)
21 final_data=[data1,data2,data3]
22
23 #模型建立
24
25 model=word2vec.Word2Vec(final_data,size=50,window=4)
26
27 model['健康']
#输出
>>>model['健康']
array([ 8.6532356e-03, 2.1515305e-03, 3.4037780e-03, -4.4254097e-03,
-8.4194457e-03, -1.5364622e-03, 1.0745996e-02, 5.3538852e-03,
-1.1601291e-03, 6.8697990e-03, 8.7537011e-03, 8.6077927e-03,
1.4498243e-03, 2.6482970e-03, -3.4553630e-03, 8.2870452e-03,
3.5420412e-03, 8.8039534e-03, -3.6633634e-03, 5.4932209e-03,
-7.5302450e-03, 9.6533290e-04, -1.9622964e-03, 6.5719029e-03,
-3.7521331e-04, -9.1459788e-04, -8.3307233e-03, 2.9766238e-03,
7.6092435e-03, -8.3235843e-04, -9.2809896e-05, -6.7277048e-03,
1.5067700e-03, -8.0193384e-03, -1.0153291e-02, 5.9706415e-03,
4.3323904e-04, -9.5779281e-03, -9.3199704e-03, 3.5575093e-03,
3.0641828e-03, 4.4296687e-03, 2.8934417e-04, -1.8675557e-03,
-4.8446902e-03, -3.5805893e-03, -1.1002035e-03, -1.0306393e-02,
4.5978278e-03, 6.8134381e-03], dtype=float32)
>>>model.most_similar(‘健康')
[('67', 0.37046998739242554), ('会', 0.363727331161499), ('在', 0.30487531423568726), ('国家', 0.2739967703819275), ('社会', 0.26224130392074585), ('新闻', 0.19897636771202087), ('产妇', 0.19829007983207703), ('-', 0.19742634892463684), ('岁', 0.16749148070812225), ('后', 0.15823742747306824)]
#这个结果不太好,没有去停用词的结果
上面文本的处理过程,我只写了切分过程,正常情况下还得进行停用词处理,低频词的处理,这些我就不写了,懒
下面使用word2vec自带的文件处理工具进行文本的处理:
#该文件是已经分好词的中文语料---关于oppo 手机的京东评论
from gensim.models import word2vec
import logging
# 主程序
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
path2='C:/Users/Administrator/Desktop/data/评论/cut_comment.txt'
sentences = word2vec.Text8Corpus(path2)
model = word2vec.Word2Vec(sentences, size=20)
model['oppo']
model.most_similar('好评')
model.similarity(u"好评", "oppo")
>>> model.most_similar('oppo')
[('第一次', 0.9777179956436157), ('信赖', 0.9736739993095398), ('希望', 0.9670151472091675), ('价格', 0.9577376842498779), ('内容', 0.9538010954856873), ('未填写', 0.9495989084243774), ('包装', 0.9487740993499756), ('这款', 0.9475699663162231), ('破损', 0.9475245475769043), ('评价', 0.9470676779747009)]
>>> model.most_similar('好评')
[('质量', 0.9727074503898621), ('购物', 0.9600175619125366), ('正品', 0.9578911066055298), ('战斗机', 0.9555199146270752), ('喜欢', 0.9444591999053955), ('老婆', 0.9358581304550171), ('手机', 0.9266927242279053), ('推荐', 0.9224187731742859), ('货已', 0.9196405410766602), ('朋友', 0.917504072189331)]
>>> model.most_similar('手机')
[('宝贝', 0.9600850343704224), ('几天', 0.9596285820007324), ('购物', 0.9558006525039673), ('一段时间', 0.9556002020835876), ('质量', 0.9525821208953857), ('正品', 0.9524366855621338), ('到货', 0.9513840079307556), ('真心', 0.9481478929519653), ('收到', 0.9459341764450073), ('下次', 0.9382076263427734)]
>>> model.similarity(u"好评", "oppo")
0.81516
上面的文件的格式如下,你可以把拿到的所有文件进行处理之后汇总成一个文件即可
保存语料库的词语库以及相应的词向量,之后可以利用得到的词向量进行聚类等分析:
word_list=model.wv.index2word with open('C:/Users/Administrator/Desktop/data/评论/word_vocabulary.txt','r',encoding='utf-8') as f: for word in word_list: f.write(word+','+model[word]+' ') f.write('\r\n\r\n') f.close()
终于结束了,以上是本人的学习笔记,希望能对看到这篇文章的人有所帮助,如果有错误的地方麻烦在下方评论区给出!!!