简要介绍
Word2Vec属于词嵌入(word embedding)的一种,将词转化为可计算、结构化的向量的过程,是一种词向量模型、简单化的神经网络。
备注:词嵌入,将高维向量嵌入到一个低维空间。
Word2Vec输入是One-Hot编码,Hidden Layer没有激活函数,即线性单元,Output Layer维度和输入层的维度一致,用的是Softmax回归。这个模型通过训练数据所学到的参数,例如隐藏层的权重矩阵,是用来处理新的任务的
该模型如何定义数据的输入和输出呢?一般分为两种模式:
1- CBOW(Continuous Bag-of-Words)连续词袋
输入是一个词语的上下文相关的词对应的词向量,
输出是该特定词语的词向量。
适合小型数据库。
2- SkipGram
输入是特定词语的词向量,
输出是该词语上下文词的词向量。
适合大型语料。
该模型一般将交叉熵代价函数定义为损失函数,采用梯度下降算法更新权重。
使用
Gensim训练Word2Vec,训练步骤:
1- 语料库预处理:
一行一个文档或句子,将文档或句子分词(以空格分割);
英文可以不用分词,英文单词之间已经由空格分割;
中文需要用分词工具,常见的有StandNLP/HanLP/结巴分词等。
2- 将原始训练语料转化成一个sentence的迭代器,每一次迭代返回的sentence是一个utf-8格式的word的列表。可以使用Gensim中的word2vec.py中的LineSentence()方法实现。
3- 输入到Gensim内建的word2vec对象进行训练即可。
from gensim.models import Word2Vec
model = Word2Vec(LineSentence(inp), size=100, window=10, min_count=3,
workers=multiprocessing.cpu_count(), sg=1, iter=10,negative=20)
参数理解:
(1) sentences:可为一个list,对大语料集,建议使用BrownCorpus/Text8Corpus/LineSentence构建;
(2) size:指特征向量的维度,默认为100;
(3) window:窗口大小,表示当前词与预测词在一个句子中的最大距离是多少;
(4) min_count:对字典做截断,词频少于min_count的单词会drop掉,默认值为5;
(5) workers:用于控制训练的并行数;
(6) sg:用于设置训练算法,默认为0,对应于CBOW算法;sg=1为skip-gram算法;
(7) iter:迭代次数,默认为5;
(8) negative:如果>0,则会采用negativesampling,用于设置多少个noise words(一般是5-20)。
将训练好的模型保存在文件中:
model.save_word2vec_format(outp2, binary=False)
# 或者
model.save("xxxx.model")
调用load()函数将保存的模型加载进来:
model = Word2Vec.load("xxxx.model")
可以调用模型进行相似性度量:
# 采用的是余弦相似度
print(model.similarity("xxx", "yy"))
优点
1- 会考虑上下文信息,与18年之前的相比,效果更好;
2- 与18年之前的相比,维度减少 ,速度更快;
3- 通用性很强,可以用在各种NLP任务中。
缺点
1- 词和向量是一对一的关系,无法适应多义词的问题;
2- 静态方法,虽然通用性强,但是无法动态优化以实现特定任务。