【NLP】概览 - hippowc/hippowc.github.io GitHub Wiki
nlp问题概述
NLP都有哪些问题
NLP,或者更精确地表达为文本挖掘,则是从文本数据出发,来尽可能复原人们的感知世界
- 文本-表示:NLP文本表示;
- 文本-感知世界:词汇相关性分析、主题模型、意见情感分析等;
- 文本-真实世界:基于文本的预测等;
其中文本表示是其他所有模型建构的基础
为什么要进行文本表示
特征提取的意义在于把复杂的数据,如文本和图像,转化为数字特征,从而在机器学习中使用。在机器学习项目中,不管是纯NLP问题还是NLP问题和非文本类混合数据的场景,我们都要面临一个问题,如何将样本集中的文本进行特征表征以及通过向量的方式表达出来。
语言模型
语言模型本质上是在回答一个问题:出现的语句是否合理
语言模型发展历史
在历史的发展中,语言模型经历了专家语法规则模型(至80年代),统计语言模型(至00年),神经网络语言模型(till now)。
-
专家语法规则模型 专家语法规则模型在计算机初始阶段,随着计算机编程语言的发展,归纳出的针对自然语言的语法规则。但是自然语言本身的多样性,口语化,在时间,空间上的演化,及人本身强大的纠错能力,导致语法规则急剧膨胀,不可持续。
-
统计语言模型 统计语言模型用简单的方式,加上大量的语料,产生了比较好的效果。统计语言模型通过对句子的概率分布进行建模,从统计来来说,概率高的语句比概率底的语句更为合理。
在实现中,通过给定的上文来预测句子的下一个词, 如果预测的词和下一个词是一致(该词在上文的前提下出现的概率比其它词概率要高),那么上文+该词出现的概率就会比上文+其他词词的概率要更大,上文+该词更为合理。
- 神经网络语言模型 神经网络语言模型在统计语言模型的基础上,通过网络的叠加和特征的逐层提取,可以表征除了词法外,相似性,语法,语义,语用等多方面的表示。
统计语言模型
统计语言模型是“单个字母/单词/词序列”的概率分布,假设有一个 m 长度的文本序列,统计语言模型的目的是建立一个能够描述给定文本序列对应的概率分布。
统计语言模型从统计(statistic)的角度预测句子的概率分布,通常对数据量有较大要求。
假设 S 表示某一个有意义的句子,S 是由一连串特定顺序排列的词 w1,w2,,,wn 组成,这里n是句子的长度,那么我们怎么获取句子 S 在一个语言模型中的概率 P(S)?
最简单的方法是建立一个无比庞大的语料库,该语料库中包含了人类成百上千年间可能讲过的所有的话,就可以通过统计知道这句话的概率了,但是这种方法行不通
那么这时候就可以使用概率论的一些知识:要计算P(S),S是一个序列:w1,w2,,,wn,那么P(S) = P(w1,w2,,,wn) = P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,,,wn-1),随着n增大计算会越来越难,P(wn|w1,w2,,,wn-1)几乎计算不出来,肿么办?
- 马尔可夫假设
- 每当遇到这种情况时,就假设任意一个词 wi 出现的概率只同它前面的词 wi-1 有关,这就是很有名的马尔可夫假设。
基于此思想,n-gram模型诞生
- n-gram
- 出现在第 i 位上的词 wi 仅与它前面的(n-1)个历史词有关。
- 实际中, n=3是最常见的情况。n过小,产生的概率不够准确,n过大,计算量太大。
当n过大时仍会被数据的稀疏性严重影响,实际使用中往往仅使用bigram或trigram。谷歌的统计翻译系统罗塞塔率先使用n-gram=4获得当时市场上最好的性能。
独立同分布假设:所有字符间都独立同分布的的统计语言模型
独立同分布假设是对马尔科夫假设的进一步,即假设所有字符之间连前序关系都不存在,而是一个个独立的字符,这和朴素贝叶斯的独立同分布假设本质上在思想上是一致的,都是通过增加先验约束,从而显著减小参数搜索空间。
词袋bow统计语言模型基本定义
词袋模型,顾名思义,把各种词放在一个文本的袋子里,即把文本看做是无序的词的组合。利用统计语言模型来理解词序列的概率分布。文本中每个词出现的概率仅与自身有关而无关于上下文。这是对原始语言模型公式的最极端的简化,丢失了原始文本序列的前序依赖信息。
对于一个文档(document),忽略其词序、语法、句法,将其仅仅看做是一个词集合,或者说是词的一个组合,文档中每个词的出现都是独立的,不依赖于其他词是否出,即假设这篇文章的作者在任意一个位置选择一个词汇都不受前面句子的影响而独立选择的。这是一种非常强的假设,比马尔科夫假设还要强。
词库表示法合理性依据
词库模型依据是:存在类似单词集合的文章的语义同样也是类似的
局部与整体分布假设:TF-IDF(Term Frequency-Inverse Document Frequency)表示法
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。
TF-IDF产生的特征向量是带有倾向性的,主要可以被用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF属于BOW语言模型的一种,但是在基础的词频统计之上增加和单个词和全局词集的相对关系。同时,TF-IDF也不关注词序信息,TF-IDF同样也丢失了词序列信息。
TF-IDF的加权词频统计思想
如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类,也即可以作为所谓的关键字。在词频的基础上,要对每个词分配一个"重要性"权重,这个权重叫做"逆文档频率"(Inverse Document Frequency,缩写为IDF),它的大小与一个词的常见程度成反比,它的作用是对原始词频权重进行反向调整。知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。
神经网络语言模型(neural network language model, NNLM)(2003年)
分布式表征(distributed representation)词向量概念
NNLM 最早由Bengio系统化提出并进行了深入研究,代替ngram使用离散变量(高维),采用连续变量(具有一定维度的实数向量)来进行单词的分布式表示,解决了维度爆炸的问题,同时通过词向量可获取词之间的相似性。
传统的词频统计模型是one-hot类型的,每个词都是一个 |V| 长度的且只有一位为1,其他位都为0的定长向量。每个词向量之间都是完全正交的,相关性为0。虽然可以实现对原始语料进行编码的目的,但是对不同的词之间的相似性、语法语义的表征能力都很弱。
从线性代数角度来看,神经网络的隐藏层接受输入层向量,经过权重系数矩阵对应的线性变换(linear transformation)之后,原始的输入向量被变换到了另一个向量空间中。通过末端损失函数的BP负反馈,反过来不断调整隐层系数矩阵对应的向量空间的概率分布,最终当损失函数收敛时,隐藏层的系数矩阵对应的向量空间的概率分布是“最有利于”预测值靠近目标函数的。这点其实并不难理解,只是我们在学习神经网络初期可能更关注的是神经网络末端的输出层,毕竟输出层才是我们要的二分类/多分类/概率预测的有用结果,而对训练结束后,隐藏层到底长什么样并不十分关心。
可以看到,隐藏层会朝什么方向调整,取决于神经网络末端的损失函数。如果我们的用一个表达语法语义结构的概率似然函数来作为损失函数进行BP优化,则可以想象,训练收敛后,隐藏层的概率分布会趋向于和语料集中的语法语义结构同构。
word embedding 词嵌入
基于神经网络的分布表示又称为词向量、词嵌入,神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。
Embedding在数学上表示一个maping, f: X -> Y, 也就是一个function,其中该函数特点:
- injective:单射函数,每个Y只有唯一的X对应,反之亦然
- structure-preserving :结构保存,比如在X所属的空间上X1 < X2,那么映射后在Y所属空间上同理 Y1 < Y2
对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。word embedding,就是找到一个映射或者函数,生成在一个新的空间上的表达,该表达就是word representation
用似然函数来表征语言模型的条件概率 - 语法语义结构表征
语言模型本质上是一个概率分布模型 P ,对于语言里的每一个字符串 S 给出一个概率 P(S) 。假设有一个符号的集合 {w} ,我们不妨把每一个 w_i 称作一个“单词”,由零个或多个单词连接起来就组成了一个字符串 S = w_1w_2 ... w_n ,字符串可长可短,例如实际语言中的句子、段落或者文档都可以看作一个字符串。
举一个例子:假设我们的语料只有一句话:我爱祖国 如果用传统语言模型,对应的联合概率分布就是:P(我,爱,祖,国) = P(我 | start)+ P(爱 | 我)+ P(祖 | 爱,我)+ P(国 | 祖,爱,我)
加入马尔科夫假设后,即只考虑一个ngram范围内的前序词,对应的联合概率分布就是(以2-gram为例):P(我,爱,祖,国) = P(我 | start)+ P(爱 | 我)+ P(祖 | 爱)+ P(国 | 祖)
条件概率如何计算
如果是统计语言模型,条件概率是通过统计对应的ngram词序列的出现次数来计算的,也就是词频
神经网络不再使用词频来作为统计工具,而是直接基于似然函数(例如tahn、sigmoid)来计算条件概率。我们可以有一个函数可以直接得到语句对应的【0,1】值域内的概率值,只是需要通过学习的过程调整函数的参数值
NNLM实现
- 输入层 这里所谓的ngram neural,通俗的解释是说神经网络的输入层是ngram的形式。每个输入会有一组ngram词序列,然后会有多个输入
- 全连接隐层 - 词向量矩阵层 接下来,需要定义词向量嵌入空间(embedding空间)的维度,
TODO:https://www.cnblogs.com/LittleHann/p/7200618.html#_lab2_1_0
其他
LSA - 一种基于SVD矩阵奇异值分解的语义分析语言模型
文本分类中常出现的问题 - 歧义与多义
- 一词多义
- bank 有银行或者河岸的意思
- 一义多词
- 用户搜索“automobile”,即汽车,从词义层面上讲,用户可能对包含“car”单词的页面也感兴趣
LSA(Latent Semantic Analysis)基本介绍
潜在语义分析LSA(Latent Semantic Analysis )也叫作潜在语义索引LSI( Latent Semantic Indexing ) 顾名思义是通过分析文章(documents )来挖掘文章的潜在意思或语义(concepts )。
不同的单词可以表示同一个语义,或一个单词同时具有多个不同的意思,这些的模糊歧义是LSA主要解决的问题。
最小语义子集
简单来说,LSA做的事是降维,通过对语料库中的海量单词进行降维,在语料库中找出一个最小的语义子集( smallest set of concepts),这个最小语义子集就是新的词向量集合。
词-文档矩阵(Occurences Matrix) - 将原始document转换为词频统计稀疏矩阵
LSA 使用词-文档矩阵来描述一个词语是否在一篇文档中。词-文档矩阵的元素是该词在文档中的出现次数(词库表示法),也可以是是该词语的TF-IDF。
SVD奇异值矩阵分解 - 降维
在构建好词-文档矩阵之后,LSA将对该矩阵进行降维,来找到词-文档矩阵的一个低阶近似。
奇异值分解是一个有着很明显的物理意义的方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域,是很多机器算法的基石。
在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。