摘要:本文介绍了利用基于词的一元模型、二元模型、三元模型估计中文信息熵的计算方法,并通过中文维基百科语料得到三种统计语言模型计算得到的中文信息熵分别为13.711比特/词、6.402比特/词、1.508比特/词。
关键词:信息熵; 统计语言模型
-
引言
信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。
自然语言是一种上下文相关的信息表达和传递的方式,让计算机处理自然语言,一个基本的问题就是为自然语言这种上下文相关的特性建立数学模型,即统计语言模型。
吴军博士利用基于词的一元文法模型、二元文法模型和长距离二元文法模型计算得到的中文信息熵分别为7.03比特/词、5.46比特/词、5.17比特/词[1]。
-
信息熵
通常,一个信源发送出什么符号是不确定的,衡量它可以根据其出现的概率来度量。概率大,出现机会多,不确定性小;反之不确定性就大。
不确定性函数f是概率P的减函数;两个独立符号所产生的不确定性应等于各自不确定性之和,即f(P1,P2)=f(P1)+f(P2),这称为可加性。同时满足这两个条件的函数f是对数函数,即。
在信源中,考虑的不是某一单个符号发生的不确定性,而是要考虑这个信源所有可能发生情况的平均不确定性。若信源符号有n种取值:U1…Ui…Un,对应概率为:P1…Pi…Pn,且各种符号的出现彼此独立。这时,信源的平均不确定性应当为单个符号不确定性-logPi的统计平均值(E),可称为信息熵,即,式中对数一般取2为底,单位为比特。但是,也可以取其它对数底,采用其它相应的单位,它们间可用换底公式换算[2]。
变量的不确定性越大,熵也就越大。考虑信源1的符号有四种取值:a,b,c,d,对应概率为0.7,0.1,0.1,0.1,且各种符号的出现彼此独立,代入上述信息熵公式,计算得1.35678比特。考虑信源2的符号另四种取值:x,y,z,w,对应概率为0.97,0.01,0.01,0.01,且各种符号的出现彼此独立,代入上述信息熵公式,计算得0.24194比特。信源1的信息熵比信源2大,证明了信源1的不确定性比信源2大。
不同的语言平均每个字符所含有的信息量也是不同的,中文可以说是世界上最简洁的语言,如果将一本英文书翻译成中文,如果字体大致相同,中译本会比原书要薄很多。从中文和英文字符的平均熵的计算结果也可知一二,利用单词一级的语言模型,对大规模语料进行统计的结果为1.75比特/字符,对于中文,从字频出发得到的粗略结果为9.6比特/汉字[3]。
-
统计语言模型
假定S表示某一个有意义的句子,由一连串特定顺序排列的词w1,w2,...wn组成,n为句子的长度。现在想知道S在文本中出现的可能性,即P(S)。此时需要有个模型来估算,不妨把P(S)展开表示为P(S)=P(w1,w2,...,wn)。利用条件概率的公式,S这个序列出现的概率等于每一个词出现的条件概率相乘,于是P(w1,w2,...,wn)可展开为:
P(w1,w2,...wn)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wn|w1,w2,...,wn-1)
其中P(w1)表示第一个词w1出现的概率;P(w2|w1)是在已知第一个词的前提下,第二个词出现的概率;以此类推。[4]
显然,当句子长度过长时,P(wn|w1,w2,...,wn-1)的可能性太多,无法估算,俄国数学家马尔可夫假设任意一个词wi出现的概率只同它前面的词wi-1有关,这种假设成为马尔可夫假设,S的概率变为
P(S)=P(w1)P(w2|w1)P(w3|w2)...P(wi|wi-1)...P(wn|wn-1)
其对应的统计语言模型就是二元模型。也可以假设一个词由前面N-1个词决定,即N元模型。当N=1时,每个词出现的概率与其他词无关,为一元模型,对应S的概率变为
P(S)=P(w1)P(w2)P(w3)...P(wi)...P(wn)
当N=3时,每个词出现的概率与其前两个词相关,为三元模型,对应S的概率变为
P(S)=P(w1)P(w2|w1)P(w3|w1,w2)...P(wi|wi-2,wi-1)...P(wn|wn-2,wn-1)
-
实验步骤
1.中文语料预处理
维基百科是最常用且权威的开放网络数据集之一,作为极少数的人工编辑、内丰富、格式规范的文本语料,各类语言的维基百科在NLP等诸多领域应用广泛。下载地址为
https://dumps.wikimedia.org/zhwiki/20190301/zhwiki-20190301-pages-articles.xml.bz2。维基百科提供的语料是xml格式的,因此需要将其转换为txt格式。由于维基百科中有很多是繁体中文网页,故需要将这些繁体字转换为简体字,采用opencc第三方库进行繁简转换。本文的统计语言模型都是基于词的,所以需要对中文句子进行分词,采用Jieba中文分词工具对句子进行分词[5]。
由于一元模型不需要考虑上下文关系,所以其读取语料的方式与二元模型和三元模型不一样,直接采用Gensim的数据抽取类WikiCorpus对xml文件进行抽取,它能够去掉文本中的所有标点,留下中文字符和utf-8编码下字节数为1的标点符号,去掉这些符号后再进行繁简转换和分词,得到所需要的txt格式语料库。
二元模型和三元模型需要考虑上下文关系,不能直接去掉所有标点符号得到无分隔的语料。通过bz2file不解压读取语料,再利用Gensim的extract_pages类来提取每个页面[6],此时得到的语料相比利用WikiCorpus得到的语料多了一些英文字符和中文标点符号,通过建立一个停用符号表和正则表达式两种方式清理语料,进行繁简转换和分词之后得到以一句一行的txt格式语料库。
2.词频统计
由于设备限制和时间限制,无法利用整个大小为1.6GB的语料库,故在一元模型中读取10000篇文章,共计22327931字。由于二元模型和三元模型更加复杂和耗时,故在二元模型和三元模型中读取1000篇文章,共计5374203字。
一元模型只需要统计每个词在语料库中出现的频数,得到词频表。二元模型也需要统计每次词在语料库中出现的频数,得到词频表,作为计算条件概率P(wi|wi-1)时的分母,并且需要统计每个二元词组在语料库中出现的频数,得到二元模型词频表。三元模型需要统计每个二元词组在语料库中出现的频数,得到二元模型词频表,作为计算条件概率P(wi|wi-2,wi-1)时的分母,并且需要统计每个三元词组在语料库中出现的频数,得到三元模型词频表。
3.计算信息熵
如果统计量足够,根据大数定理,词或二元词组或三元词组出现的概率大致等于其出现的频率。
一元模型的信息熵计算公式为,其中P(x)可近似等于每个词在语料库中出现的频率。
二元模型的信息熵计算公式为,其中联合概率P(x,y)可近似等于每个二元词组在语料库中出现的频率,条件概率P(x|y)可近似等于每个二元词组在语料库中出现的频数与以该二元词组的第一个词为词首的二元词组的频数的比值。
三元模型的信息熵计算公式为[7],其中联合概率P(x,y,z)可近似等于每个三元词组在语料库中出现的频率,条件概率P(x|y,z)可近似等于每个三元词组在语料库中出现的频数与以该三元词组的前两个词为词首的三元词组的频数的比值。
-
实验结果
在一元模型中使用的语料库字数为22327931字,分词个数为11605852词,平均词长为1.924,计算得到基于词的一元模型的中文信息熵为13.711比特/词。
在二元模型中使用的语料库字数为5374203字,分词个数为2768804词,平均词长为1.941,共有二元词组2298990个,计算得到基于词的二元模型的中文信息熵为6.402比特/词。
在三元模型中使用的语料库字数为5374203字,分词个数为2768804词,平均词长为1.941,共有三元词组1891695个,计算得到基于词的二元模型的中文信息熵为1.508比特/词。
具体代码参考:https://github.com/hanmy1021/NLP
参考文献
[1]吴军, 王作英.汉语信息熵和语言模型的复杂度[J]. 电子学报,1996.
[2]百度百科:信息熵 https://baike.baidu.com/item/%E4%BF%A1%E6%81%AF%E7%86%B5/7302318?fr=aladdin
[3]冯志伟.汉字的熵,现代汉语定量分析[J]. 上海教育出版社,1989.
[4]吴军.数学之美(第二版) 第2章 统计语言模型. 人民邮电出版社.
[5]涂铭, 刘祥, 刘树春.Python自然语言处理实战技术核心与算法. 机械工业出版社.
[6]获取并处理中文维基百科语料 https://blog.csdn.net/jdbc/article/details/59483767
[7]吴军.数学之美(第二版) 第6章 信息的度量和作用. 人民邮电出版社.