一般我们学习语言的时候,都是从语法规则+字/词汇开始学习的,这也是传统的语言处理方法。现代方式则是基于统计学的,简单来说,就是:说的人多了,就是正确的话(可以是词汇,可以是句子,可以是文章)。换种方式表达,就是:出现的概率多了,就是正确的话。用数学语言表达,则是: 出现的概率 越大表示 越正确。
1. 语句评估
如何评估一个句子的概率呢?用数学表达式表示为: , 是单词,我们需要估计 。
1.1. 统计语言模型
首先要有一个语料库,里面有很多表达正确的语句。
接下来,最简单的模型是:假设句子内的单词之间没有关联关系,那么
。单词的概率评估是比较好操作的,直接用频度估算概率即可。
显然上述假设是不成立的,不然我们语法都白学了,只要去记单词就好了。在此基础上做一点简单的修改,即假设每个单词只和前面的单词有关系,即
,这是一个马尔科夫链,对应的模型交二元模型(Bigram Model)。如果跟前面
个单词有关系,则称为
元模型(N-gram Model)。实际中一般假设
。
1.2. 分词和单词概率估计
中文语言在统计单词频度时有一个基本问题:单词如何划分?
现代语言处理同样使用统计方法解决。简单来说,是先估算好所有单词、词组的概率,那么句子S的分词方法就是使得
最大的划分方法。枚举分词效率比较低,实际一般使用动态规划+维特比(Viterbi)算法来求解。
分词完成后,还需要对单词的概率进行估算。
最简单的方法就是直接用频度估计概率。但是会有如下问题:有些单词、词组在语料库中没有出现过~因此我们要考虑这个问题,留一些概率给没有出现过的这些单词、词组、句子……使用古德-图灵估计(Good-Turing Estimate),具体的方法如下:
1. 统计语料库中出现
次的单词,共
个。
2. 设置阈值
(一般设置为8-10),如果
,则单词概率的估算值从
变为
,即由
的数据来平滑估计
的数据。
3. 这样可以得到出现0次的单词的概率估计值从0变为
。
对于二元组的概率估计,也使用同样的方法进行处理。
1.3. 条件概率转化
统计语言模型最重要的数据就是公式里面的条件概率了,所有这些条件概率称为模型的参数。条件概率不好直接评估,需要转化为联合概率和边缘概率进行计算。
公式为:
。
联合概率
用两个单词一起出现的频度来估计,边缘概率
用单个单词出现的频度来估计。
随着深度学习的兴起,神经概率语言模型(NPLM, Neural Probabilistic Language Model)使用越来越多,其核心是使用神经网络训练方法,对one-hot编码的词压缩成一个向量(称为嵌入词向量 ),减少联合概率计算的复杂度。skip-gram模型是以单词作为输入,上下文组成的单词组作为输出进行训练;而CBOW(连续词袋)则是以上下文组成的单词组作为输入,单词作为输出进行训练。
2. 语句转换
2.1. 隐马尔科夫过程
假设我们接收到的文章是无法理解的句子组合
,怎样把它们转化为我们能够理解的句子组合
?
同样使用概率模型,求解最大的
即可。首先将上式转化为
,分母是个固定项不用计算,只需要计算分子的两项就行了。
紧接着将问题建模成隐马尔科夫过程(Hidden Markov Model),我们假设每个句子之间的输出是相互独立的,则分子项正好等于隐马尔科夫过程出现的概率。
隐马尔科夫过程模型的训练需要有人工标记,工作量非常大,因此常用的办法是使用EM算法,不断更新参数。
2.2 有限状态机
有限状态机是一个有向图,是根据已知文法,对句子建立的模型,常用于地址分析。
首先对语句进行分词,将句子拆分为省、市、县、街道等信息,然后词语之间的前后关系存在限制要求,可以构成一张图。如果能从起点走到终点,那么句子就是表达正确的地址,否则是表达错误的地址。
3. 语言度量
3.1. 度量方法:信息熵
香农熵:
,即最小编码长度。
对于二元模型,有
,有
,即二元模型的信息大于一元模型。
定义互信息:
,并且有
。
3.2. 信息编码
目前一般使用MD5和SHA-1算法来对信息进行简化编码(同时加密),编码的过程也就是进行哈希映射的过程。有时将编码映射后的值称为信息指纹。
编码的一个应用:判别文章/视频是否相同。一般是按照相同的规则提取关键词/关键帧,然后一一比较其哈希值。还可以使用相似哈希(Simhash)来计算。首先进行分词,然后计算每个词的hash编码与权重(比如TF-IDF),然后将哈希编码拆分成每一位和权重进行映射计算(比如二进制哈希码,可以将每一位的0变成-1后,求每一位的加权和,然后再映射为0-1。这两步分别称为扩展和收缩)。
第二个应用是加密:现代的加密算法一般都是用到费马小定理。比如RSA算法:给定公开密钥E和参数N,信息X的编码方法为:
,解码方法为使用私钥D:
。其中
为两个质数的乘积,
,而密钥满足
。可以证明
。
第三个应用是拼音输入法:如果是一个字一个字输入,那么26个字母的信息量为log26,每个字的信息量大概是10,输入一个汉字需要敲键盘
。以词为单位统计,每个字的信息量大概是8,平均只需要敲1.7次键盘。基于上下文相关性的话,每个字的信息量可以压缩到6,这时候只需要1.3次。当然这是极限,实际一般都是用自然的拼音输入法。在输入过程中,输入法会自动对拼音进行分词,然后把问题建立成一个隐马尔科夫过程,这里不使用训练方法,而是直接用动态规划方法求解最短路问题。
3.3. 关于搜索
首先是网络爬虫,一般使用广度优先,并使用哈希表来记录下载过的信息。
PageRank算法是使用指向链接作为权重来更新网页排名的算法,需要用EM算法来进行自迭代,即
,一般A矩阵计算10次就行了。
TF-IDF:用于确定搜索词和网页文章的关联程度。首先定义停止词:比如的、是、中之类的不予考虑的词;词频TF:单词在特定网页中出现的频度;逆文本频率IDF=
,表明单词的泛化程度,越泛的结果排名越后,IDF本质是关键词在特定条件下的交叉熵。
3.4. 关于分类
文章的分类最常用的方法是基于文章中所有出现的单词来评估,即词袋方法。将所有单词编号,构成一个向量,向量每个值代表文章中这个单词的TF-IDF值。文章分类就变成了矢量点的聚类问题。
评估文章相似度时,一般将矢量夹角定义为两篇文章的距离,即
个性化语言推荐也可以使用矢量夹角的技术。一方面,参照分类时使用的奇异值分解方法,计算不同主题的特征向量(TF-IDF)
,然后计算用户输入的特征向量
,计算
与
的余弦,筛选前几个类别之中的文本训练模型;另一方面,个性化语言信息来源较少,因此一般都是用一元模型,建立一个用户词典;最后,个性模型
和通用模型
使用线性插值的方法构成一个新模型:
。