自然语言处理核心内容

一般我们学习语言的时候,都是从语法规则+字/词汇开始学习的,这也是传统的语言处理方法。现代方式则是基于统计学的,简单来说,就是:说的人多了,就是正确的话(可以是词汇,可以是句子,可以是文章)。换种方式表达,就是:出现的概率多了,就是正确的话。用数学语言表达,则是: S 出现的概率 p ( S ) 越大表示 S 越正确。

1. 语句评估

如何评估一个句子的概率呢?用数学表达式表示为: S = ( w 1 , w 2 , . . . , w n ) w i 是单词,我们需要估计 p ( S )

1.1. 统计语言模型

首先要有一个语料库,里面有很多表达正确的语句。
接下来,最简单的模型是:假设句子内的单词之间没有关联关系,那么 p ( S ) = p ( w 1 ) p ( w 2 ) . . . p ( w n ) 。单词的概率评估是比较好操作的,直接用频度估算概率即可。
显然上述假设是不成立的,不然我们语法都白学了,只要去记单词就好了。在此基础上做一点简单的修改,即假设每个单词只和前面的单词有关系,即 p ( S ) = p ( w 1 ) p ( w 2 | w 1 ) . . . p ( w n | w n 1 ) ,这是一个马尔科夫链,对应的模型交二元模型(Bigram Model)。如果跟前面 N 1 个单词有关系,则称为 N 元模型(N-gram Model)。实际中一般假设 N = 3

1.2. 分词和单词概率估计

中文语言在统计单词频度时有一个基本问题:单词如何划分?
现代语言处理同样使用统计方法解决。简单来说,是先估算好所有单词、词组的概率,那么句子S的分词方法就是使得 p ( w 1 , w 2 , . . . , w n ) 最大的划分方法。枚举分词效率比较低,实际一般使用动态规划+维特比(Viterbi)算法来求解。
分词完成后,还需要对单词的概率进行估算。
最简单的方法就是直接用频度估计概率。但是会有如下问题:有些单词、词组在语料库中没有出现过~因此我们要考虑这个问题,留一些概率给没有出现过的这些单词、词组、句子……使用古德-图灵估计(Good-Turing Estimate),具体的方法如下:
1. 统计语料库中出现 r 次的单词,共 N r 个。
2. 设置阈值 T (一般设置为8-10),如果 0 < r < T ,则单词概率的估算值从 r / N 变为 N r + 1 ( r + 1 ) / ( N r N ) ,即由 r + 1 的数据来平滑估计 r 的数据。
3. 这样可以得到出现0次的单词的概率估计值从0变为 Σ r < T ( r ( r + 1 ) N r + 1 / N r ) / N
对于二元组的概率估计,也使用同样的方法进行处理。

1.3. 条件概率转化

统计语言模型最重要的数据就是公式里面的条件概率了,所有这些条件概率称为模型的参数。条件概率不好直接评估,需要转化为联合概率和边缘概率进行计算。
公式为: p ( w i | w i 1 ) = p ( w i , w i 1 ) / p ( w i 1 )
联合概率 p ( w i , w i 1 ) 用两个单词一起出现的频度来估计,边缘概率 p ( w i 1 ) 用单个单词出现的频度来估计。
随着深度学习的兴起,神经概率语言模型(NPLM, Neural Probabilistic Language Model)使用越来越多,其核心是使用神经网络训练方法,对one-hot编码的词压缩成一个向量(称为嵌入词向量 ),减少联合概率计算的复杂度。skip-gram模型是以单词作为输入,上下文组成的单词组作为输出进行训练;而CBOW(连续词袋)则是以上下文组成的单词组作为输入,单词作为输出进行训练。

2. 语句转换

2.1. 隐马尔科夫过程

假设我们接收到的文章是无法理解的句子组合 o 1 , o 2 , . . . ,怎样把它们转化为我们能够理解的句子组合 s 1 , s 2 , . . .
同样使用概率模型,求解最大的 p ( s 1 , s 2 , . . . | o 1 , o 2 , . . . ) 即可。首先将上式转化为 p ( o 1 , o 2 , . . . | s 1 , s 2 , . . . ) p ( s 1 , s 2 , . . . ) / p ( o 1 , o 2 , . . . ) ,分母是个固定项不用计算,只需要计算分子的两项就行了。
紧接着将问题建模成隐马尔科夫过程(Hidden Markov Model),我们假设每个句子之间的输出是相互独立的,则分子项正好等于隐马尔科夫过程出现的概率。
隐马尔科夫过程模型的训练需要有人工标记,工作量非常大,因此常用的办法是使用EM算法,不断更新参数。

