词的向量化
自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。词向量是自然语言处理中常见的一个操作,是搜索引擎、广告系统、推荐系统等互联网服务背后常见的基础技术。它分为One-hot Representation、基于SVD(奇异值分解)的方法、基于迭代的方法——Word2vec等三类,并基于飞浆(paddlepaddle)平台实现。在展开介绍之前,先补充一些基本概念和数学知识。
重要概念
词项-文档矩阵,TF-IDF(term frequency times inverse document frequency):
2)若词项在整个语料库中出现的次数越多,那么对于某一篇文章而言这个词就越没有意义,即越不重要。我们用逆文档频率idf来表示这个词在整个语料库中的重要程度,故,出现越多的词,idf值会越低,出现越少的词,idf值会越高 IDF = log(N/d) ,其中N为所有文档的总数;d为出现过某个单词的文档的总数。
在现实中,词项在语料中的频率往往呈指数型。一个常用词出现的次数往往是一个次常用词出现次数的几十倍,这样常用词的权重会非常低(如“的”这样的词N/D几乎可能几乎等于1),故我们对逆文档频率取对数log,如此,文档频率的差别就从乘数变成了加数级了。即,我们在计算词项在一个文档中的重要程度,要考虑以上两个因素,用TF-IDF值来共同衡量 :
数学概念:
1)马尔科夫假设是指,每个词出现的概率只跟它前面的少数几个词有关。比如,二阶马尔科夫假设只考虑前面两个词,相应的语言模型是三元模型。引入了马尔科夫假设的语言模型,也可以叫做马尔科夫模型,产生了n-gram语言模型。
2)统计语言模型(Statistical Language Model)
假定S表示某个有意义的句子,由一连串特定顺序排列的词ω1,ω2,...,ωn组成,这里n是句子的长度。现在,我们想知道S在文本中出现的可能性,即S的概率P(S),则P(S)=P(ω1,ω2,...,ωn)。利用条件概率的公式:
1、One-hot Representation
这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。方法简单,然这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。从数学上解释,正交基的积为0。
-
参数:
-
-
- input (Variable)-输入指数,最后维度必须为1
- depth (scalar)-整数,定义one-hot维度的深度
-
返回:输入的one-hot表示
返回类型:变量(Variable)
例如:有如下三个特征属性:
性别:[“male”,”female”]
地区:[“Europe”,”US”,”Asia”]
浏览器:[“Firefox”,”Chrome”,”Safari”,”Internet Explorer”]。对于这样的特征,如果采用机器学习进行学习,通常我们需要对其进行特征数字化。
import numpy
label = fluid.layers.data(name="X", shape=[1], dtype="int64")
one_hot_label = fluid.layers.one_hot(input=label, depth=10)
结果解释:可以采用One-Hot编码的方式对上述的样本“[“male”,”US”,”Internet Explorer”]”编码,“male”则对应着[1.,0., 0., 0., 0., 0., 0., 0., 0., 0.],同理“US”对应着[0.,1., 0., 0., 0., 0., 0., 0., 0., 0.]。这样导致的一个结果就是数据会变得非常的稀疏。
2、基于SVD(奇异值分解)的方法
为了找到词嵌入(word embeddings,可以简单的理解为与词向量等价),可以首先遍历巨大的语料库,统计两个词之间某种形式的共现次数,并将统计值保存在一个矩阵。
用这种方式生成的词向量保留了足够多的语法和语义信息,但也还是存在一些问题:
-
- 矩阵维度经常变动,比如新词频繁加入。
- 由于绝大部分词并不会共现,造成矩阵过于稀疏。
- 矩阵维度一般很高,大约
- 并且难以合并新词或新的文档。对于一个