英文单词平均长度及信息熵计算
题目要求:
以文本形式给定一足够长的典型英文小说,编程计算文章平均单词长度,并计算一阶和二阶信息熵.
分析:
计算英文单词平均长度,即统计总单词数和总字母数,然后用总字母数除以总单词数.用VC++编程实现,英文单词数计算法:
1. 一般,一个字符串的前一个字符是字母,而紧跟其后的是一个符号,那么可以认为这是一个单词.则单词数加一
2. 排除掉满足条件1但却不能算一个单词的情况,如:can’t、non-linear这类单词。因为在满足1时单词数已加上一,故判断这是一个组合词,这个符号不算一个单词之后,单词数减一。
字母数的统计即从文本读取一个字符串后全部转为小写,判断是否在a~z之间,是则字母数加
一。
因为题目要求“足够长”,因此全文的扫描统计显然是不理智的,因此,采用每读一行后,随机向后跳N行的抽样法统计,并计设一个全文的扫描统计统计的程序以验证随机抽样与精确读取之间的误差,发现误差在0.1~字符串长度统计0.4之间,显然小了一个数量级,这个误差可以接受,故为了程序计算速度,采用了随机抽样统计的方法。具体为:每从文本读取一行后,通过调用自定义函数fileseek=int generaterand(int m_range)产生一个随机数,读取文本指针从当前位置向后跳fileseek,继续读取下一行,如此反复可遍历全文。
关于信息熵的统计,我翻阅了很多资料,最后确定从以下两法中抽一各:
1. 香农统计自然语言信息熵的方法。
2. 利用离散有记忆信源的算法计算信息熵。
下面比较这两种算法:
1. 香农统计自然语言信息熵的方法。
首先,选一本有代表性的英语书籍。然后随机地翻开某一页,并随机地选择该页的一个字母,假设是U。将U作为典型字母序列的第一个字母。再随机地跳过若干行或若干页,读到第一个U,就读取紧跟其后的字母,假设为R,将R作为序列的第二个字母。然后再跳若干行,读到R并读取紧跟其后的字母,将其做为序列的第三个,如此反复,即可得到一个字母序列,构成一阶马尔可夫信源,用马尔可夫信源求信源熵的办法即可求出一阶熵。
同理,若每次选两个字母为一个组合,用相似的办法即可得到另一个字母序列,构成二阶马尔可夫信源,之后用马尔可夫信源求信源熵的办法即可求出二阶熵。
2. 利用离散有记忆信源的算法计算信息熵。
求得联合熵H(X1,X2)后除二即可行一阶信息熵。
同理求得联合熵H(X1,X2,X3)后除三即可行二阶信息熵。
显然第一种方法更科学更简单,但对计算机而言,反受了马尔可夫信源的状态数限制,使得求解的计算机算法更难实现(这些是我本人知识有限所致),故选用第二种办法。
第二种算法即先求联合概率,然后求信息熵,方法较简单,在些不多展开。计算机实现时求这些有限个数的概率只要用好数组就得了。具体算法见程序。
使用VC++6.0的MFC库编写此程序。
结果:
程序运行结果如下图:
程序界面
计算某一文章结果
总结:
计算结果存在一定的误差,一是算法上有一定缺馅,二是随机抽样导致。希望老师以后多给这样锻练能力的作业,我会努力学好这门课,多学点知识,争取做得更好。做的不对的地方恳请老师给予指正.
组长:王毅诚(学号:200404015010)
组员(不分先后顺序):
刘 学(学号:200404015021)
陈明虎(学号:200404015041)
张 强(学号:200404015006)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论