一、简介
word2vec是Google在2013年开源的一个工具,核心思想是将词表征映
射为对应的实数向量(下文会介绍)。
目前采用的模型有以下两种:
1.CBOW(Continuous Bag-Of-Words,即连续的词袋模型)
2.Skip-Gram
采用的两种分类方法:
1.Hierarchical Softmax
2.Negative Sampling
常见的组合为Skip-Gram + Negative Sampling
词向量
众所周知,计算机只认识0 1符号,在自然语言处理中为了能让机器识别我们的语言,就要我们的语言抽象为机器能识别的方式,所以词向量就是自然语言到机器语言的转换;所以词向量就是把自然语言数学化的一种方式,就是把自然语言转化成向量。
词向量有两种词表示方法
1.One-hot Representation
采用稀疏存储,把每个词表示成一个很长的向量,向量维度是词表大小,向量中只有一个值为1,其余全是0
例如:
“图书” 可表示为 [0 0 0 0 0 1 0 0 0 0 0 ...]
“书本” 可表示为 [0 0 0 0 1 0 0 0 0 0 0 ...]
优点:采用稀疏存储方式简洁,词语的表示方便,例如计算时可以用6表示“图书”,可以用5表示“书本”
缺点:由于向量维度是词表大小,维度过大会造成训练缓慢的困扰(如在deep learning);任意两个词不相关,存在语义鸿沟
2.Distributional Representation
Hinton于1986年提出,解决了语义鸿沟的问题,让相关或者相似的词在距离上更加接近了
采用低维实数向量表示词语
例如:
“书本” [0.453, -0.144, -o.981, 0.513, -0.712 ...]
将词语映射到一个新的空间,并以多维的连续实数向量进行表示叫做“Word Represention”或“Word Embedding”
优点:解决“词义鸿沟”
缺点:需要通过训练模型得到词向量
每个词的词向量在不同语料中是不同的
二、用法
环境:python3.5+gensim1.0.1
安装:conda install gensim=1.0.1
先贴完整代码,后文做代码解析
#coding=utf-8
import warnings
import gensim
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
from gensim.models import word2vec
# 加载语料
sentences = word2vec.Text8Corpus(u'G:/experiment/Word2vec/111.txt');
# 训练语料
model = word2vec.Word2Vec(sentences, size=10, min_count=0)
#计算两个词的相似度/相关程度
y2 = model.similarity("中国", "世界")
print(y2)
# 计算某个词的相关词列表 (参数topn=x 代表输出相关词的个数 ) 相似度从高到低
# i[0]是词,i[1]是相似度,下面代码表示输出和“中国”相似度从高到低的10个词
for i in model.most_similar("中国", topn=10):
print('i[o]'+str(i[0])+' '+'i[1]'+str(i[1]))
# 保存训练好的模型,保存路径(和当前.py文件同级目录下)
model.save('十九大.txt')
辛苦训练的模型已经保存起来了,下次可以直接调用这个模型,代码如下
# 加载某个模型
# new_model = gensim.models.Word2Vec.load('十九大.txt')
如果你还需要用到你训练好的词向量的话,可以把词向量存为你需要的格式,代码如下
#保存词和词向量为txt文件
model.wv.save_word2vec_format("123.txt", binary=False)
gensim.models.Word2Vec() 有一系列的参数,常用的如下
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
参数解释:
1.sg=1是skip-gram算法,对低频词敏感;默认sg=0为CBOW算法。
2.size是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
3.window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)。
4.min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
5.negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3。
6.hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
7.workers控制训练的并行,此参数只有在安装了Cpython后才有效,否则只能使用单核。
该博文主要是这段时间学习word2vec的总结,方便以后的复习,word2vec还有许多内容待挖掘,后面会继续更。
网友评论