中英文字数统计以及信息熵的计算

  • 一、实验要求
  • 二、功能实现
    • 2.1实验环境
    • 2.2统计中文小说的使用频率
      • 2.2.1代码部分
      • 2.2.2运行结果
    • 2.3统计英文小说26个英文字母的使用频率
      • 2.3.1代码部分
      • 2.3.2运行结果
    • 2.4计算中文小说西游记的各个汉字的信息熵
      • 2.4.1代码部分
      • 2.4.2运行结果
    • 2.5计算英文小说26个字母各自的信息熵
      • 2.5.1代码部分
      • 2.5.2运行结果
    • 2.6 过程截图
      • 2.6.1 英文字母的
      • 2.6.2 中文小说的
    • 2.7 实验总结

一、实验要求

  1. 使用Java对任意一部中英文小说进行字符统计,中文小说统计各个中文字符使用的频率,并且计算出中文小说西游记中共使用了多少个汉字。
  2. 英文小说统计26个英文字母的使用频率。
  3. 计算中文小说西游记的各个汉字的信息熵。
  4. 计算英文小说26个英文字母各自的信息熵。

二、功能实现

2.1实验环境

  1. java 1.8.0._171
  2. idea 2017.2

2.2统计中文小说的使用频率

2.2.1代码部分

