NLP基础知识和总结

一个流行的自然语言处理库,有自己的语料库,有分类、分词等多种功能,多为国外用户使用,类似于中文的街霸处理库。

为单词序列分配概率的模型称为语言模型。

一般来说,语言模型是可以计算任意单词序列是句子的概率的模型。或者语言模型可以预测单词序列中的下一个单词是什么。

** n元语言模型**

N-gram模型是一种典型的统计语言模型,是一种基于概率的判别模型。统计语言模型将一种语言(一个词序列)视为一个随机事件,并给出相应的概率来描述它属于某个语言集合的可能性。给定一个词汇集v,对于v中的一个单词序列,S =?w1,,wT?∈ Vn,统计语言模型给这个序列一个概率P(S)来衡量S符合自然语言的语法和语义规则的置信度。简单来说,统计语言模型就是这样一个计算句子概率的模型。

N-gram模型可以缓解单词序列没有出现在训练集中所带来的问题,即数据稀疏问题。

n元模型问题

这两页ppt很清楚n-gram模型的问题。

N-gram模型是基于这样的假设:当前单词的出现只与前面的N-1个单词相关,而与其他任何单词无关,整个句子的概率是每个单词出现概率的乘积。这些概率可以通过直接从语料库中计数n个单词同时出现的次数来获得。通常使用二元二元语法(N=2)和三元语法(n = 3)。二元语法满足马尔可夫假设。

常用的N元模型有二元模型和三元模型。它们表示如下:

二元语法:P(T)= P(w 1 | begin)P(w2 | w 1)P(w3 | w2)* * * P(wn | wn-1)

三元组:P(T)=p(w1|begin1,begin2) p(w2|w1,begin 1)P(w3 | w 2w 1)* * * P(wn | wn-1,wn-2)

注意上面概率的计算方法:P(w1|begin)=所有以w1开头的句子/句子总数;P (w2 | w1) = w1,w2同时出现的次数/w 1出现的次数。诸如此类。

对于这些计算,请给出一个例子:

从上面可以看出,双字母计算公式中的begin一般要加上一个

N元语法中存在的问题:

举少量例子说明:假设我们有一个语料库(注意语料库),如下:

老鼠真的很讨厌。老鼠很丑。你爱你的妻子,我讨厌老鼠。

我想预测一下“我爱老”这句话的下一个字。我们分别使用二元模型和三元模型进行预测。

1)通过bigram,需要计算P(w| Lao)。据统计,“老鼠”出现3次,“老婆”出现1次。通过最大似然估计,P(老鼠|老)=0.75,P(老太婆|老)=0.25。

2)通过三元模型,表示计算P(w|爱老)。据统计,仅《爱妻》就出现了1次。通过最大似然估计,P(女|爱老)=1,所以我们通过三元模型预测的整句话是:我爱我老婆。显然,这样的预测结果更合理。

问题1:随着N的提高,我们有了更多的前信息,可以更准确的预测下一个单词。但这也带来了一个问题。当N过大时,容易出现这样的情况:有些N元图从未出现过,导致很多预测概率结果为0,这就是稀疏性问题。在实际使用中,经常只使用二元模型或三元模型。(这个问题可以通过平滑来缓解。参考:/s/nvwb9h71 juifyl _ or _ ENA)

问题二:同时,由于最后的稀疏问题,N-gram无法获得上下文的长期依赖关系。

问题三:n-gram基于频率做统计,泛化能力不足。

N-gram总结:统计语言模型是计算一个句子的概率值,整个句子的概率是每个单词出现概率的乘积。概率值越大,句子越合理。N-gram是一个典型的统计语言模型,它做出一个假设,即当前词的出现只与前N-1个词相关,而与其他任何词无关,整个句子的概率是每个词出现概率的乘积。这里面有很多问题。在计算每个词的概率时,随着n的增加,可以有更多的先验信息,可以使当前词的预测更加准确。但是n太大就会出现稀疏,导致很多词的概率值为0。为了解决这个问题,通常使用二元模型或三元模型,这导致了N元模型的长期依赖。另一方面,N-gram仅仅基于频率统计,不具备足够的泛化能力。

神经网络语言模型

Bengio在2003年提出,神经网络语言模型(NNLM)的思想是提出词向量的概念,用离散变量(高维)代替ngram,用连续变量(具有一定维数的实向量)分布式表示词,解决了维数爆炸的问题,同时通过词向量可以得到词之间的相似度。

