Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

这一部分主要介绍和特征处理相关的算法,大体分为以下三类:
1)特征抽取:从原始数据中抽取特征

2)特征转换:特征的维度、特征的转化、特征的修改

3)特征选取:从大规模特征集中选取一个子集

特征提取:

Word2Vec

Word2Vec是一种著名的词嵌入(Word Embedding)方法,是google在2013年推出的一个NLP工具,他可以计算每个单词在其给定的语料库环境下的分布式词向量(Distributed Representation,亦直接被称为词向量)。词向量表示可以在一定程度上刻画每个单词的含义。

词向量:词向量具有良好的语义特性,是表示词语特征的常用方式。词向量每一维的值代表一个具有一定的语义和语法上解释的特征。所以,可以将词向量的每一维称为一个词语特征。词向量具有多种形式,distributed representation 是其中一种。一个 distributed representation 是一个稠密、低维的实值向量。distributed representation 的每一维表示词语的一个潜在特征,该特 征捕获了有用的句法和语义特性。可见 ,distributed representation 中的 distributed 一词体现了词向量这样一个特点:将词语的不同句法和语义特征分布到它的每一个维度去表示)

Word2Vec是为一群用来产生词向量的相关模型,这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。

如果词的语义相近,它们的词向量在向量空间中也相互接近,这使得词语的向量化建模更加精确,可以改善现有方法并提高鲁棒性。词向量已被证明在许多自然语言处理问题,如:机器翻译,标注问题,实体识别等问题中具有非常重要的作用。

Word2vec是一个Estimator(估计器或者评估器),它采用一系列代表文档的词语来训练word2vecmodel。该模型将每个词语映射到一个固定大小的向量。word2vecmodel使用文档中每个词语的平均数来将文档转换为向量,然后这个向量可以作为预测的特征,来计算文档相似度计算等等。

 Word2Vec具有两种模型:

1) CBOW(连续词袋-Continuous Bag-of-Words) ,其思想是通过每个词的上下文窗口词词向量来预测中心词的词向量。

词袋模型(Bag-of-words model)是个在自然语言处理和信息检索(IR)下被简化的表达模型。此模型下,像是句子或是文件这样的文字可以用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。最近词袋模型也被应用在计算机视觉领域。词袋模型被广泛应用在文件分类,词出现的频率可以用来当作训练分类器的特征。关于"词袋"这个用字的由来可追溯到泽里格·哈里斯于1954年在Distributional Structure的文章。

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

2)Skip-gram,其思想是通过每个中心词来预测其上下文窗口词,并根据预测结果来修正中心词的词向量。

Skip-gram 模型是一个简单但却非常实用的模型。在自然语言处理中,语料的选取是一个相当重要的问题: 第一,语料必须充分。一方面词典的词量要足够大,另一方面要尽可能多地包含反映词语之间关系的句子,例如,只有“鱼在水中游”这种句式在语料中尽可能地多,模型才能够学习到该句中的语义和语法关系,这和人类学习自然语言一个道理,重复的次数多了,也就会模仿了; 第二,语料必须准确。 也就是说所选取的语料能够正确反映该语言的语义和语法关系,这一点似乎不难做到,例如中文里,《人民日报》的语料比较准确。 但是,更多的时候,并不是语料的选取引发了对准确性问题的担忧,而是处理的方法。 n元模型中,因为窗口大小的限制,导致超出窗口范围的词语与当前词之间的关系不能被正确地反映到模型之中,如果单纯扩大窗口大小又会增加训练的复杂度。Skip-gram 模型的提出很好地解决了这些问题。顾名思义,Skip-gram 就是“跳过某些符号”,例如,句子“中国足球踢得真是太烂了”有4个3元词组,分别是“中国足球踢得”、“足球踢得真是”、“踢得真是太烂”、“真是太烂了”,可是我们发现,这个句子的本意就是“中国足球太烂”可是上述 4个3元词组并不能反映出这个信息。Skip-gram 模型却允许某些词被跳过,因此可以组成“中国足球太烂”这个3元词组。 如果允许跳过2个词,即 2-Skip-gram 。

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

几个详细介绍的链接:

大白话讲解word2vec到底在做些什么

如果看了此文还不懂 Word2Vec,那是我太笨

一文详解 Word2vec 之 Skip-Gram 模型(结构篇)

下面介绍ML库中Word2Vec类的使用。

1)首先,导入Word2Vec所需要的包,并创建三个词语序列,每个代表一个文档:

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

2)新建一个Word2Vec,显然,它是一个Estimator,设置相应的超参数,这里设置特征向量的维度为3,Word2Vec模型还有其他可设置的超参数,具体的超参数描述可以参见。

http://spark.apache.org/docs/1.6.2/api/scala/index.html#org.apache.spark.ml.feature.Word2Vec

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

3)读入训练数据,用fit()方法生成一个Word2VecModel。

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

4)利用Word2VecModel把文档转变成特征向量。

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec

5)可以看到,文档被转变为了一个3维的特征向量,这些特征向量就可以被应用到相关的机器学习方法中。

Spark MLlib 特征抽取、转化和选择 -- 特征抽取2 Word2Vec