word2vec的应用----使用gensim来训练模型
2018-01-18 17:45
501 查看
一、word2vec的原理就不介绍
二、 gensim的介绍与使用
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而不出错:
import jieba.analyse
import jieba
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)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('京州市', True)
jieba.suggest_freq('副市长', True)
with open('C:/Users/DX/Desktop/自然语言处理/课程相关笔记/word2vec/gensim应用/in_the_name_of_people/in_the_name_of_people.txt','rb') as f:
document = f.read()
document_cut = jieba.cut(document, cut_all =False)
# print('/'.join(document_cut))
result = ' '.join(document_cut)
result = result.encode('utf-8')
with open('C:/Users/DX/Desktop/自然语言处理/课程相关笔记/word2vec/gensim应用/in_the_name_of_people_segment.txt','wb+') as f1:
f1.write(result)#读取的方式和写入的方式要一致
f.close()
f1.close()
分词之后的部分截图,词与词之间用空格间隔开
接下来,使用分词后的文本训练word2vec模型
直接就贴上相应的代码
这就是大概word2vec对于中文基本使用,希望有点收获。当然还会有后期的继续跟进。这是跟进斯坦福大学cs224n第二课word2vec时所进行的相关练习。
二、 gensim的介绍与使用
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. python版的gensim
在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应用文本数据:《人民的名义》的小说原文作为语料 百度云盘:https://pan.baidu.com/s/1ggA4QwN。 拿到了原文,我们首先要进行分词,这里使用结巴分词完成。因此,这里直接给出分词的代码,分词的结果,我们放到另一个文件中。代码如下, 加入下面的一串人名是为了结巴分词能更准确的把人名分出来,最后将分词后的结果保存在文件中。注意其中的编码的问题,保存时是utf-8,处理时是gbk。同时,分词时添加一些人名和专有名词,增加分词后的效果。#-*-coding:utf-8 -*-
import jieba.analyse
import jieba
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)
jieba.suggest_freq('刘庆祝', True)
jieba.suggest_freq('京州市', True)
jieba.suggest_freq('副市长', True)
with open('C:/Users/DX/Desktop/自然语言处理/课程相关笔记/word2vec/gensim应用/in_the_name_of_people/in_the_name_of_people.txt','rb') as f:
document = f.read()
document_cut = jieba.cut(document, cut_all =False)
# print('/'.join(document_cut))
result = ' '.join(document_cut)
result = result.encode('utf-8')
with open('C:/Users/DX/Desktop/自然语言处理/课程相关笔记/word2vec/gensim应用/in_the_name_of_people_segment.txt','wb+') as f1:
f1.write(result)#读取的方式和写入的方式要一致
f.close()
f1.close()
分词之后的部分截图,词与词之间用空格间隔开
接下来,使用分词后的文本训练word2vec模型
直接就贴上相应的代码
# -*- coding: utf-8 -*- """ Created on Thu Jan 18 16:04:12 2018 @author: DX """ from gensim.models import word2vec import logging ##训练word2vec模型 #获取日志信息 logging.basicConfig(format = '%(asctime)s:%(leveltime)s:%(message)s',level = logging.INFO) #加载分此后的文本,使用的是Ttext2Corpus类 sentences = word2vec.Text8Corpus(r'K:\in_the_name_of_people_segment.txt') #训练模型,部分参数如下 model = word2vec.Word2Vec(sentences,size = 100,hs = 1,min_count =1,window =3) #模型的预测 print('-----------------分割线----------------------------') #计算两个词向量的相似度 try: sim1 = model.similarity(u'沙瑞金',u'高育良') sim2 = model.similarity(u'李达康',u'易学习') except KeyError: sim1 = 0 sim2 = 0 print(u'沙瑞金 和 高育良 的相似度为 ',sim1) print(u'李达康 和 易学习 的相似度为 ',sim2) print('-----------------分割线---------------------------') #与某个词(李达康)最相近的3个字的词 print(u'与李达康最相近的3个字的词') req_count = 5 for key in model.similar_by_word(u'李达康',topn =100): if len(key[0])==3: req_count -=1 print(key[0],key[1]) if req_count ==0: break; print('-----------------分割线---------------------------') #计算某个词(侯亮平)的相关列表 try: sim3 = model.most_similar(u'侯亮平',topn =20) print(u'和 侯亮平 与相关的词有:\n') for key in sim3: print(key[0],key[1]) except: print(' error') print('-----------------分割线---------------------------') #找出不同类的词 sim4 = model.doesnt_match(u'沙瑞金 高育良 李达康 刘庆祝'.split()) print(u'这类人物中不同类的人名',sim4) print('-----------------分割线---------------------------') #保留模型,方便重用 model.save(u'人民的名义.model') #对应的加载方式 #model2 = word2vec.Word2Vec.load('人民的名义.model') # 以一种c语言可以解析的形式存储词向量 #model.save_word2vec_format(u"书评.model.bin", binary=True) # 对应的加载方式 # model_3 =word2vec.Word2Vec.load_word2vec_format("text8.model.bin",binary=True)程序运行的结果如下:
这就是大概word2vec对于中文基本使用,希望有点收获。当然还会有后期的继续跟进。这是跟进斯坦福大学cs224n第二课word2vec时所进行的相关练习。
相关文章推荐
- Gensim进阶教程:训练word2vec与doc2vec模型
- Gensim进阶教程:训练word2vec与doc2vec模型
- 【word2vec】之 训练模型结果的结构探究 模型改造 python gensim
- gensim实现python对word2vec的训练和计算
- word2vec 用于训练数据,生成模型
- word2vec实战:获取和预处理中文维基百科(Wikipedia)语料库,并训练成word2vec模型
- gensim实现python对word2vec的训练和计算
- 【python gensim使用】word2vec词向量处理英文语料
- 【python gensim使用】word2vec词向量处理中文语料
- word2vec训练中文模型
- 【python gensim使用】word2vec词向量处理英文语料
- word2vec训练中文模型
- Gensim进阶教程:训练word2vec与doc2vec模型
- 使用word2vec训练wiki中文语料
- 使用中文wiki语料库训练word2vec
- win10环境下使用gensim实现word2vec模型训练及测试
- python 环境下gensim中的word2vec的使用笔记
- 关于Gensim的初次见面 和 Doc2vec 的模型训练
- Word2Vec的Python版Gensim的使用
- python︱gensim训练word2vec及相关函数与功能理解