结合下图可以看出,它建立的语言模型的任务是在窗口大小上根据上面预测下一个单词,所以从另一个角度来说,它是一个神经网络编码的n-gram模型。

它是最简单的神经网络,仅由四层组成:输入层、嵌入层、隐含层和输出层。(从另一个角度来看,它是一个使用神经网络编码的n元模型。)

输入是单词序列的索引序列。例如,单词“this”在字典(大小为∣V∣)中的索引是10,单词“yes”的索引是23,“test”的索引是65,因此句子“this is a test”通过了窗口大小内的“this is a test”预测“try”。嵌入层是一个大小为∣V∣×K的矩阵(注:k的大小是自己设定的,这个矩阵相当于一个随机初始化的词向量,会在bp中更新,这部分是神经网络训练完成后的词向量),取出10,23,65行向量组成一个3×K矩阵。隐层接受拼接嵌入层的输出作为输入,以tanh作为激活函数,最后用softmax发送到输出层。输出概率被优化以最大化要预测的字的相应softmax值。

缺点:由于语言模型采用前馈神经网络训练,明显的缺点是里面的参数太多,softmax的计算量太大。另一方面,NNLM是神经网络直观编码的n元模型,无法解决长期依赖的问题。

RNNLM

它通过RNN及其变体网络来训练语言模型,它的任务就是通过上面的来预测下一个单词。与NNLM相比,它具有使用RNN的优势,后者在处理序列数据方面具有天然的优势。RNN网络打破了上下文窗口的限制,用隐含层的状态来概括所有的历史上下文信息。与NNLM相比,它能捕捉更长的依赖关系,在实验中取得更好的结果。RNNLM的超参数少,通用性更强;然而,由于RNN的梯度分散问题,很难捕捉更长距离的依赖信息。

Word2vec中的CBOW和skip-gram,其中CBOW通过窗口大小内的上下文预测中心词,而skip-gram则相反,通过输入的中心词预测窗口大小内的上下文。

Glove是一个统计语言模型,通过统计知识训练词向量。

ELMO使用多层双向LSTM(一般使用两层)来训练语言模型,其任务是利用上下文来预测当前单词。以上信息通过正向LSTM获得,以下信息通过反向LSTM获得。这种双向是一种弱双向,所以没有获得真实的上下文信息。

GPT通过Transformer训练语言模型,它训练的语言模型是单向的,所以它可以通过上面预测下一个单词。

伯特通过变形金刚训练MLM,一个真正的双向语言模型。它训练的语言模型是根据上下文来预测当前单词。

以上部分的详细介绍在NLP的前期培训文章中有提及

语言模型的评价指标

参考位置的方法,SVD)来找到矩阵的低阶近似。

概率潜在语义分析(PLSA)模型

概率潜在语义分析(PLSA)模型实际上是为了克服潜在语义分析(LSA)模型的一些缺点而提出的。LSA的一个根本问题是,虽然我们可以把U k和V k的每一列看成一个题目,但是由于每一列的值都可以看成是几乎无限的实值,我们无法进一步解释这些值意味着什么,也无法从概率的角度理解这个模型。

PLSA模型通过生成模型给了LSA一个概率性的解释。该模型假设每一个文档都包含一系列可能的潜在主题,文档中的每一个词都不是凭空产生的,而是在这些潜在主题的引导下,按照一定的概率产生的。

在PLSA模型中,主题实际上是一个词上的概率分布,每个主题代表一个不同词上的概率分布,每个文档可以视为一个主题上的概率分布。每个文档都是由这样的两级概率分布生成的,这是PLSA提出的生成模型的核心思想。

PLSA通过以下公式模拟了d和w的联合分布:

这个模型中的*z *数是一个需要提前给定的超参数。需要注意的是,上式中给出了P (w,d)的两个表达式。前一个公式中,*d *和w都是在给定*z *的前提下由条件概率生成的,它们的生成方法相似,所以是‘对称’的;后一个公式,先给d,然后根据P (z | d)生成一个可能的话题Z,再根据P (w| z)生成一个可能的单词W。因为这个公式中单词和文档的生成不相似,所以是‘不对称’的。

上图给出了PLSA模型中不对称板符号的表示。其中d代表文档,z代表文档生成的主题,w代表主题生成的单词。在这个模型中,D和W是观察变量,Z是未知变量(代表潜在话题)。

我们很容易发现,对于一个新文档,我们无法知道它对应的P (d)是什么,所以虽然PLSA模型是一个给定文档上的生成模型,但它不能生成一个新的未知文档。该模型的另一个问题是,随着文档数量的增加,P (z | d)的参数会线性增加,这就导致了无论训练数据有多少,模型都会出现过拟合问题。这两点成为了限制PLSA模型得到更广泛应用的两大缺陷。

