训练词向量-Word2Vec

一、词向量的表示

在向量空间中,每个词用1和0组成的向量表示,,如([0,0,0,…,0,1,0,…,0,0,0]),有多少个词语就有多少维向量,这种方法就叫做独热(one-hot)表示方法。

用one-hot表示方法的词与词之间没有同义、词序、搭配等关联信息,从词向量中看不出两个词之间的关系,因此我们就需要对词向量进行训练,建立词向量之间的关系。

二、训练方法

训练方法是通过大量的现有语料句子传入神经网络的模型中,用模型的参数来表示各个词向量之间的关系。我们常用的工具是Word2Vec,它认为经常在一个句子中出现的词语相似度是比较高的,即对于一个中心词,最大化周边单词的概率。Word2Vec共采用三层网络来进行训练。

三、环境配置及工具包

本人采用的是python3.6及Anaconda3,本例中需要用到jieba分词工具包和gensim工具包,gensim是一款开源的Python工具包,用于从文本中无监督地学习文本隐层的向量表示,并提供了相似度计算、信息检索等API接口。工具包的安装如下图所示:


image

image

下载完成后,会提示你安装成功,下面,我们进入正题。

四、《倚天屠龙记》文本词向量模型训练

首先从百度中下载小说《倚天屠龙记》的txt文本格式文件,将其放入py文件所在的文件夹下,打开文本如下图所示:


image

首先我们先进行分词处理:

import jieba
fin=open('倚天屠龙记.txt','r',encoding='UTF-8')
fou=open('倚天屠龙记_分词.txt','w',encoding='UTF-8')
line =fin.readline()
while line:
    newline=jieba.cut(line,cut_all=False)
    str_out=' '.join(newline).replace(',','').replace('。','').replace('?','').replace('!','') \
            .replace('“', '').replace('”','').replace(':','').replace('‘','').replace('’','').replace('-','') \
            .replace('(', '').replace(')','').replace('《','').replace('》','').replace(';','').replace('.','') \
            .replace('、', '').replace('...','').replace(',','').replace('?','').replace('!','')
    print(str_out,file=fou)
    line=fin.readline()
fin.close()
fou.close()

运行以上代码,我们能够得到一个已经分好词的文本文档—倚天屠龙记_分词.txt。我们来看看分词效果:


image.png

可以看到分词效果还是不错的,下面我们调用gensim工具包训练词向量模型:

import gensim.models.word2vec as w2v
model_file_name = '倚天屠龙记_词向量模型.txt'
# 模型训练,生成词向量
sentences = w2v.LineSentence('倚天屠龙记_分词.txt')
model = w2v.Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
model.save(model_file_name)

由于我们采用的是pip进行下载库的,在模型训练的过程中可能会出现如下所示的警告:
C extension not loaded for Word2Vec, training will be slow
解决方案如下,在Anaconda Prompt中输入下方代码即可。

conda install mingw libpython 
pip uninstall gensim 
conda install gensim
pip install scipy

模型训练完成后,会产生一个训练好的模型文件—倚天屠龙记_词向量模型.txt
接下来,我们对模型进行测试:

model=w2v.Word2Vec.load(model_file_name)
#赵敏和赵敏的相似度为1
print(model.similarity('赵敏','赵敏'))
#赵敏和周芷若的相似度为0.946226
print(model.similarity('赵敏','周芷若'))
#以下代码用于输出与张三丰相似度最高的词
for i in model.most_similar('张三丰'):
    print(i[0],i[1])

输出结果如下:

'''
1.0
0.946226
张松溪 0.9943674802780151
谢逊叹 0.9936306476593018
俞莲舟 0.9919953942298889
黄衫女子 0.9910756349563599
宋青书 0.9897383451461792
缓缓的 0.9882280826568604
谢居士 0.9876694679260254
拱手 0.9874775409698486
陈友谅 0.9871797561645508
胡青牛 0.9854443073272705
'''

由于本人只采用了少部分的小说片段进行训练,可以测试的结果没有想象中的那么好,但整体情况还算不错,本文主要是为了演示Word2Vec词向量训练过程,如果有什么不太好的地方,欢迎大家留言指正。

https://www.jianshu.com/p/10903c2f78ee

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论