目录
词袋模型
one-hot
word-embedding
我们知道,传统的数据挖掘任务面向的是结构化数据。结构化数据很好理解,就是很有结构的数据嘛。
比如下面这张银行客户数据库中的表格:
编号 | 姓名 | 年龄 | 年收入 | 职业 | 有无欠贷 |
01 | 夕小瑶 | 16(就好了) | 100 | 学生 | 无 |
02 | 王大锤 | 40 | 1,000,000 | 副总裁 | 有 |
03 | 吴名 | 30 | 200,000 | 程序员 | 无 |
而基于上述历史信息来完成某项数据挖掘任务的话,每一维度的特征很明确,表格的每一列,或者说每个属性(attribute)就是一个特征。因此每一个样本,即每一行就可以轻松的表示为一个特征向量。
但是我们知道,自然语言文本是非结构化的。因此基于自然语言文本的数据挖掘任务,也就是文本挖掘任务,该如何下手呢?或者说,如何从文本中抽象出机器学习算法认识的特征向量呢?
词袋模型
一个很容易想到的是,将自然语言文本的每个词作为一个特征。因此对应的特征向量即这些特征的组合。这种思路虽然naïve,但是很有效哦。基于这种思想的模型就是词袋模型(Bag of Words),也叫向量空间模型(Vector Space Model)。
有了词袋模型后,每个特征(即每个词)的值该如何定义呢?或者说每个词该如何编码呢?如何进一步生成我们需要的特征向量呢?
one-hot
同样一个很naive的想法就是:设词典的大小为n(词典中有n个词),假如某个词在词典中的位置为k,则设立一个n维向量,第k维置1,其余维全都置0。这个思想就是one-hot编码,中文叫独热编码(茫茫0海中有一个1,不就是孤独的热点吗)。
比如这里有三句话,即三个样本:
“我喜欢你”;
“你喜欢你的狗狗”;
“你是狗狗”。
假设已经分词完成,那么如果我们要从这三个样本中挖掘信息的话,根据词袋模型的思想:
首先就要将这些句子中出现过的词构建一个词典。这个词典依次包含[我,喜欢,你,的,是,狗狗]这六个词。根据one-hot编码,“我”就会被编码为[1,0,0,0,0,0],而“喜欢”就被编码为[0,1,0,0,0,0],以此类推。
那么如何继续推进,利用one-hot编码来生成特征向量呢?
一个样本的特征向量即该样本中的每个单词的one-hot向量直接相加。这三个样本的特征向量便会表示为:
我喜欢你:[1,1,1,0,0,0]
你喜欢你的狗狗:[0,1,2,1,0,1]
你是狗狗:[0,0,1,0,1,1]
其中,第二个句子中“你”出现了两次,因此第三维的值为2。但是注意一下,在有的机器学习模型,比如贝努利分布的朴素贝叶斯模型中,仅考虑每个词出现与否,此时第二个句子的词袋模型就变成了[0,1,1,1,0,1]。
看,特征向量构建完成啦,剩下的就交给机器学习吧~
但是这样的话,仔细一想,好像麻烦挺大的。比如涉及到的单词很多时,词典会变得超大,动辄几千上万维。因此每个样本的特征向量也会变得极其稀疏(大部分维度的值为0),这么高的维数对于很多机器学习模型比如神经网络,那简直是训练的灾难呐。
再一想,好像更不合理。因为这样编码的话,还忽略了单词的语义!比如明明“喵星人”和“猫”是同一个意思,却被编码成了两个不同的词。
有没有办法同时解决上述这两个问题呢?
word-embedding
解决方案就是word-embedding,中文叫词向量,也叫词嵌入。实质就是将单词编码成低维实数向量。(专业的说法是将单词映射到一个低维空间,就像一个嵌入的过程,因此叫word-embedding)
比如“狗”或许会被编码成[0.192, 0.221, -0.442, ...],一般来说维度会控制在500维以下,几十维也是常有的。但是一般不会上升到千维。
那么怎么表示单词之间的语义关系呢?其实将每个词映射到低维向量空间后就很明朗啦。比如我们的词向量限制为2维。那么词“猫”、“狗”、“开心”、“惊讶”、“手机”映射成词向量后在向量空间中可能是这样子的:
可以看到,“狗”和“猫”都是动物,语义相近,因此具有很小的夹角,同理还有“开心”和“惊讶”。而“狗”和“手机”这两个关系不大的词语便会有很大的夹角。这种度量夹角来计算向量之间距离的专业说法叫计算余弦相似度。
合格的词向量除了在语义上相近会被编码到邻近的区域,还应该支持简单的语义运算,将语义运算映射为向量运算。比如:
“中国”+“首都”=“北京”;
“王子”-“公主”=“男”-“女“;
在向量空间看起来是类似这个样子的
看,有了词向量这么智能的编码方法,是不是感觉用它来做文本挖掘的信心强了很多呢?
虽然词向量很智能,然而词向量的生成并不是一件容易的事情。至今如何训练高精度的词向量依然是NLP、IR领域的热门topic,也是深度学习在NLP领域的一个应用重点(小夕悄悄告诉你,其实目前来看,关于词向量的生成,浅层神经网络跟深度神经网络的效果差不多)。如果有喵喵对词向量的生成产生了极大的兴趣,又具备足够的机器学习,尤其是神经网络的基础的话,可以Google一下下面小夕推荐的论文:
1、Yoshua Bengio, Rejean Ducharme, Pascal Vincent, and Christian Jauvin. A neural probabilistic language model. Journal of Machine Learning Research (JMLR),3:1137–1155, 2003
2、Turian Joseph, Lev Ratinov, and Yoshua Bengio. Word representations: a simple and general method for semi-supervised learning. Proceedings of the 48thAnnual Meeting of the Association for Computational Linguistics (ACL). 2010
3、MikolovT, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[C]//Advancesin neural information processing systems. 2013: 3111-3119.
4、Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprintarXiv:1301.3781, 2013.