package main.java.demo;/*** Created with IntelliJ IDEA.* User: kingback* Author:king@王延凯* Date: 2019/7/5* Time: 23:28* Description: No Description*/
import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类public class Journey_to_West {public static void main(String[] args) {try {//try代码块,当发生异常时会转到catch代码块中//所要查询的中文txt文件路径String input="C:\\Users\\kingback\\Desktop\\龙华老师资料\\上交资料\\第九次上交材料\\西游记\\西游记中文版.txt";//创建类进行文件的读取,并指定编码格式为utf-8InputStreamReader read = new InputStreamReader(new FileInputStream(input),"GBK");BufferedReader in = new BufferedReader(read);//可用于读取指定文件StringBuffer b = new StringBuffer();//定义一个字符串变量b,便于后续进行内容追加的操作String str = null;//定义一个字符串类型变量strint i = 0;//定义一个整型变量,用于统计字符串的出现次数while((str = in.readLine()) != null) {//readLine()方法, 用于读取一行,只要读取内容不为空就一直执行b.append(str);//将该行内容追加到字符串b的后面}TreeMap<Character,Integer>tm =Pross(b.toString());//调用TreeMap函数List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(tm.entrySet());//将map转换为list便于进行排序/* 写入Txt文件 *///所要存储结果的文件路径File writename = new File("C:\\Users\\kingback\\Desktop\\龙华老师资料\\上交资料\\第九次上交材料\\西游记\\result.txt"); // 相对路径,如果没有则要建立一个新的output。txt文件writename.createNewFile(); // 创建新文件BufferedWriter out = new BufferedWriter(new FileWriter(writename));String hh=tm.toString();String[] sourceStrArray = hh.split("\\,|\\{|\\}");//分割出来的字符数组,多字符分割for (int ii = 0; ii < sourceStrArray.length; ii++) {System.out.println(sourceStrArray[ii]);//屏幕输出,查看结果out.write(sourceStrArray[ii]+"\n");//写入txt文件out.flush(); // 把缓存区内容压入文件}out.close(); // 最后记得关闭文件Iterator<Integer>it = tm.values().iterator();//获取tm中value值并迭代while(it.hasNext()) {//检查序列中是否含有元素,若有则为trueInteger j=(Integer)it.next();//定义变量获取元素i+=j;//迭代求总字符数}in.close();//关闭流System.out.println("总汉字数为"+i);//输出总的汉字数} catch (IOException e) {//当try代码块有异常时转到catch代码块e.printStackTrace();//printStackTrace()方法是打印异常信息在程序中出错的位置及原因}}public static TreeMap<Character,Integer>Pross(String str) {//构造TreeMap统计方法String d = null;//定义一个字符串类型变量char[] charArray = str.toCharArray();//将字符串转换为字符数组TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//定义一个TreeMap集合for(int x = 0;x < charArray.length;x++) {//循环遍历字符数组d=Character.toString(charArray[x]);//返回一个字符串对象if (d.matches("[\\u4e00-\\u9fa5]")) {//if语句的条件,判断是否为汉字if(!tm.containsKey(charArray[x])) {//if语句的条件,判断该汉字是否在tem中tm.put(charArray[x], 1);//若该汉字不在tem中则初始化其value值为1} else {//若该汉字在tem中int count = tm.get(charArray[x])+1;//其出现次数增加1tm.put(charArray[x],count);//若汉字在tem中则其value值为count}}}return tm;//返回}}

2.2.2运行结果

2.3统计英文小说26个英文字母的使用频率

2.3.1代码部分

package main.java.demo;/*** Created with IntelliJ IDEA.* User: kingback* Author:king@王延凯* Date: 2019/7/6* Time: 9:49* Description: No Description*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;public class Jane_Eyre {public static void main(String[] args) {/** 该程序主要完成从硬盘上读取一个文件里的内容,然后统计26个英文字母分别出现的频率* 首先需要读取我们存放在桌面的英文小说Jane_Eyre.txt文件,里面限定只能输入小写的字母,接着运行程序即可看到结果*/String Filename="C:\\Users\\kingback\\Desktop\\龙华老师资料\\上交资料\\第九次上交材料\\简爱英文版\\Jane_Eyre_048\\Jane Eyre - Charlotte Bronte.txt";File file = new File(Filename);InputStream ips = null;ArrayList<Integer> arr = new ArrayList<Integer>();char[] lower = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w','x', 'y', 'z' };//存放26个英文字母try {//System.out.println("以字节为单位读取文件内容,一次读一个字节:");ips = new FileInputStream(file);int tempbyte;while ((tempbyte = ips.read()) != -1) {arr.add(tempbyte);}ips.close();} catch (IOException e) {e.printStackTrace();return;}System.out.println("从文件读出的内容,按照从a到z的字母出现频率如下:");int nums=0;for(int arr1:tongjipinlv(arr,lower)){System.out.print(arr1+",");nums+=arr1;}System.out.println("\n该小说中所有小写字母的个数为:"+nums);int[] result=tongjipinlv(arr,lower);//用来获取英文字母的个数//计算英文字母的信息熵for (int i = 0; i < 26; i++) {double p = (double)result[i]/nums;//定义一个double型变量,计算该汉字在文章中的出现概率double H = -p * (Math.log(p) / Math.log(2));//定义一个double型变量,计算该汉字的信息熵System.out.println("字母"+lower[i]+"    "+"个数为:"+result[i]+"     信息熵为:"+H);}}//统计字母出现频率public static int[] tongjipinlv(ArrayList<Integer> arr,char[] lower) {int[] count ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//遍历查询出结果for (int i=0;i<lower.length;i++)for(int j=0;j<arr.size();j++){if (arr.get(j) == lower[i]) {++count[i];}}return count;//返回26个字母的结果}
}

2.3.2运行结果

2.4计算中文小说西游记的各个汉字的信息熵

对于汉字信息熵的求解是在上边求出各个汉字的使用频率后继续进行的计算。以下为该计算实现的代码部分:

2.4.1代码部分

//            计算信息熵
//            根据数学公式来进行计算
for(Map.Entry<Character,Integer> mapping:list) {//遍历listint f = mapping.getValue();double p = (double)f/i;//定义一个double型变量,计算该汉字在文章中的出现概率double H = -p * (Math.log(p) / Math.log(2));//定义一个double型变量,计算该汉字的信息熵System.out.println(mapping.getKey()+":"+mapping.getValue()+"   信息熵为:"+H+"比特/符号"); //输出降序排序的结果}

2.4.2运行结果

2.5计算英文小说26个字母各自的信息熵

2.5.1代码部分

int[] result=tongjipinlv(arr,lower);//用来获取英文字母的个数
//计算英文字母的信息熵
for (int i = 0; i < 26; i++) {double p = (double)result[i]/nums;//定义一个double型变量,计算该汉字在文章中的出现概率double H = -p * (Math.log(p) / Math.log(2));//定义一个double型变量,计算该汉字的信息熵System.out.println("字母"+lower[i]+"    "+"个数为:"+result[i]+"     信息熵为:"+H);
}

2.5.2运行结果

2.6 过程截图

2.6.1 英文字母的

2.6.2 中文小说的

2.7 实验总结

该实验主要考察了使用Java对于文本的写入和读取,以及对于信息熵概念的理解。最后说明一下,如果有人需要实验中所用到的《西游记》和《简爱》的txt版本,可以给我留言,看到必免费赠送。

中英文字数统计以及信息熵的计算相关推荐

  1. c语言 字数统计 字符串,基于C语言的字数统计

    摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词.数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的.这里提出了一种较好的字 ...

  2. 百度字数统计代码研究

    2013年01月曾答应博客园网站管理员会在博客园发布原创内容,当时还不太懂技术,一直拖到现在编出解决百度字数统计问题的专业文章. 1.1 字节 字节(B)是 Byte 的中文,多用作存储容量单位,亦可 ...

  3. C# 正则计算中文,数字,英文字数统计方法

    因为功能需求,需要实现对于文章字数统计的一个方法编写.此处就不多说.直接进行代码讲解. 先来看看功能实现的字数统计要求: 字数统计区分中英文,一个英文单词为一个字,一个汉字为一个字,一个数字计为一个字 ...

  4. 深度学习与自然语言处理实验——中文信息熵的计算

    深度学习与自然语言处理实验--中文信息熵的计算 问题描述 实验原理 信息熵 语言模型的参数估计 实验过程 实验数据的预处理 一元模型 二元模型 三元模型 实验结果 语料信息统计 不同模型下的实验结果 ...

  5. 一些技术社区关于博客内图片 markdown 源代码的字数统计

    CSDN: 使用 markdown 语法插入图片或者超链接,链接本身的 url 也作为文章字数被计算了,这样有些不太准确. infoQ 的字数统计是没有问题的: 华为没有字数显示: 51CTO:也没有 ...

  6. 新浪微博长链接字数统计问题

    最近发现公司系统中调用api发布的微博字数统计和新浪微博中的字数统计不一致,原来是链接的问题. 新浪微博的字数统计是一个长链接不管多长,统一记成10个字(其他:中文字符为一个长度,英文.数字.标点符号 ...

  7. 文章字数统计(python)

    文章字数统计(python) 思路: 导入文章 把文章转换成列表 用set() 函数去重后,变为一个去重了的list 再生成一个对应的列表为times 列表 用文章列表和去重后的列表做一个判定,出现的 ...

  8. 【工具】一款在线字数统计工具,统计单个字词组出现的频率

    一款在线文字字数统计工具,可以算出一篇文章中,文字或者词组出现的次数频率,并做了排序处理,支持中文和英文两种语言. 与网上的仅中文多少字.英文多少字.符号多少字,分别算一个总数出来不一样的,这个工具是 ...

  9. Matlab 高光谱影像信息熵/信噪比计算

    高光谱影像信息熵/信噪比计算 基于matlab实现了高光谱影像个波段信噪比和信息熵的计算 文件导入:影像格式使用的ENVI导出的img+hdr格式,参考的Matlab实现高光谱读取进行的修改.时间伧俗 ...

最新文章

  1. 微型计算机外文文献,电子信息科学与技术专业Microcomputer-Systems微型计算机控制系统大学毕业论文外文文献翻译及原文.doc...
  2. cli3暴露api地址 vue_手把手教你开发 Vue 组件库
  3. android毛玻璃遮罩效果_css3毛玻璃效果[模糊图片]
  4. 书店售书最低价格问题
  5. 遵义大数据中心项目工程概况_中策大数据:8月建筑工程项目有哪些?建筑工程项目信息汇总...
  6. 在Linux下开发多语言软件: Hello GetText!
  7. php实现mysql 数据迁移_php实现redis数据库指定库号迁移的方法
  8. 系统吞吐量评估方法 冯凌圣
  9. csuoj-1900 锋芒毕露
  10. Gensim进阶教程
  11. SAP GUI 760 下载
  12. Oracle P6培训系列:03设置用户设置
  13. Windows内核驱动Hook入门
  14. 宏山激光sigmatube套料软件多台电脑安装教程
  15. 用C#实现将大写日期(年/月/日)转化为小写日期(阿拉伯数字的)
  16. 【Web】CSS(No.18)Css经典案例(二)《畅销书排行榜》
  17. x265中Encoder::encode流程
  18. 名帖43 梁启超 隶书《临张迁碑》
  19. 【完整教程】nginx反向代理wss,实现不修改服务器端websocket代码加密通讯请求
  20. 深度学习论文笔记(知识蒸馏)—— FitNets: Hints for Thin Deep Nets

热门文章

  1. Linux驱动开发---杂项设备
  2. 安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0
  3. MOS开关管额定电流的选择
  4. 什么是Memcached?
  5. 好用到爆炸的Chrome谷歌插件下载——妈妈再也不用担心我找不到好的插件了
  6. Android 集成facebook 登录和分享
  7. prop-types详解
  8. python pandas 实现Excel自动填充功能
  9. 7个小学语文学习锦囊,让孩子取得好的成绩(转给家长)
  10. 计算机主板供电,你也可以看懂主板供电相数和用料情况,轻松选好主板