java 对数取反_数学之美读书笔记-拼音输入法的数学原理

从理论上分析,输入汉字到底能有多快?这里需要用到信息论中的香农第一定理。假定在国标GB2312里面,一共有6700多个常用的汉字。如果不考虑汉字频率的分布,用键盘上的26个字母对汉字进行编码,两个字母的组合只能对676个汉字编码,对6700多个汉字进行编码需要用三个字母的组合,即编码长度为三。当然,聪明的读者马上发现了我们可以对更常见的字用较短的编码,对不太常见的字用较长的编码,这样平均下来,每个汉字的编码长度可以缩短。假定每一个汉字出现的相对频率是p1,p2,……p6700,它们编码的长度是L1,L2,……L6700,那么,平均编码长度是p1L1+p2L2+……p6700L6700。香农第一定理指出:对于一个信息,任何编码的长度都不小于它的信息熵。因此上面平均编码长度的最小值就是汉字的信息熵,任何输入法不可能突破信息熵给定的极限。这里需要指出的是,如果将输入法的字库从国标GB2312扩展到更大的字库GBK,由于后者非常见字的频率非常小,平均编码长度比针对国标的大不了多少。现在让我们来回忆一下汉字的信息熵H=-p1logp1-p2logp2-……p6700logp6700,如果对每一个字进行统计,而且不考虑上下文相关性,大致可以估算出它的值在10比特以内,当然这取决于用什么语料库来做估计。如果假定输入法只能用26个字母输入,那么每个字母可以代表log26≈4.7比特的信息,也就是说,输入一个汉字平均需要敲10/4.7≈2.1次键。聪明的读者也许已经发现,如果把汉字组成词,再以词为单位统计信息熵,那么,每个汉字的平均信息熵将会减少。这样,平均输入一个字可以少敲零点几次键盘。不考虑词的上下文相关性,以词为单位统计,汉字的信息熵大约是8比特左右,也就是说,以词为单位输入一个汉字平均只需要敲8/ 4.7≈1.7次键。这就是现在所有输入法都是基于词输入的根本原因。当然,如果再考虑上下文的相关性,对汉语建立一个基于词的统计语言模型,可以将每个汉字的信息熵降到6比特左右,这时,输入一个汉字只要敲6/4.7≈1.3次键。如果一种输入方法能做到这一点,那么汉字的输入已经比英文快得多了。但是,事实上没有一种输入方法接近这个效率。这里面有两个主要原因。首先,要接近信息论给的这个极限,就要对汉字的词组根据其词频进行特殊编码。过于特殊的编码其实欲速则不达。其次,在个人计算机上,很难安装非常大的语言模型。因此,这种编码方法理论上讲有效,但不实用。现在看看全拼的拼音输入法能够做到输入一个汉字平均多少次击键。汉语全拼的平均长度为2.98,只要基于拼音的输入法能利用上下文彻底解决一音多字的问题,平均每个汉字输入的敲键次数应该在三次以内,每分钟输入100个字完全可能达到。如果能够更多地利用上下文相关性,可以做到当句子中一个汉字的拼音敲完一部分的时候,这个汉字就被提示出来,因此,全拼输入法的平均击键次数应该小于3。因此,接下来的任务就是如何利用上下文了。10年前的拼音输入法(以紫光为代表)解决这个问题的办法是建立大词库,词也越来越多,越来越长,最后把整句唐诗都作为一个词。这个办法多少能解决一些问题,但如果统计一下就会发现帮助并不大。因为在汉语中,虽然长词的数量可以非常多,多到几十万,但是一字词和二字词占文本的大多数。而一字词和二字词恰恰是一音多字情况最严重的,比如“zhi”有275个(以Goolge拼音输入法统计),二字词“shi-yan”有14个。这些不是简单增加词典大小能解决的。而利用上下文最好的办法是借助语言模型。只要承认概率论,就无法否认语言模型可以保证拼音转汉字(解决一音多字问题)的效果最好。假定有大小不受限制的语言模型,是可以达到信息论给出的极限输入速度的。但是在产品中,不可能占用用户太多的内存空间,因此各种输入法只能提供给用户一个压缩得很厉害的语言模型。而有的输入法为了减小内存占用,或者没有完全掌握拼音转汉字的解码技巧,根本就没有语言模型。这样一来,当今的输入法和极限输入速度相比还有不少可提升的空间。目前,各家拼音输入法基本处在同一个量级,将来技术上进一步提升的关键就在于看谁能准确而有效地建立语言模型。当然利用语言模型将拼音串自动转成汉字,要有合适的算法。拼音转汉字的算法和在导航中寻找最短路径的算法相同,都是动态规划。其实可以将汉语输入看成一个通信问题,而输入法则是一个将拼音串变到汉字串的转换器。每一个拼音可以对应多个汉字,把一个拼音串对应的汉字从左到右连起来,就是一张有向图,它被称为网格图或者篱笆图。

0818b9ca8b590ca3270a3433284dd417.png

其中,y1,y2,……yn是使用者输入的拼音串;w11,w12,w13是第一个音y1的候选汉字(我们在后面的公式中用变量w1代表这三个候选汉字);w21,w22,w23,w24是对应于y2的候选汉字,以变量w2统一代表,以此类推。从第一个字到最后一个字可以组成很多很多句子,每个句子和图中的一条路径一一对应。拼音输入法就是要根据上下文在给定拼音条件下找到一个最优的句子。

0818b9ca8b590ca3270a3433284dd417.png 对应到上图中,就是要找从起点到终点的一条最短路径。而要寻找最短路径,首先要定义图中两个节点之间的距离。回顾我们在“隐含马尔可夫模型”一章中介绍上面公式的简化方法化简。

0818b9ca8b590ca3270a3433284dd417.png

如果对上面公式中的概率取对数同时取反,即定义d(wi-1,wi)=-logP(wi|wi-1)*P(yi|wi),上面的连乘关系变成加法,寻找最大概率的问题变成了寻找最短路径的问题。这样就可以直接利用动态规划算法实现拼音输入法中最重要的拼音到汉字的转换问题。

为每个人训练一个特定的语言模型,最好是收集足够多这个人自己写的文字,但是一个人一辈子写的东西不足以训练一个语言模型。更好的办法是找到大量符合用户经常输入的内容和用语习惯的语料,训练一个用户特定的语言模型。这里面的关键显然是如何找到这些符合条件的语料。这次又要用到余弦定理和文本分类的技术了。

1.可以将训练语言模型的文本按照主题分成很多不同的类别,比如1000个,C1,C2,……C1000。

2.对于每个类,找到它们的特征向量X1,X2,……X1000。

3.统计某个人输入的文本,得到他输入的词的特征向量Y。

4.计算Y和X1,X2,……X1000的余弦距离。

5.选择前K个和Y距离最近的类对应的文本,作为这个特定用户语言模型的训练数据。

6.训练一个用户特定的语言模型M1。

在大部分情况下,M1对这个特定用户输入比通用模型M0好。但是对于相对偏僻的内容,M1的效果就远不如通用的模型M0了,因为M1的训练数据比M0的小一两个数量级,覆盖的语言现象少得多。因此,一个更好的办法是综合这两个模型。

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值