潜在狄利克雷分析模型

为了解决PLSA模型中的过拟合问题,Blei等人提出了潜在狄利克雷分布(LDA)模型,该模型也成为主题模型研究领域中应用最广泛的模型。LDA是基于PLSA的贝叶斯框架,即LDA是PLSA的贝叶斯版本(正因为LDA是贝叶斯,所以需要考虑历史先验知识,增加两个先验参数)。

从上一节我们可以看到,在PLSA模型中,对于一个未知的新文档D,我们对P (d)一无所知,这实际上是不符合人类经验的。换句话说,它没有使用本来可以使用的信息,这部分信息就是LDA中所谓的先验信息。

具体来说,在LDA中,首先,每个文档被视为与有限数量的给定主题中的每一个都有或多或少的相关性,而这种相关性是通过主题上的概率分布来描述的,这实际上与PLSA是一致的。

然而,在LDA模型中,关于主题的每个文档的概率分布被赋予了先验分布,该先验分布一般用稀疏的Dirichlet分布来表示。狄利克雷先验的这种稀疏形式,可以看作是一种对人类进行编码的先验知识:一般来说,一篇文章的主题更多的是集中在少数几个主题上,很少会说一篇文章中同时涵盖了很多主题而没有明显的焦点。

另外,LDA模型也给出了一个话题在所有词上的概率分布的稀疏Dirichlet先验,其直观解释也是类似的:在单个话题中,大多数情况下,少量的词(与这个话题高度相关)会出现的频率很高,而其他的词出现的频率明显很低。这两个先验使得LDA模型能够比PLSA模型更好地描述文档、主题和词之间的关系。

实际上,从PLSA的结果来看,实际上相当于将LDA模型中的先验分布转化为均匀分布,然后得到所需参数的最大后验估计(在先验为均匀分布的前提下,这也相当于得到参数的最大似然估计),这也反映了一个更合理的先验对于建模非常重要。

分词是将连续的词序列按照一定的规范重新组合成词序列的过程。

现有的分词算法可以分为三类:基于字符串匹配的分词、基于理解的分词和基于统计的分词。

根据是否与词性标注过程相结合,可以分为单纯的分词方法和分词与标注相结合的综合方法。

中文分词根据实现原理和特点主要分为以下两类:

基于词典的(1)分词算法

也称为字符串匹配分词算法。算法将待匹配的字符串按照一定的策略在已建立的“足够大”的词典中进行词的匹配。如果找到一个条目,就意味着匹配成功,单词被识别。常见的基于词典的分词算法分为以下几类:正向最大匹配法、反向最大匹配法和双向匹配分词法。

基于词典的分词算法应用最广,速度最快。长期以来,研究人员一直在优化基于字符串匹配的方法,如设置最大长度,存储和搜索字符串,组织词库,如使用TRIE索引树和hash索引。

(2)基于统计的机器学习算法

目前,这类常用的算法有HMM、CRF(条件随机场)、SVM、深度学习等。比如斯坦福和Hanlp的分词工具都是基于CRF算法的。以CRF为例,基本思路是对汉字进行标注,既考虑了词频,又考虑了上下文,学习能力较好,因此对歧义词和未登录词的识别效果较好。

常见的分词器使用机器学习算法和词典,一方面可以提高分词的准确率,另一方面可以提高领域适应性。

随着深度学习的兴起,也出现了基于神经网络的单词分类器。比如有人尝试用双向LSTM+CRF实现词分类器,本质上是序列标注,所以这个模型可以通用,命名实体识别等。据报道,单词分类器的准确率可以达到97.5%。该算法框架的思想类似于论文《命名实体识别的神经架构》,利用该框架可以实现中文分词,如下图所示:

首先在语料库中嵌入字符,将得到的特征输入到双向LSTM,然后加入条件随机场得到标注结果。

目前,中文分词主要有三个难点:

1,分词标准:比如哈工大的标准里名字和姓氏是分开的,但是在Hanlp里是合在一起的。这就需要根据不同的需求制定不同的分词标准。

2.歧义:同一待切分字符串有多个切分结果。

歧义可分为三种类型:组合歧义、交集歧义和真歧义。

通常,在搜索引擎中,在建立索引和查询时会使用不同的分词算法。常见的方案是索引时使用细粒度分词保证召回,查询时使用粗粒度分词保证准确性。

