在NLP(天然语言处理)领域,文本表示是第一步,也是很重要的一步,通俗来讲就是把人类的语言符号转化为机器可以进行计算的数字,由于普通的文本语言机器是看不懂的,必须经过转化来表征对应文本。早期是基于规则的方法进行转化,而现代的方法是基于统计机器学习的方法。git
数据决定了机器学习的上限,而算法只是尽量逼近这个上限,在本文中数据指的就是文本表示,因此,弄懂文本表示的发展历程,对于NLP学习者来讲是必不可少的。接下来开始咱们的发展历程。文本表示分为离散表示和分布式表示:github
One-hot简称读热向量编码,也是特征工程中最经常使用的方法。其步骤以下:算法
例如:John likes to watch movies. Mary likes too微信
John also likes to watch football games.网络
以上两句能够构造一个词典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **机器学习
每一个词典索引对应着比特位。那么利用One-hot表示为:分布式
**John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] **函数
likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] .......等等,以此类推。学习
One-hot表示文本信息的缺点:优化
词袋模型(Bag-of-words model),像是句子或是文件这样的文字能够用一个袋子装着这些词的方式表现,这种表现方式不考虑文法以及词的顺序。
文档的向量表示能够直接将各词的词向量表示加和。例如:
John likes to watch movies. Mary likes too
John also likes to watch football games.
以上两句能够构造一个词典,**{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10} **
那么第一句的向量表示为:[1,2,1,1,1,0,0,0,1,1],其中的2表示likes在该句中出现了2次,依次类推。
词袋模型一样有一下缺点:
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的经常使用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
字词的重要性随着它在文件中出现的次数成正比增长,但同时会随着它在语料库中出现的频率成反比降低。一个词语在一篇文章中出现次数越多, 同时在全部文档中出现次数越少, 越可以表明该文章。
,分母之因此加1,是为了不分母为0。
那么,,从这个公式能够看出,当w在文档中出现的次数增大时,而TF-IDF的值是减少的,因此也就体现了以上所说的了。
**缺点:**仍是没有把词与词之间的关系顺序表达出来。
n-gram模型为了保持词的顺序,作了一个滑窗的操做,这里的n表示的就是滑窗的大小,例如2-gram模型,也就是把2个词当作一组来处理,而后向后移动一个词的长度,再次组成另外一组词,把这些生成一个字典,按照词袋模型的方式进行编码获得结果。改模型考虑了词的顺序。
例如:
John likes to watch movies. Mary likes too
John also likes to watch football games.
以上两句能够构造一个词典,{"John likes”: 1, "likes to”: 2, "to watch”: 3, "watch movies”: 4, "Mary likes”: 5, "likes too”: 6, "John also”: 7, "also likes”: 8, “watch football”: 9, "football games": 10}
那么第一句的向量表示为:[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],其中第一个1表示John likes在该句中出现了1次,依次类推。
**缺点:**随着n的大小增长,词表会成指数型膨胀,会愈来愈大。
因为存在如下的问题,对于通常的NLP问题,是可使用离散表示文本信息来解决问题的,但对于要求精度较高的场景就不适合了。
科学家们为了提升模型的精度,又发明出了分布式的表示文本信息的方法,这就是这一节须要介绍的。
**用一个词附近的其它词来表示该词,这是现代统计天然语言处理中最有创见的想法之一。**当初科学家发明这种方法是基于人的语言表达,认为一个词是由这个词的周边词汇一块儿来构成精确的语义信息。就比如,物以类聚人以群分,若是你想了解一我的,能够经过他周围的人进行了解,由于周围人都有一些共同点才能汇集起来。
共现矩阵顾名思义就是共同出现的意思,词文档的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA。
局域窗中的word-word共现矩阵能够挖掘语法和语义信息,例如:
有以上三句话,设置滑窗为2,能够获得一个词典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。
咱们能够获得一个共现矩阵(对称矩阵):
中间的每一个格子表示的是行和列组成的词组在词典中共同出现的次数,也就体现了共现的特性。
存在的问题:
NNLM (Neural Network Language model),神经网络语言模型是03年提出来的,经过训练获得中间产物--词向量矩阵,这就是咱们要获得的文本表示向量矩阵。
NNLM说的是定义一个前向窗口大小,其实和上面提到的窗口是一个意思。把这个窗口中最后一个词当作y,把以前的词当作输入x,通俗来讲就是预测这个窗口中最后一个词出现几率的模型。
如下是NNLM的网络结构图:
input层是一个前向词的输入,是通过one-hot编码的词向量表示形式,具备V*1的矩阵。
C矩阵是投影矩阵,也就是稠密词向量表示,在神经网络中是w参数矩阵,该矩阵的大小为D*V,正好与input层进行全链接(相乘)获得D*1的矩阵,采用线性映射将one-hot表 示投影到稠密D维表示。
output层(softmax)天然是前向窗中须要预测的词。
经过BP+SGD获得最优的C投影矩阵,这就是NNLM的中间产物,也是咱们所求的文本表示矩阵,经过NNLM将稀疏矩阵投影到稠密向量矩阵中。
谷歌2013年提出的Word2Vec是目前最经常使用的词嵌入模型之一。Word2Vec实际 是一种浅层的神经网络模型,它有两种网络结构,**分别是CBOW(Continues Bag of Words)连续词袋和Skip-gram。**Word2Vec和上面的NNLM很相似,但比NNLM简单。
CBOW
CBOW是经过中间词来预测窗口中上下文词出现的几率模型,把中间词当作y,把窗口中的其它词当作x输入,x输入是通过one-hot编码过的,而后经过一个隐层进行求和操做,最后经过激活函数softmax,能够计算出每一个单词的生成几率,接下来的任务就是训练神经网络的权重,使得语料库中全部单词的总体生成几率最大化,而求得的权重矩阵就是文本表示词向量的结果。
Skip-gram:
Skip-gram是经过当前词来预测窗口中上下文词出现的几率模型,把当前词当作x,把窗口中其它词当作y,依然是经过一个隐层接一个Softmax激活函数来预测其它词的几率。以下图所示:
优化方法:
**负例采样(Negative Sampling):**这种优化方式作的事情是,在正确单词之外的负样本中进行采样,最终目的是为了减小负样本的数量,达到减小计算量效果。将词典中的每个词对应一条线段,全部词组成了[0,1]间的剖分,以下图所示,而后每次随机生成一个[1, M-1]间的整数,看落在哪一个词对应的剖分上就选择哪一个词,最后会获得一个负样本集合。
Word2Vec存在的问题
word2vec模型的问题在于词语的多义性。好比duck这个单词常见的含义有 水禽或者下蹲,但对于 word2vec 模型来讲,它倾向于将全部概念作归一化 平滑处理,获得一个最终的表现形式。
欢迎添加微信交流!请备注“机器学习”。