欢迎来到米奇佳佳屋的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

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()

 

  终于结束了,以上是本人的学习笔记,希望能对看到这篇文章的人有所帮助,如果有错误的地方麻烦在下方评论区给出!!!

  

posted @ 2019-12-24 13:55  菜鸟码代码  阅读(711)  评论(0编辑  收藏  举报