3.新词:也称为词典中未收录的词。这个问题的解决有赖于人们对分词技术和汉语语言结构的进一步认识。

典型的文本分类过程可以分为三个步骤:

1.文本表示

这个过程的目的是将文本表达成分类器可以处理的形式。最常用的方法是向量空间模型,将文本集表示为一个词-文档矩阵,矩阵中的每个元素代表一个词在对应文档中的权重。选择哪些单词来表示文本的过程被称为特征选择。常见的特征选择方法有文档频率、信息增益、互信息、期望交叉熵等。为了减少分类过程中的计算量,通常需要进行维数缩减处理,例如LSI。

2.分类器构造。

这一步的目的是选择或设计一种方法来构造分类器。不同的方法各有优缺点和适用条件,要根据问题的特点选择分类器。后面会具体说常用的方法。选择方法后,在训练集上为每个类别建立一个分类器,然后将分类器应用于测试集,得到分类结果。

3.效果评估(分类器评估)

分类过程完成后,需要对分类效果进行评估。评价过程应用于测试集(而非训练集)上的文本分类结果,常用的评价标准继承自IR领域,包括召回率、精度、F1值等。

1.罗基奥方法

每个类别确定一个质心,计算待分类文档与各种代表元素之间的距离,并以此作为判断是否属于该类别的标准。Rocchio方法的特点是实现简单,效率高。缺点是受文本集分布的影响,比如计算出的中心点可能落在对应的类别之外。

2.朴素贝叶斯(Na?贝叶斯方法

将概率论模型应用于自动文档分类是一种简单有效的分类方法。贝叶斯公式是通过类别的先验概率和条件概率来估计文档对某个类别的后验概率,从而实现对该文档所属类别的判断。

3.k-最近邻(KNN)法。

从训练集中找出与待分类文档最接近的K个近邻(文档),根据这K个近邻的类别决定待分类文档的类别。KNN方法的优点是不需要特征选择和训练,易于处理大量类别。其缺点之一是空间复杂度高。由KNN方法得到的分类器是一个非线性分类器。

4.支持向量机(SVM)方法

对于某一类别,找一个分类面,使该类别的正例、反例落在该分类面的两侧,且该分类面满足以下要求:到最近的正例、反例的距离相等,是所有分类面中离正例(或反例)距离最大的分类面。SVM方法的优点是使用的训练集少,计算量小;缺点是过于依赖分类面附近的正例反例位置,偏执。

文本聚类过程可以分为三个步骤:

1.文本表示

以聚类算法可以处理的形式表示文档。请参考文本分类部分了解所采用的技术。

2.聚类算法选择或设计。

算法的选择往往伴随着相似度计算方法的选择。在文本挖掘中,最常用的相似度计算方法是余弦相似度。聚类算法有很多种,但没有一种能解决所有的聚类问题。因此,需要仔细研究待解决问题的特点,以便选择合适的算法。后面会有各种文本聚类算法的介绍。

3.聚类评估。

选择已被手动分类或标记为测试集的文档集。聚类后,将聚类结果与现有的人工分类结果进行比较。常用的评价指标还有查全率、查准率和F1值。

1.层次聚类方法

层次聚类可以分为两种类型:聚集层次聚类和划分层次聚类。内聚法以每个文本为一个初始簇,经过不断的归并过程,最终成为一个簇。划分方法的过程正好相反。层次聚类可以得到层次聚类结果,但是计算复杂度高,不能处理大量文档。

2.除法

K-means算法是最常用的划分方法。给定k个簇,选择k个文本作为k个初始簇,其他文本加入最近的簇,更新簇的中心点,然后根据新的中心点重新划分文本;当聚类不再变化或经过一定次数的迭代后,算法停止。K-means算法复杂度低,易于实现,但对异常和噪声文本敏感。另一个问题是没有好的方法来确定k的值。

3.基于密度的方法

为了找到任意形状的聚类结果,提出了一种基于密度的方法。这种方法将簇视为数据空间中由低密度区域分隔的高密度区域。常见的基于密度的方法有DBSCAN、OPTICS、DENCLUE等。

4.神经网络方法

神经网络方法将每个聚类描述为一个样本,样本作为聚类的“原型”,不一定对应一个具体的数据。根据一些距离度量,新的对象被分配到其最相似的簇中。比较著名的神经网络聚类算法有:竞争学习和自组织映射[Kohonen,1990]。神经网络聚类方法需要较长的处理时间和复杂的数据复杂度,不适合对大数据进行聚类。