2018年“达观杯”复盘——任务3

一、word2vec原理概述

  • Word2vec 其实是语言模型训练的一个副产品,传统的统计词向量模型使用单词在特定上下文中出现的概率表征这个句子是自然语言的概率:p(sentence) = p(word|context)。上下文context是指单词前面的特定的单词。N-gram模型又称为n元组模型, 所谓n元组是单词和它的上下文(即它前面的n-1个单词)组成的词组。
  • N-gram模型的另一个问题在于计算量过大, 计算一次条件概率就要扫描一遍语料库, 使得可以实际应用的深度(N值)一般为2或3。这个问题可以采用拟合的方法来解决即预测法。神经网络模型即计算部分概率值用于训练神经网络, 然后使用神经网络预测其它概率值。
  • 其实,Word2vec的训练过程可以看做是通过神经网络机器学习算法来训练N-gram 语言模型,并在训练过程中求出word所对应的vector的方法。根据语言模型的不同,又可分为“CBOW”和“Skip-gram”两种模型。而根据两种降低训练复杂度的方法又可分为“Hierarchical Softmax”和“Negative Sampling”。两种模式和两种方法进行组合,所以实际上是有四种实现。

1.CBOW(Continuous Bag-of-Word Model)

  • 又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。
    在这里插入图片描述
    CBOW模型的训练过程如下图所示:
    在这里插入图片描述
  • 第一层是输入层,首先选定一个窗口大小,当前单词为Wi,每一个词随机初始化一个K维向量,则CBOW模型的输入是当前词的上下文窗口内的词的词向量,中间层(隐层)将上下文词的向量累加(或者求均值)得到中间向量(K维),第三层是一颗哈夫曼树,叶节点代表语料里所有的词(语料含有V个独立的词,则二叉树有|V|个叶节点)。对于一个叶节点(即语料库中的一个词),如果记左子树为1,右子树为0,就会有一个全局的编码,例如“01001”。接下来,隐层的每一个节点(K维)都会跟哈夫曼树的非叶结点有联系,每一个非叶结点其实是一个二分类的Softmax,它将中间向量的每一个节点分到树的左右子树上。

2.Skip-gram

Skip-gram模型的最大特点是:由当前词预测上下文词
在这里插入图片描述
Skip-gram模型的训练过程如下图所示:
在这里插入图片描述

  • 与CBOW模型不同的是,Skip-gram模型输入层不再是多个词向量,而是只有一个词向量,所以不用做隐层的向量累加。此外,Skip-gram模型需要用当前词预测上下文窗口中的每一个词。
  • 上面介绍的CBOW和Skip-gram模型就是在Hierarchical Softmax方法下实现的,还记得我们一开始提到的还有一种Negative Sampling方法么,这种方法也叫作负采样方法。从上面我们可以看出,无论是CBOW还是Skip-gram模型,其实都是分类模型。对于机器学习中的分类任务,在训练的时候不但要给正例,还要给负例。对于Hierarchical Softmax来说,负例其实就是哈夫曼树的根节点。对于Negative Sampling,负例是随机挑选出来的。据说Negative Sampling能提高速度、改进模型质量。
  • Word2vec其实是N-gram模型训练的副产品,以CBOW模型为例,我们的目标函数是最大化:L=P(u|context),如果采用Negative Sampling,如果u是正例,则P(u|context)越大越好,如果u是负例,则P(u|context)越小越好。另外,需要注意,负采样应该保证频次越高的样本越容易被采样出来。

二、Python实现

1.python的Word2vec( )参数详解

本文使用gensim库中的word2vec()函数。

  • sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。

  • size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

  • window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为cc,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

  • sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

  • hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

  • negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xwxw为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xwxw,默认值也是1,不推荐修改默认值。

  • min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

  • iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为ηη,默认是0.025。

  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

2.python代码实现

数据预处理请看任务1.https://blog.csdn.net/weixin_41151521/article/details/89048032

#导入工具包
import pandas as pd
import gensim
import pickle
import numpy as np
import csv,sys
#定义辅助函数
def sentence2list(sentence):
    return sentence.strip().split()
#构造数据集
print("准备数据................ ")
sentences_train = list(df_train.loc[:, 'word_seg'].apply(sentence2list))
sentences_test = list(df_test.loc[:, 'word_seg'].apply(sentence2list))
sentences = sentences_train + sentences_test
print("准备数据完成! ")
#训练模型
#定义初始参数
vector_size = 100
#开始训练
print("开始训练................ ")
model = gensim.models.Word2Vec(sentences=sentences, size=vector_size, window=5, min_count=5, workers=8, sg=0, iter=5)
print("训练完成! ")
#保存训练结果
print(" 保存训练结果........... ")
wv = model.wv
vocab_list = wv.index2word
word_idx_dict = {}
for idx, word in enumerate(vocab_list):
    word_idx_dict[word] = idx
    
vectors_arr = wv.vectors
vectors_arr = np.concatenate((np.zeros(vector_size)[np.newaxis, :], vectors_arr), axis=0)#第0位置的vector为'unk'的vector

f_wordidx = open(feature_path + 'word_seg_word_idx_dict.pkl', 'wb')
f_vectors = open(feature_path + 'word_seg_vectors_arr.pkl', 'wb')
pickle.dump(word_idx_dict, f_wordidx)
pickle.dump(vectors_arr, f_vectors)
f_wordidx.close()
f_vectors.close()
print("训练结果已保存到该目录下! ")

参考文献

1.https://blog.csdn.net/mpk_no1/article/details/72458003
2.https://github.com/Heitao5200/DGB/blob/master/feature/feature_code/train_word2vec.py

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值