NLP⾃然语⾔处理:⽂本表⽰总结-上篇wordembedding(基
于降维、基于聚类、CB。。。
⽂本表⽰分类(基于表⽰⽅法)
离散表⽰
one-hot表⽰
词袋模型与TF-ID
分布式表⽰
基于矩阵的表⽰⽅法
降维的⽅法
聚类的⽅法
基于神经⽹络的表⽰⽅法
NNLM
CBOW
Skip-gram
GloVe
ELMo
GPT
BERT
⽬录
本博客总结到2014年GloVe,全部都是对于word embedding的总结,近写年的⽂本表⽰总结会在下篇呈现。
⼀、⽂本离散表⽰
1.1 ⽂本离散表⽰:one-hot
1.2 ⽂本离散表⽰:词袋模型与TF-IDF
1.2.1 词袋模型(bag of words)
这个很简单就少⽤些笔墨
词袋模型是⼀种⾮常经典的⽂本表⽰。顾名思义,它就是将字符串视为⼀个 “装满字符(词)的袋⼦” ,袋⼦⾥的 词语是随便摆放的。⽽两个词袋⼦的相似程度就以它们重合的词及其相关分布进⾏判断。
词袋模型的优点
神奇之门1. 简单,⽅便,快速
2. 在语料充⾜的前提下,对于简单的⾃然语⾔处理任务效果不错。如⽂本分类。
词袋⼦模型的缺点
1. 其准确率往往⽐较低。凡是出现在⽂本中的词⼀视同仁,不能体现不同词在⼀句话中的不同的重要性。
2. ⽆法关注词语之间的顺序关系,这是词袋⼦模型最⼤的缺点。如“武松打⽼虎”跟“⽼虎打武松”在词袋
⼦模型中是认为⼀样的。
1.2.2 对词袋模型的改进:TF-IDF
不仅考虑词语是否出现,还考虑其出现的次数或者频率(TF)
“的”这个次占了词频的很⼤的⽐重,⽽它对确定⽂本信息⼏乎没什么⽤。所以我们应该忽略掉这些词,取消掉它们的影响。⼀种⽅法是维护⼀个停⽤词表。但这种⽅式太粗暴。
改进⽅式:⼀个词预测主题的能⼒越强(与主题的关联程度),权重越⼤,反之,权重越⼩。
在⽹页中看到“原⼦能”这个词,或多或少能够了解⽹页的主题,⽽看到“应⽤”⼀词,则对主题基本上还是⼀⽆所知。因此,“原⼦能”的权重应该⽐应⽤⼤。
容易发现,如果⼀个关键词只在很少的⽹页出现,通过它就容易锁定搜索⽬标,它的权重也就应该⽐较⼤。反正,如果⼀个词在⼤量的⽹页中出现,看到它仍然不清楚要找什么内容,因此它的权重应该⼩。
足彩玩法统计逆⽂档频率(IDF)
不仅考虑这个词在当下⽂本的出现的概率,还考虑出现该词语的⽂档占总⽂档出现的频率(DF)。
其基本假设是如果⼀个词语在不同的⽂档中反复出现,那么它对于识别该⽂本并不重要。如⾼频词“我们”、“那么”之类。
严格来说,逆⽂档频率的公式为-log(出现该词语的⽂档占总⽂档出现的频率)美不胜收近义词
这⾥具体不做TF-IDF的公式讲解。
⼆、⽂本分布式表⽰
我们刚刚讲了词向量的one-hot表⽰,包括词向量的其他表⽰新式,主要⽬的就是让计算机认识这些词。
究其根本你会发现,这些词向量的表⽰是开了⼀个极⾼维度的空间,然后每个词语都会占据⼀个维度,因此没有办法在空间中关联起来。因此我们可能可以把词向量的维度降低⼀些,在这样⼀个⼦空间中,可能原本没有关联的词就关联起来了。
所以基于矩阵⽅法的⽬标就是:把词向量的维度降低
2.1 基于矩阵
2.1.1 基于矩阵的SVD降维prospects
这是⼀种词向量的⽅法,我们⾸先会遍历所有的⽂本数据集,然后统计词出现的次数,接着⽤⼀个矩阵X来表⽰所有的次数情况,紧接着对X进⾏奇异值分解得到⼀个的分解。然后⽤U的⾏(rows)作为所有词表中词的词向量。
基于窗⼝的共现矩阵X:
把矩阵?X记录的词频变成⼀个相关性矩阵。我们先规定⼀个固定⼤⼩的窗⼝,然后统计每个词出现在窗⼝中次数,这个计数是针对整个语料集做的。可能说得有点含糊,咱们⼀起来看个例⼦,假定我们有如下的3个句⼦,同时我们的窗⼝⼤⼩设定为1(把原始的句⼦分拆成⼀个⼀个的词):
1. I enjoy flying.
2. I like NLP.
3. I like deep learning.
由此产⽣的计数矩阵如下:
然后我们对X做奇异值分解,观察观察奇异值(矩阵的对⾓元素),并根据我们期待保留的百分⽐来进⾏截断(只保留前k个维度)对X采⽤奇异值分解,再通过选择前K个奇异向量来进⾏降维:解方程六年级
百度识图在线基于矩阵的SVD降维能够充分地编码语义和句法的信息,但同时也带来了其他的问题:
矩阵的维度会经常变化(新的词语经常会增加,语料库的⼤⼩也会随时变化)。
矩阵是⾮常稀疏的,因为⼤多数词并不同时出现。
咖啡鼠矩阵的维度通常⾮常⾼(≈10的6次⽅)
训练需要?(?平⽅)的复杂度(⽐如SVD)
需要专门对矩阵X进⾏特殊处理,以应对词组频率的极度不平衡的状况
当然,有⼀些办法可以缓解⼀下上述提到的问题:
忽视诸如“he”、“the” 、“has”等功能词。
应⽤“倾斜窗⼝”(ramp window),即:根据⽂件中词组之间的距离给它们的共现次数增加相应的权重。
使⽤⽪尔森的相关性(Pearson correlation),将0记为负数,⽽不是它原来的数值。
不过缓解终归只是缓解,不能根本的解决这些问题,这也就是我们马上要提到的基于神经⽹络的⽅法。
2.1.1 基于矩阵的聚类⽅法
因为基于矩阵的聚类⽅法,现在基本不⽤了,我就不总结了,上个图,⼤家了解下降维。
2.2 基于神经⽹络的表⽰⽅法
现在我们退后⼀步,来尝试⼀种新的⽅法。在这⾥我们并不计算和存储全局信息,因为这会包含太多⼤型数据集和数⼗亿句⼦。我们尝试创建⼀个模型,它能够⼀步步迭代地进⾏学习,并最终得出每个单词基于其上下⽂的条件概率。
2.2.1 神经⽹络语⾔模型(NNLM)
这种⽅法能让我们有⾮常显著的进步。考虑到前⾯ “词-词”矩阵的情况,我们⾄少可以算出两个词语共
同出现的概率。但是,旧话重提,这仍然要求储存和计算⼀个⾮常的⼤数据集⾥⾯的全部信息。 现在我们理解了“分词序列”的概率(其实就是N-gram语⾔模型啦),让我们观察⼀些能够学习到这些概率的例⼦。
2.2.2 word2vec:CBOW(连续词袋模型)
三国币
Word2Vec模型中,主要有Skip-Gram和CBOW两种模型。
从直观上理解,Skip-Gram是给定input word(中间的词)来预测上下⽂。CBOW是给定上下⽂,来预测input word(中间的词)
图形理解CBOW:
我们把整个过程拆分成以下⼏步:
总结下特点:
2.2.2 CBOW:层次Softmax和负例采样
我们再次观察⼀下步骤,特别是步骤5,注意到对整个单词表|V|求softmax的计算量是⾮常巨⼤的,任何⼀个对⽬标函数的更新和求值操作都会有O(|V|)的时间复杂度。我们需要⼀个思路去简化⼀下,我们想办法去求它的近似。
CBOW:层次Softmax
在机器学习中,如果要输出特征的预测结果中的重要性,会⽤到树模型,因为树在选择分裂的时候,就是选择包含的信息量⼤的特征进⾏分裂的。这⾥运⽤了HUffman Tree.
使⽤Huffman Tree ,原本我们计算的是10^8的概率向量,但是现在就可以转换为⼀个⼆分类问题,⼆分类中最简单的直接的就是LR模型的,假设Xw就是⼀个词向量表⽰,在每个⾮叶⼦节点处(途中黄⾊的圆点)还会有⼀个参数θwi,那我们的在LR中可以⽤⼀个sigmoid函数来映射,最后变成⼀个最⼩化损失函数的优化问题。
特点:
1. 使⽤Huffman tree 来编码输出层的词典