赞
踩
在介绍N-gram之前,先感受一下“联想”的过程。例如当我说怕上火时,你给出的下一个词可能就是王老吉,而不是可口可乐。N-gram正是基于这样的想法,它的特点是某个词的出现依赖于其他若干个词。可以说我们每个人的大脑中都有一个N-gram模型,且在不断训练和完善。我们的见识在丰富我们的阅历,增强我们的联想能力。
N-gram模型属于概率语言模型(基于概率判别),其要解决的问题是从是否符合自然语言的角度评估一个句子的质量。在这个问题中,句子W被建模成词的排列 ,所谓质量就是句子出现的概率,也即该排列出现的联合概率。
简单来说,输入是一句话(单词顺序序列),输出是这句话的概率。但要计算概率要么通过概率密度函数,要么用统计概率近似。自然语言的概率密度函数我们肯定无法知道,于是就用统计概率。因此必须要有一个自然语言的样本库,里面包含了大量的自然语言的句子实例,在N-gram模型中用到的便是语料库。
那如何通过语料库来计算句子出现的概率呢?这就涉及到马尔可夫性的假设,即当前词出现的概率 仅与前N-1个词有关,这里的N就对应N-gram里面的N。所以N-gram模型的构建只需要计算出所有的N以内的条件概率即可,例如常用的Tri-gram,句子w的出现概率就简化为:
可以看到当N增大时,需要计算的概率将会大大增多,其计算量几乎是与N成指数关系的增长(因为每多考虑一阶,每个词都大约需要多考虑M个“新的概率”)。谷歌当初使用的N=4的语言模型需要500台以上的服务器进行存储,这是不可想象的。而且即使N取的再大,也无法完全覆盖后文对前文的依赖关系,语言的上下文联系可以跨度很大,而N的增长对计算量增大带来的压力完全无法满足这种大跨度的上下文联系。
· 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为Bi-gram:
· 如果一个词的出现仅依赖于他前面出现的两个词,那么我们就称之为Tri-gram:
N-gram的N可以取很大,然而现实中一般Bi-gram和Tri-gram就够用了。
N-gram本身也指一个由N个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有Bi-gram(N=2)和Tri-gram(N=3),一般已经够用了。例如 I love deep learning 这句话,可以分解的Bi-gram 和 Tri-gram:
Bi-gram:{I,love},{love,deep},{deep,learning}
Tri-gram:{I,love,deep},{love,deep,learning}
那么如何计算其中的每一项条件概率 呢?答案是极大似然估计,说人话就是数频数:
具体的,以Bi-gram为例,我们有下图这样三句话组成的语料库,容易统计,“I"出现了3次,”I am“出现了2次,因此能计算概率P(am|I)=2/3。
同理还可计算出以下概率:
P(I| <s> )=0.33 P(Sam|am)=0.5 P(<s>|Sam)=0.5 P(do|I)=0.33 P(not|do)=1 P(like|not)=1
再展示一个《Language Modeling with Ngrams》中的例子,从加州一个餐厅的数据库中做了一些统计。
据统计,有P(I| <s>)=0.25,P(<s>|food)=0.68,于是
P(<s> I want chinese food <s>) = 0.25 x 0.33 x 0.0065 x 0.52 x 0.68 = 0.0001896
我们算出了”I want chinese food"这句话的概率,但有时候这句话会很长,那么概率(都是小于1的常数)的相乘很可能造成数据下溢(downflow),即很多个小于1的常数相乘会约等于0,此时可以使用log概率解决。
首先最容易出现的就是数据稀疏问题,有些词或词组在语料库中可能出现的很少甚至没有出现过,这就会导致该低频词或词组在计算概率时得到非常小的概率,从而导致估计不可靠。
解决数据稀疏最直接的想法就是增大语料库的规模,但是其问题也很明显,增加的语料库中占主体的仍然是高频词。因此要进行数据平滑,数据平滑的目的有两个:使所有的N-gram概率之和为1和使所有的N-gram概率都不为0。它的本质是重新分配整个概率空间,把已经出现过的N-gram概率降低,补充给未曾出现过的N-gram。
总的来说,处理数据稀疏的方法有拉普拉斯平滑、内插与回溯等。
N-gram模型其实就是基于最朴素的现在与历史相关的思想来进行词句的评估,具备良好的可解释性。这种基于统计概率来处理自然语言的方法也撼动了基于语法规则的传统方法的地位,甚至改变自然语言处理的研究方法。
但是其不足也很明显,除了数据稀疏这个模型本身存在的问题,N-gram的假设也是有问题的。首先,只考虑单向的相关性显然会丢失掉部分信息,基于N-gram模型进行空缺词填补的话,其总是会倾向于更高出现率的词,且对后续词与缺失词的相关性无法利用。其次,仅从概率的角度,不考虑词本身的相似性,将会丢失更多的语义信息,例如近义词的概率可能会相去甚远。
此外,N-gram 的训练是很挑数据集的,你要训练一个问答系统,就要用问答的语料库来训练;要训练一个金融分析系统,就要用类似于华尔街日报这样的语料库。
# NNLM 是N-gram的进化版,RNNLM 是NNLM的进化版。
(1)词性标注
(2)垃圾短信分类
(3)分词器
(4)机器翻译和语音识别
N-gram一个常见应用就是搜索引擎或输入法的提示。例如你在使用谷歌搜索时,输入一个或几个词语后,搜索框会以下拉菜单的形式给出几个你想输入词语序列的预测。当使用输入法打字时,打出一个字或词后,输入法也会给出你想输入下一个词的预测。
那么原理是什么呢?即当我们打出“我们”的时候,下面的“不一样”、“的爱”等是怎么出来的?又是怎么排序的?实际上是根据语言模型得出。假如使用的是二元语言模型预测下一单词。排序的过程就是:P("不一样"|"我们") > P("的爱"|"我们") > P("相爱吧"|"我们") > ... >P("这一家"|"我们”),
这些概率值的求法和上面提到的完全一样,数据的来源可以是用户搜索的log。
# 有关N-gram的详细内容可参考https://blog.csdn.net/songbinxu/article/details/80209197以及https://blog.csdn.net/liuyider/article/details/115666212
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种常用于文本处理的统计方法,可以评估一个单词在一份文档中的重要程度。简单来说就是可以用于文档关键词的提取。
那么计算机如何辨别关键词呢?脑海中首先想到的可能是对单词出现的次数进行统计,也就是词频。但如果一个单词在文中出现的频率很高,那么是否可以认为这个单词是文章的关键词呢?其实不一定,词频比较高的词往往更可能是一些没有意义的停用词,例如“我”、“的”、“了”等等。与此同时,文章中出现次数很少的单词也不一定是不重要的词。
从TF-IDF的名称来看,该算法由两部分组成,即TF和IDF。因此,TF-IDF的基本思想是:如果某个词语在一篇文章的出现频率很高,同时在其他文章很少出现,则认为该词语大概率是一个关键词。
(1)TF(词频):单词w在文档d中出现的概率。
TF(d,w) = 单词w在文档d中出现的次数 / 文档d的总词数
(2)IDF的思路:若一个单词在多个文档中出现,则意味着该单词的重要性不高,反之则意味该单词的重要性很高。
IDF(w) = log(语料库中的文档总数 / 包含单词w的文档数)
文档数量越大,同时单词出现在越少的文档中,IDF值就越大,则说明单词越重要。上述的IDF公式在一些特殊情况可能会有一些小问题,比如某一个生僻词在语料库中没有出现过,则包含单词w的文档数为0(即分母为0),于是IDF就无意义了。所以常用的IDF需要做平滑处理,使得没有在语料库中出现的单词也可以得到一个合适的IDF值。例如常见IDF平滑公式有:
最终,单词w的TF-IDF计算公式为:
一个单词的TF-IDF值越大,意味着该单词越重要。
在文本处理中,我们通常需要从大量的文本数据中提取关键信息,例如文本的主题、重要性和关键词等。TextRank算法就是一种用于从文本中提取关键信息的算法。具体来说,TextRank是一种用于文本摘要和关键词提取的图形化模型。该算法由Mihalcea和Tarau于2004年提出,是基于PageRank算法的改进版本。
TextRank算法的核心是一个图形化模型,其中每个节点表示一个词语,每条边表示两个词语之间的关系。在TextRank算法中,每一个节点都有一个初始的权重值,然后通过迭代计算不断更新节点的权重值,直到收敛为止。更新节点权重的过程中,会考虑节点与其他节点之间的关联,以及它们之间的权重值。
在计算节点权重时,TextRank算法使用了PageRank算法中的迭代计算方法。在每次迭代中,将已有节点的权重值按照他们与其他节点之间的关系进行更新。权重值的更新方式可以根据具体的应用场景而定,例如可以使用简单的加权求和或者是更复杂的公式。
(1)数据预处理。首先需要将文本进行数据预处理,包括分词、去除停用词、词性标注等步骤。
(2)构建图形化模型。该步骤将预处理后的文本转换成图形化模型,并构建节点和边之间的关系。
(3)计算节点权重。计算节点的权重值,并按照权重值进行排序,以找出最重要的节点。
(4)提取关键信息。根据节点的权重值,提取文本中的关键信息,例如关键词、摘要等。
优点:
· 考虑语境信息。在处理长片文本时,其效果要好于传统的基于统计的算法。
· 可扩展型强。可处理大规模数据集。
缺点:
· 对数据质量要求较高。TextRank算法需要干净、高质量的数据,因为它需准确地检测词语,并构建节点与边之间的关系。
· 对参数敏感。TextRank算法的效果受到阻尼系数等参数的影响,这些参数必须经过调整才能获得最佳性能。但是,这也意味着TextRank算法对参数敏感。
TextRank算法是一种用于文本处理的算法,可以根据节点与节点之间的权重关系来提取文本中的关键信息。该算法使用了图形化模型和迭代计算方法来更新节点的权重值。
什么是主题模型?
主题模型就是一种自动分析每个文档,统计文档中的词语,根据统计的信息判断当前文档包含哪些主题以及各个主题所占的比例各为多少。
直观来讲,如果一篇文章有一个中心思想,那么一定存在一些特定词语会出现的比较频繁。例如,现在有一篇文章是讲苹果公司的,那么“乔布斯”和iphone“等词语出现的频率就会高一些。如果文章是描述微软公司的,那么”windows“和”Microsoft“等词语出现的频率就会高一些。
但真实情况下,一篇文章中通常包含多种主题,而且每个主题所占的比例各不相同,比如一篇文章10%和苹果公司有关,90%和微软公司有关,那么和微软有关的关键字出现次数应该是苹果关键字出现次数的9倍。
LDA其实有两种含义,一种是线性判别分析,一般用来为后续的分类问题做数据的降维处理。另一种便是本篇介绍的主题模型,被称作隐狄利克雷分布(Latent Dirichlet Allocation),是一种概率主题模型。
LDA是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而可以根据主题(分布)进行主题聚类或者文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,不考虑词与词之间的顺序关系。此外需要认识到,一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。
LDA主题模型要干的事就是:根据给定的一篇文档,反推其主题分布。
在LDA主题模型中,一篇文档的生成方式如下:
- 从狄利克雷分布中取样生成文档i的主题分布 ;
- 从主题的多项式分布 中取样生成文档 i 中第 j 个词的主题 ;
- 从狄利克雷分布中取样生成主题 对应的词语分布;
- 从词语的多项式分布 中采样最终生成词语。
LDA主题模型的图模型结构如下图所示:
在详细理解LDA主题模型前,需要回顾一些分布知识和认识三个基础模型(Unigram model、Mixture of unigrams model、pLSA)。
先介绍一些基础模型,再过渡到LDA主题模型。
pLSA模型介绍
pLSA生成文档的过程:选定文档生成主题,确定主题生成词。
在这个过程中,我们并未关注词和词之间的出现顺序。因此,pLSA是一种词袋方法。
根据文档反推其主题:
上图中,文档 d和词 w是我们得到的样本,可观测得到,所以对于任意一篇文档,其 是已知的。(可见在pLSA模型中:样本随机,参数虽未知但固定,所以pLSA属于频率派思想。而在LDA中:样本固定,参数未知但不固定,是个随机变量,服从一定分布,因此LDA属于贝叶斯派思想)
从而可以根据大量已知的文档-词项信息 ,训练出文档-主题 和主题-词项,如下公式所示:
故得到文档中每个词的生成概率为:
由于 可以事先计算求出,而 和 未知,所以 就是我们要估计的参数值。通俗地讲,就是要最大化这个。
用什么方法进行估计呢?常用的参数估计方法有极大似然估计MLE、最大后验证估计MAP、贝叶斯估计等等。因为待估计的参数中含有隐变量z,所以我们可以考虑EM算法。
E-step:假定参数已知,计算此时隐变量的后验概率。
M-step:带入隐变量的后验概率,最大化样本分布的对数似然函数,求解相应的参数。
熟悉凸优化,一般处理这种带有约束条件的极值问题,常用的方法便是拉格朗日乘数法,即通过引入拉格朗日乘子将约束条件和多元(目标)函数融合到一起,转化为五约束条件的极值问题。
综上,在pLSA中:
- 由于 和 未知,所以我们用EM算法去估计 这个参数的值。
- 而后,用 表示词项 出现在主题 中的概率,即 ,用 表示主题 出现在文档 中的概率,即 。从而把 转换成了”主题-词项“(主题生成词)矩阵,把 转换成了”文档-主题“(文档生成主题)矩阵。
- 最终求解 和 。
有了前面对于pLSA模型的认识可以更容易理解LDA主题模型。因为LDA主题模型就是pLSA模型的贝叶斯版本。
换言之,LDA在pLSA的基础上给这两参数() 加了两个先验分布的参数(贝叶斯化):一个主题分布的先验分布Dirichlet分布,和一个词语分布的先验分布Dirichlet分布。
综上,LDA真的就是pLSA的贝叶斯版本。文档生成后,两者都要根据已知文档去推断其主题分布和词语分布(即两者的本质都是为了估计给定文档生成主题,给定主题生成词语的概率),只是用的参数推断方法不同,在pLSA中用极大似然估计的思想取推断两未知的固定参数,而LDA则把这两参数看成随机变量,且加入Dirichlet先验。
所以,pLSA跟LDA的本质区别就在于它们去估计未知参数所采用的思想不同,前者用的是频率派思想,后者用的是贝叶斯派思想。
频率派与贝叶斯派各自不同的思考方式:
频率派把需要推断的参数看作是固定的未知常数,即概率虽然是未知的,但最起码是确定的一个值。同时,样本x是随机的,所以频率派重点研究样本空间,大部分的概率计算都是针对样本x的分布。
而贝叶斯派的观点则截然相反,他们认为待估计的参数是随机变量,服从一定的分布,而样本x是固定的,由于样本是固定的,所以他们重点研究的是参数的分布。
假设我们周末要去一朋友家:
- 按照频率派的思想,我估计他在家的概率是1/2,不在家的概率也是1/2,是个定值。
- 而按照贝叶斯派思想,他是否在家的概率不再是个定值1/2,而是随机变量。比如按照我们的经验周末放假,猜测他在家的概率为0.6,但这个0.6不是说就是完全确定的,也有可能是0.7。如此,贝叶斯派无法确切给出参数的确定值(0.3,0.4,0.5,0.6,0.7,0.8等都有可能),但至少明白在哪些范围或哪些取值更有可能(例如0.6,0.7,0.8),哪些范围或取值不太可能(0.3,0.4)。进一步,在贝叶斯估计中,参数的多个估计值服从一定的先验分布,而后根据实验的数据(例如周末不断跑他家)不断修正之前的参数估计,从先验分布慢慢过渡到后验分布。
在LDA中,主题分布和词分布本身都是多项分布,而前面介绍的可知”Dirichlet分布是多项式分布的共轭先验概率分布”,因此选择Dirichlet分布作为它们的共轭先验分布。意味着为多项分布的参数p选取的先验分布是Dirichlet分布,那么以p为参数的多项分布用贝叶斯估计得到的后验分布仍然是Dirichlet分布。
由于LDA把要估计的主题分布和词分布看作其先验分布是Dirichlet分布的随机变量。所以,在LDA这个估计主题分布、词分布的过程中,它们的先验分布(即Dirichlet分布)事先由人为给定,那么LDA就是要去求它们的后验分布(LDA中可用gibbs采样去求解它们的后验分布,得到期望,。
参考博文:
自然语言处理NLP中的N-gram模型_如何用n-gram来评价长短句子的自然程度-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。