第1关:向量化算法 word2vec
任务描述
本关任务:根据本关所学有关 word2vec 算法的知识,完成基于 gensim 模块进行文本相似度比较的程序的编写并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
文本向量化的具体含义;
-
word2vec 算法的几种模型。
文本向量化概述
文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。文本向量化就是将文本表示成一系列能够表达文本语义的向量,是文本表示的一种重要方式。目前对文本向量化大部分的研究都是通过词向量化实现的,也有一部分研究者将句子作为文本处理的基本单元,于是产生了 doc2vec 和 str2vec 技术。
word2vec 算法
词袋( Bag Of Word )模型是最早的以词语为基础处理单元的文本向量化方法。该模型产生的向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。该方法虽然简单易行,但是存在如下三个方面的问题:维度灾难、无法保留词序信息、存在语义鸿沟。
随着互联网技术的发展,大量无标注数据的产生,研究重心转移到利用无标注数据挖掘有价值的信息上来。词向量( word2vec )技术就是为了利用神经网络,从大量无标注的文本中提取有用的信息而产生的。
词袋模型只是将词语符号化,所以词袋模型是不包含任何语义信息的。如何使“词表示”包含语义信息是该领域研究者面临的问题。分布假设的提出为解决上述问题提供了理论基础。该假设的核心思想是:上下文相似的词,其语义也相似。随后有学者整理了利用上下文表示词义的方法,这类方法就是有名的词空间模型。通过语言模型构建上下文与目标词之间的关系,是一种常见的方法,神经网络词向量模型就是根据上下文与目标词之间的关系进行建模。接下来,我们将介绍三种常见的生成词向量的神经网络模型。
神经网络语言模型
神经网络语言模型(Neural Network Language Model,NNLM)与传统方法估算的不同在于直接通过一个神经网络结构对 n 元条件概率进行估计。由于 NNLM 模型使用低维紧凑的词向量对上下文进行表示,解决了词袋模型带来的数据稀疏、语义鸿沟等问题。另一方面,在相似的上下文语境中,NNLM 模型可以预测出相似的目标词,而传统模型无法做到这一点。NNLM 模型的基本结构如图1所示。
图 1 NNLM 语言模型图
进行神经网络模型的训练时,目标是进行词的概率预测,就是在词环境下,预测下一个该是什么词,目标函数为 L(θ)=∑tlogP(Wt∣Wt−n+1,...Wt−1) ,通过对网络训练一定程度后,最后的模型参数就可当成词向量使用。
C&W 模型
NNLM 模型的目标是构建一个语言概率模型,而 C&W 则是以生成词向量为目标的模型。在 NNLM 模型的求解中,最费时的部分当属隐藏层到输出层的权重计算。由于 C&W 模型没有采用语言模型的方式去求解词语上下文的条件概率,而是直接对 n 元短语打分,这是一种更为快速获取词向量的方式。C&W 模型的结构如图2所示。
图 2 C&W 模型结构图
C&W 模型的核心机理是:如果 n 元短语在语料库中出现过,那么模型会给该短语打高分;如果是未出现在语料库中的短语则会得到较低的评分。
CBOW 模型和 Skip-gram 模型
为了更高效地获取词向量,有研究者在 NNLM 和 C&W 模型的基础上保留其核心部分,得到了 CBOW(Continuous Bag of-Words) 模型和 Skip-gram 模型,下面将介绍这两种模型。 1、CBOW 模型 CBOW 模型如图3所示,由图易知,该模型使用一段文本的中间词作为目标词;同时,CBOW 模型去掉了隐藏层,这大幅提升了运算速率。此外,CBOW 模型使用上下文各词的词向量的平均值替代 NNLM 模型各个拼接的词向量。由于 CBOW 模型去除了隐藏层,所以其输入层就是语义上下文的表示。
图 3 CBOW 模型图
2、Skip-gram 模型 Skip-gram 模型的结构如图4所示,由图可知, Skip-gram 模型同样没有隐藏层。但与 CBOW 模型输入上下文词的平均词向量不同, Skip-gram 模型是从目标词 ω 的上下文中选择个词,将其词向量组成上下文的表示。
图 4 Skip-gram 模型图
Skip-gram 和 CBOW 实际上是 word2vec 两种不同思想的实现: CBOW 的目标是根据上下文来预测当前词语的概率,且上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫 continuous bag-of-words 模型。Skip-gram 刚好相反,其是根据当前词语来预测上下文概率的。
Gensim 中的 Word2vec
在 gensim 中,word2vec 相关的 API 都在包 gensim.models.word2vec
中,和算法有关的参数都在类 gensim.models.word2vec.Word2Vec
中,使用方法为:
from gensim.models import word2vec
model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)
在函数word2vec.Word2Vec(sentences, hs,min_count,window,size)
中,各个参数的具体含义为:
- sentences:我们要分析的语料,可以是一个列表,或者从文件中遍历读出;
- hs:即我们的 word2vec 两个解法的选择了,如果是 0, 则是 Negative Sampling,是 1 的话并且负采样个数 negative 大于 0, 则是 Hierarchical Softmax。默认是 0 即 Negative Sampling;
- min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是 5。如果是小语料,可以调低这个值;
- window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为 c,window 越大,则和某一词较远的词也会产生上下文关系。默认值为 5。在实际使用中,可以根据实际的需求来动态调整这个 window 的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在 [5,10] 之间;
- size:词向量的维度,默认值是 100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于 100M 的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
编程要求
在右侧编辑器中的 Begin-End 之间补充 Python 代码,使用 gensim 模块构建 word2vec 模型,从而对所输入文本进行相似度比较,并输出比较结果。其中,训练文本由后台给定,需要比较的文本通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
测试输入:《人民的名义》中的人名
钟小艾
侯亮平
预期输出:
相近度高达85%以上
import logging
from gensim.models import word2vec
def getmodel():
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt')
# 任务:使用 gensim 模块中的word2vec对sentences文本构建合适的word2vec模型,并保存到model变量中,使得文本中的人名相近度达0.9以上。
# ********** Begin *********#
model = word2vec.Word2Vec(sentences, hs=1, min_count=1, window=3, size=100)
# ********** End **********#
return model