Java文本处理8-统计文本中汉字的信息熵

该博客介绍了如何使用Java统计文本中每个汉字的信息熵。通过读取文本,统计汉字出现频率,利用信息熵公式计算并打印结果,同时将结果保存到指定文件。内容包括两个任务,分别实现了在控制台输出和保存到文件的功能。
摘要由CSDN通过智能技术生成

1、任务简介

本节任务是在上一节任务《Java文本处理7-查询文本中单个汉字的信息熵》的基础上统计文本中每一个汉字的信息熵,关于信息熵计算的方法在上一节任务中已经阐述过了,本节的第一个程序是将结果打印出来,而第二个程序是将结果保存到一个指定文本中。


2、基本任务和代码

(1)任务1

1)任务内容

统计指定文本中每一个汉字的信息熵,然后将统计结果打印出来。

2)具体思路

关于具体思路使用到了上两节内容的知识,具体如下:
(1)首先需要使用InputStreamReader类和BufferedReader类实现文本的读取,由于我使用的《西游记》为utf-8编码,所以还需要指定编码格式为utf-8;

(2)然后需要定义一个空的字符串变量,在对文本逐行读出后将读出的内容追加到该空字符串后;
(3)逐行读出文档,然后使用for循环对该行中的每一个字符进行遍历,使用toString()方法得到每一个字符,再使用if语句和matches()方法检测字符是否为汉字,若匹配则对指定的变量进行自增,求出总的汉字数;

(4)需要使用TreeMap方法来进行字频的统计,需要使用public static构造一个静态方法,由于是对字频进行统计,所以还需要确保字符为汉字才能进行统计,故还需要使用Matcher类进行字符串的匹配操作,若该字符为汉字则进行统计;

(5)在主函数中调用构造出来的TreeMap方法,并进行降序排序,再使用信息熵的计算公式将该汉字的信息上计算出来,最后使用Collections.sort()构造排序比较器再将每一个汉字的key值、value值和熵值打印出来。

3)任务代码

程序保存为shang2.java,代码如下:

import java.io.*;//导入java.io包中的所有类
import java.util.*;//导入java.util包中的所有类
import java.util.Map.Entry;//导入java.util.Map包中的Entry类
public class shang2 {
   //类名
    public static void main(String[] args)  {
   //程序主函数
        try {
   //try代码块,当发生异常时会转到catch代码块中
        	//读取指定的文件
        	Scanner s = new Scanner(System.in);//创建scanner,控制台会一直等待输入,直到敲回车结束
        	System.out.println("请输入想要打开的文本文档:");//输入提示信息
        	String a = s.nextLine();//定义字符串变量,并赋值为用户输入的信息
        	//创建类进行文件的读取,并指定编码格式为utf-8
        	InputStreamReader read = new InputStreamReader(new FileInputStream(a),"utf-8"); 
            BufferedReader in = new BufferedReader(read);//可用于读取指定文件     
			StringBuffer b = new StringBuffer();//定义一个字符串变量b,便于后续进行内容追加的操作
			String str = null;//定义一个字符串类型变量str
			String d=null;//定义一个字符串类型变量d
			double e = 0;//定义一个double型变量,用于统计总汉字数
			int i = 0;//定义一个整型变量
			while((str = in.readLine()) != null) {
   //readLine()方法, 用于读取一行,只要读取内容不为空就一直执行
				b.append(str);//将该行内容追加到字符串b的后面
				for (int j = 0; j < str.length(); j++) {
   //for循环的条件,当j小于该行长度时就一直循环并自增
            		d = Character.toString(str.charAt(j));//返回一个字符串对象
            		if (d.matches("[\\u4e00-\\u9fa5]")) {
   //if语句的条件,判断是否为汉字
                        e++;//若为汉字则e自增
                    }
			    }
			}
			TreeMap<Character,Integer>tm =Pross(b.toString());//调用TreeMap函数
			System.out.println("汉字统计结果:");//输出结果
			List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值