词向量的来源
NLP相关任务中最常见的第一步是创建一个词表库并把每个词顺序编号,这就是最初的one-hot模型,这种方法把每个词顺序编号,每个词就是一个很长的向量,向量的维度等于词表的大小,只有对应位置上的数字为1,其他都为0,例如一个词表[’ 我’,‘是’,‘谁’],那么这个词表的大小是3,每个词对应的向量为:
- 我:[1,0,0]
- 是:[0,1,0]
- 谁:[0,0,1]
而实际常用的模型是词袋模型,该模型仍以词语为基本处理单元,下面举例说明该方法的原理,首先给出两个简单的文本如下:
- 我是一个学生
- 我爱学习,小明也爱学习
基于上面文本出现的词,构建如下词典:
- {‘我’:1, ‘是’:2, ‘一个’:3, ‘学生’:4, ‘爱’:5, ‘学习’:6, ‘小明’:7, ‘也’:8}
上面词典包含8个词语,每个词有唯一的索引,那么每个文本我们就可以使用一个8维的向量表示,如下所示:
- [1,1,1,1,0,0,0,0]
- [1,0,0,0,2,2,1,1]
然而随着词典规模的增大,向量的维度也要增大,这就造成了维度灾难,矩阵也会变得超级稀疏,这样会大大耗费计算资源;同时该方法也丢掉了词序信息,造成语意鸿沟,而在很多NLP任务中,我们是需要去关注一个词的上下文信息,从而从大量的数据中挖掘有价值的信息来,词向量技术就是为了利用神经网络从大量的文本数据中提取有用信息而产生的。
word2vec简介
word2vec是Google在2013年发布的一个开源词向量建模工具,是一款将词表征为实数值的高效工具,采用的语言模型有CBOW和Skip-Gram两种,这两种模型原理可以用下图展示:
从直观上理解,Skip-Gram是给定input word来预测上下文;而CBOW是给定上下文,来预测input word。详细原理本文就不介绍了,感兴趣的可以去阅读word2vec的源码或者读这篇博客 🔗点击阅读,因为Google的gensim模块已经将这两种语言模型包装好了,可以直接用,本文也是基于该模块对上次爬取的百度百科数据进行词向量训练。
词向量实战训练
语料:自己爬取的百度百科词条345万条,数据大小为18G
word2vec函数:
- Word2Vec(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)
- 参数详解
· sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或LineSentence构建;
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法;
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百;
· window:表示当前词与预测词在一个句子中的最大距离是多少;
· alpha: 是学习速率;
· seed:用于随机数发生器。与初始化词向量有关;
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5;
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制;
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5);
· workers参数控制训练的并行数;
· hs: 如果为1则会采用