2.2 有限状态机

有限状态机是一个有向图,是根据已知文法,对句子建立的模型,常用于地址分析。
首先对语句进行分词,将句子拆分为省、市、县、街道等信息,然后词语之间的前后关系存在限制要求,可以构成一张图。如果能从起点走到终点,那么句子就是表达正确的地址,否则是表达错误的地址。

3. 语言度量

3.1. 度量方法:信息熵

香农熵: H = Σ p l o g ( p ) ,即最小编码长度。
对于二元模型,有 H ( X | Y ) = Σ p ( x , y ) l o g ( p ( x | y ) ) ,有 H ( X ) H ( X | Y ) ,即二元模型的信息大于一元模型。
定义互信息: I ( X ; Y ) = Σ p ( x , y ) l o g ( p ( x , y ) / ( p ( x ) p ( y ) ) ) ,并且有 I ( X ; Y ) = H ( X ) H ( X | Y )

3.2. 信息编码

目前一般使用MD5和SHA-1算法来对信息进行简化编码(同时加密),编码的过程也就是进行哈希映射的过程。有时将编码映射后的值称为信息指纹。
编码的一个应用:判别文章/视频是否相同。一般是按照相同的规则提取关键词/关键帧,然后一一比较其哈希值。还可以使用相似哈希(Simhash)来计算。首先进行分词,然后计算每个词的hash编码与权重(比如TF-IDF),然后将哈希编码拆分成每一位和权重进行映射计算(比如二进制哈希码,可以将每一位的0变成-1后,求每一位的加权和,然后再映射为0-1。这两步分别称为扩展和收缩)。
第二个应用是加密:现代的加密算法一般都是用到费马小定理。比如RSA算法:给定公开密钥E和参数N,信息X的编码方法为: Y = X E mod N ,解码方法为使用私钥D: X = Y D mod N 。其中 N = P Q 为两个质数的乘积, M = ( P 1 ) ( Q 1 ) ,而密钥满足 E D = k M + 1 。可以证明 ( Y D mod N ) = ( X k M + 1 mod N ) = ( X mod N ) = X
第三个应用是拼音输入法:如果是一个字一个字输入,那么26个字母的信息量为log26,每个字的信息量大概是10,输入一个汉字需要敲键盘 10 / l o g 26 2.1 。以词为单位统计,每个字的信息量大概是8,平均只需要敲1.7次键盘。基于上下文相关性的话,每个字的信息量可以压缩到6,这时候只需要1.3次。当然这是极限,实际一般都是用自然的拼音输入法。在输入过程中,输入法会自动对拼音进行分词,然后把问题建立成一个隐马尔科夫过程,这里不使用训练方法,而是直接用动态规划方法求解最短路问题。

3.3. 关于搜索

首先是网络爬虫,一般使用广度优先,并使用哈希表来记录下载过的信息。
PageRank算法是使用指向链接作为权重来更新网页排名的算法,需要用EM算法来进行自迭代,即 B = B 0 A ,一般A矩阵计算10次就行了。
TF-IDF:用于确定搜索词和网页文章的关联程度。首先定义停止词:比如的、是、中之类的不予考虑的词;词频TF:单词在特定网页中出现的频度;逆文本频率IDF= l o g ( D / D w ) ,表明单词的泛化程度,越泛的结果排名越后,IDF本质是关键词在特定条件下的交叉熵。

3.4. 关于分类

文章的分类最常用的方法是基于文章中所有出现的单词来评估,即词袋方法。将所有单词编号,构成一个向量,向量每个值代表文章中这个单词的TF-IDF值。文章分类就变成了矢量点的聚类问题。
评估文章相似度时,一般将矢量夹角定义为两篇文章的距离,即 a r c c o s b , c / ( | b | | c | )
个性化语言推荐也可以使用矢量夹角的技术。一方面,参照分类时使用的奇异值分解方法,计算不同主题的特征向量(TF-IDF) X 1 , X 2 , . . . , X N ,然后计算用户输入的特征向量 Y ,计算 Y X i 的余弦,筛选前几个类别之中的文本训练模型;另一方面,个性化语言信息来源较少,因此一般都是用一元模型,建立一个用户词典;最后,个性模型 M 1 和通用模型 M 0 使用线性插值的方法构成一个新模型: p ( w i | w i 1 ) = λ p 0 ( w i | w i 1 ) + ( 1 λ ) p 1 ( w i | w i 1 )

猜你喜欢

转载自blog.csdn.net/kittyzc/article/details/82147425
今日推荐