1. NLP的一些基本概念和问题
计算机如何处理自然语言?
理性主义:其实就是纯粹使用规则的方法处理自然语言,并认为这些语言规则天生就存在人的基因中。在计算机中重现这些规则,就能学会人的语言处理能力。
经验主义:认为人有感知和学习能力,通过概括、模式识别、联想等能力,来学习到自然语言的结构。
哲学上的问题,类似于起源之类,就先别考虑的。
统计方法在NLP中的地位是什么?
统计方法是解决NLP问题的方法之一。
问题:
一个句子是否合乎语法?是或否,这就是句子的二值问题
如何处理语言中的歧义问题?这个是NLP的难点。歧义范围包括词义、词类别、句法结构、语义范畴。
NLP学习和练习的首要条件是什么?
建立起要解决问题和获取语料库。
关于语料库,《统计NLP基础》书里给出了几个重要的语料库和URL.
NLP在统计上的一些基本问题:
一篇文章中有多少单词?
有多少个不同的单词?
每个单词出现频率是多少? “词频”
这些基本统计方法的意义是什么?
什么是Zipf法则?
最小精力付出原理:用最小的力气,做最多的事。
词频现象符合双曲分布。而不是线性或者高斯分布
词频与词的长度成反比。(这个可以用huffman编码原理理解,是历史演化的规律)
实词趋向于在相邻的位置出现,有点聚集的意思。
2. NLP的概率论基础
传统概率论概念:
概率空间
条件概率、独立性
乘法定律
贝叶斯定理:这个是很多处理方法的核心。简单实用
随机变量、随机分布、均值(期望)、方差
联合分布、条件分布
二项分布(离散的)、正态分布(连续的)
-----------------------
贝叶斯统计:
假设先验知识不是一成不变的,可以通过不断的实验,来寻找证据来更新这些先验知识。更新方法就是贝叶斯定理。
如质地均匀的硬币,正面向上的概率是0.5. 即先获取一个近似的先验分布,是P(u) = 6m(1-m)
在实验结果s的影响和更新下:
P(u|s) = p(s|u) * p(u) / p(s)
p(s)为先验概率。若10次实验、8次正面、2次反面,则更新后的先验概率就为0.75. 这样描述太粗糙了,需要仔细地看专业书来推理。
贝叶斯决策定理:
即MAP,极大后验概率决策。
由先验概率、先验概率条件下各情况发生的实际情况(如次数统计),计算出各实际情况下先验概率的更新。
并选择最大的MAP的条件进行决策。
概率论部分 是基础,需要精心的学习一下相关概念。
3. NLP的信息论基础
与其紧密相关的概念有:
概率密度函数
熵的定义 求和 -p(x) log(p(x)).
它的意义:熵与编码长度的关系,用较少比特传输频率高的字符。利用熵理论,来确定 “求解不确定性的问题”所需多少资源。
熵与概率的关系紧密相连。
联合熵、条件熵
互信息:计算两个随机变量之间共有信息之间的度量。
噪声信道模型:信道容量、输入、输出、互信息取最大值、系统的概率分布。
香农信息论的意义:1. 定义了信息容量,使信道的传输速率有了一个上界;2.设计适当的编码能信道的传输速率最优
基于概率进行传输(翻译)。
K-L距离
交叉熵
2和3的概念在专业的书里面写的很详细,我在另外一篇blog里也总结过了,这里只列些紧要的东西。
http://blog.csdn.net/viewcode/article/details/8819361
http://blog.csdn.net/viewcode/article/details/8820272
http://blog.csdn.net/viewcode/article/details/9042187
4. 语言学基础概念
词性、词法:名词、代词、动词、形容词、副词、连词...
短语结构:名短、动短、介词短语、副词短语、形容词短语
语义、语用
这些个都是比较专业的语言学知识。
现在自己能知道的,就是中学时学的英语的那点词法、语法,有的勉强能理解。
5. 如何证实一个二元组是短语搭配?
首先是固定短语搭配识别,二元组:
1)最简单的方法: 统计两个单词一起出现的次数/频率。这个会有很多功能词组合(如of the)的干扰,效果并不好。
2)利用词性过滤器:如形容词+名词、名词+名词、形容词+形容词+名词等。效果会很好。
观点:利用简单的统计技术+语言学知识(特征) 是很有用途的。
非固定词语搭配, 如knock on the door, knock his door, knock on the metal door.
对于这种非固定距离的搭配,采用的方法是 取一个搭配窗口,窗口中每个词对都作为候选的搭配词对,然后统计频率。这样会稍微扩大了一下计算量。
对于高频候选对,还可以统计其距离的均值和方差。距离均值和偏差是两个词之间的分布的重要特征。
若存在的是高偏差,那么这种搭配距离不固定,可能不是很有吸引力,而低偏差的搭配,说明词对的距离基本恒定,这个是一个很有意思的特征。
6. 如何对检测出的“词对”进行检验?
问题描述:应用5中的方法,检测出一个高频词对,并且是低偏差的。如 new 和companies,这个是可能的,它们并不是词对,仅仅是偶然同时出现在一个区域。
如何对这种词对进行假设检验?
若词w1,w2是完全独立产生的,那么P(w1, w2) = P(w1) * P(w2)
一般采用t分布,对均值进行假设检验。
低于a=0.005的置信水平的假设,即t 值小于 2.56,是会被拒绝的。
t分布也可以用来检测两个相近意义的词之间的差别。如strong和powerful的差别
t分布的假设前提:所有分布都服从正态分布。
其他检验方法:
卡方分布
似然比分布
7. 两个词之间的互信息如何度量?
两个词同时互现的互信息为 I (x, y)= log [ p(x, y) / p(x)p(y) ] = log [p(x|y) / p(x)] = log[p(y|x) / p(y)]
它 表明了两个词语之间有多大的联系。 若 x, y不相关,则 I(x, y)= log 1 = 0; 若x,y相关,则x,y完全相关时,p(x)=p(y), 则 I(x,y)= log [1 / p(x)].
8. 什么是shannon游戏? n元语法模型?
经典的语言建模问题,采用统计的方法,根据当前词来预测下一个词,可以用来拼写纠错,手写识别,机器翻译等等,也可以用于语义消岐和概率句法分析。
n元语法模型:
单词预测可以用下面的概率方程来表示
P(wn | w1 w2...wn-1),利用前面已经出现的n-1个词,来预测第n个词,这个就是n-1阶的马尔可夫模型,或叫n元语法模型。
n元语法模型的数量:
若一共有N个词,那么 穷举n个词组合的词表约有 N^(n-1) * (N-1) 个
2阶,3阶,4阶语言模型还是有可能的,目前而言5阶的语法模型就太大了。google的机器翻译语言模型目前应该是4阶的。
如何减小词表?
一个方法就是减小n的值,但n减小后,其推断能力也会受到影响。
另外一个方法就是使用词干化方法,删除词语的变形结尾,或使用语义类聚类的方法,构造等价类,减少词表的规模。
除了词汇,还应该考虑句子的结构,才能获取更好的结果。
9. 如何对n元语法模型进行统计估计?
继续使用概率的方式,求解P(wn | w1 w2...wn-1)
P(wn | w1 w2...wn-1) = P(w1 w2...wn) / P(w1 w2...wn-1)
1)最大似然估计
P(w1 w2...wn) = C(w1 w2 ... wn) / N, C是n元组出现的频率,而N是训练实例的个数。
这个是最大似然估计的推导结果。
但最大似然估计有时不太适合NLP统计推理,因为数据稀疏的原因,数据不足就无法获取完整的概率分布。
采样训练数据不足,也可以用折扣的方法来弥补,即采用平滑的方法,将少量概率分配到没有看到的事件上去。
要分配多少概率到没有看到的事件上去哪?
2)Laplace法则,又称加1法
P(w1 w2...wn) = [C(w1 w2 ... wn) + 1] / (N+B)
这个方法的依据就贝叶斯估计,每个n元组都有相同的可能性,这个是假设的前提(?这个需要后续的理解)
方法缺点:依赖于词表的大小,对于大词表上的稀疏数据集,Laplace法则将太多的数据转移到未知事件上。
3)LidStone法则
Laplace平滑法则,缺点比较明显,其改进就是,将加1改为一个较小的值lamda。
P(w1 w2...wn) = [C(w1 w2 ... wn) + lamda] / (N+B*lamda)
常用的lamda值是0.5. 这个值是可以看做是最大似然估计和统一的先验概率论之间的线性插值。
这种方法的缺点: 需要猜想一个合理的lamda值,而且在低频情况下,这种方法在最大似然估计上的概率与经验分布不太相符。
4)什么是留存估计?
就是一个数据集,一部分用来训练,另外一部分留存的数据用来验证。
在训练的数据上进行验证是不正确的。
在不同的数据集上进行测试是必要的。
在训练数据上,交叉熵的值要比真实文本的熵低。
可以使用留存的数据来计算 转移的概率有多大。
5)交叉验证
相对于留存估计法,交叉验证是更有效率的,即训练数据的每一部分既作为训练数据,又作为留存验证数据。
缺点: 这种方法对低频仍然不太适用,它在较小语料库上,会导致对未知事件概率的估计偏高。
6)Good-Turing估计、古德-图灵估计法(两个人)
是一种平滑算法:
即将每个类别发生的频率r,变为 r* = (r+1) * n(r+1) / nr, n(r+1)是训练语料中发生r+1次 N元组的个数,nr是训练语料中发生r次的N元组的个数。即调整后,每个类别的发生频率是由相邻两个类别决定。
而其概率也变为 Pr = r* / N, 这里的大N是语料库中种类个数。
从1到无穷大,所有发生的概率之和是小于1的。而剩余这部分概率就 n1 / N, 可以作为分配给未知事件的概率。
7) 常用的组合方法有哪些?
在多种模型获取不同的结果时,可以采用组合模型的方法,来获取更好的结果。
常用的方法有:
线性插值法
Katz退避法:对于频度小于某阈值的词,降低其频度,频度越小,下降就越多。这样未看见的词也会有一定的频率
10. 什么是语义消岐?有哪些处理算法?
语义有歧义,主要是因为歧义词在不同的语境有不同的含义。消岐的任务就是根据上下文环境确定一个歧义词的确切含义。
1)一些常用概念:
语义消岐的方法一般分为两类:
有监督方法: 一般是指分类任务,可以推断出分类函数的形态。但其需要标注好的语料,标注的工作比较麻烦。
无监督方法: 一般是指聚类任务。
伪词:合并两个或多个自然词来创建一个伪词,用于测试数据。人工构建含有歧义的文本。
算法的上下界:不同的歧义词,区分难度不同,应该区别对待,制定不同的区分标准。上界一般是指人工的区分度,而下界是指最简单算法的区分度。
2) 有监督消岐
有监督学习算法有很多种,而NLP中最常用的两个理论是 贝叶斯分类 和 信息论。
贝叶斯分类:
MAP, 最大化后验概率。计算一个词的后验概率时,需要两个条件:
一是统计出 这个词在每种语义中出现的概率Sk。
二是统计出 这个词在每种语义中被正确分类的概率c|Sk
然后就可以计算出 这个词 是处于哪种语义中的概率。
其算法伪代码如下:
基于信息论的算法:
Flip-Flop算法,用于处理两个语义的情况。
待详细补充。
伪代码如下:
3)基于词典或类义辞典的消岐
利用词典的解释来确定其语义
4) 无监督消岐
采用EM算法将有歧义词的上下文聚类到很多组中。
这块需要多熟悉点其他的东西才好消化。
后面对以上概念和算法,可以用natural language processing with python来实践一下。
作者:viewcode 发表于2013-9-4 8:32:40
原文链接