NLP学习——Word2vec

一、Word2vec简介

        WordW2vec是google在2013年的论文《Efficient Estimation of Word Representations inVector Space》中提出的。顾名思义,是一个词向量模型,也就是将字词转为向量表示。

        Word2vec模型包含两种训练词向量的方法:CBOW和skip-gram。其中CBOW的基本思想是通过该关键词的上下文的词语来预测这个关键词:而skip-gram的基本思想与CBOW相反,是通过该关键词来预测上下文的词语。如下图所示:

NLP学习——Word2vec_第1张图片

 二、训练过程

  • CBOW

 具体如上图所示:

  1. 首先将关键词的上下文词语进行独热编码,得到的向量长度为词表长度(所有训练语料中不同的词的总个数),形状为1\times V的向量,该词的位置为1,其余位置为0。
  2. 将每个上下文词语的独热编码乘以一个V\times N权重矩阵W,每个词语都乘以同一个权重矩阵W。得到多个1\times N的向量。
  3. 对于这么多个1\times N的向量,采用相加求平均的方法整合成一个1\times N的向量。
  4. 然后将这个1\times N的向量与该关键字对应N\times V的矩阵W',得到一个1\times V的向量。
  5. 对于这个1\times V的向量需要通过softmax层归一化后得到的向量为关键词的预测向量,该向量不是独热编码,而是有许多浮点数值的概率组成的。概率最大的位置为关键词独热编码为1的位置。
  6. 将关键词的预测向量与标签向量(独热编码的向量)进行一个误差计算,通常采用交叉熵。
  7. 将这个误差反传回神经元,每一次前向计算后都会将误差反传,从而达到调整权重矩阵WW'的目的,与BP神经网络同理。

        当损失达到最优则训练结束,便得到了我们需要的权重矩阵W,通过这个权重矩阵便可根据输入的独热向量形成词向量。

  • skip-gram

        其实skip-gram就是将CBOW反过来操作,如以上那张CBOW的过程图一样,只不过用上面同样的步骤从右边开始解读。明白的话这部分的训练步骤可以不看。

  1. 首先将关键词进行独热编码。
  2. 将每个关键词的独热编码乘以一个V\times N权重矩阵W
  3. 然后将这个关键词的1\times N的向量与该关键字的上下文词语词向量(共用一个)N\times V矩阵W'相乘,得到多个1\times V的向量。
  4. 对于这些1\times V的向量需要通过softmax层归一化后得到的向量为关键词上下文词语预测向量。
  5. 关键词上下文词语的预测向量与标签向量(独热编码的向量)进行一个误差计算,通常采用交叉熵,对得到的多个交叉熵损失进行求和。
  6. 将这个误差反传回神经元,每一次前向计算后都会将误差反传,从而达到调整权重矩阵WW'的目的。
  7. 最后得到形成词向量的权重矩阵是W

三、优缺点

  • 优点
  1. 由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好。
  2. 比之前的 Embedding方法维度更少,所以速度更快
  3. 通用性很强,可以用在各种 NLP 任务中
  • 缺点
  1. 由于词和向量是一对一的关系,所以多义词的问题无法解决。
  2. Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化。

注意:word2vec有负采样和层次softmax的改进,也是知识点和难点,详细可以产靠这篇博客:http://t.csdn.cn/Nie7O

四、代码示例

        这里没有弄很详细的代码,就调用了word2vec的一个包,也就是一个简单的使用例子,知道怎么使用就行,具体的模型参数网上都可以查得到,也不多:

import logging

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
from all_model_param import *

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s',level=logging.INFO)
model = Word2Vec(
    LineSentence(open('file_path', 'r', encoding='utf8')),
    sg=0,
    epochs=300,
    vector_size=word_vector_size,
    window=5,
    min_count=1,
    workers=8
)

# 词向量保存
model.wv.save_word2vec_format('word2vec/data.vector', binary=False)

# 模型保存
model.save('word2vec/test.model')

你可能感兴趣的:(NLP学习,自然语言处理,word2vec)