Java实现的词频统计——功能改进

  本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能。

功能:

  1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计;

  2.支持命令行输入英文作品的文件名;

  3.支持命令行输入存储有英文作品文件的目录名,批量统计;

  4.从控制台读入英文单篇作品,重定向输入流。

实现:

  1.判断输入方式,如果从命令行传递参数则直接对文件进行统计;如果未传递参数,其方式同控制台相同,由用户从标准输入流输入到文件,再对文件进行词频统计。这里如果传入文件路径时会对其是否是文件夹进行判断,如果是文件夹,则对其目录中的文件进行统计。

 1 if (args.length == 0) {
 2             Scanner in = new Scanner(System.in);
 3             FileWriter out = new FileWriter("Content.txt");
 4
 5             System.out.println("请输入内容,最后以Q结束:");
 6
 7             while (in.hasNext()) {
 8                 out.write(in.nextLine()+"\r\n");
 9             }
10             out.close();
11             in.close();
12
13             new FileProccessing("Content.txt");
14         }
15         for (int i = 0; i < args.length; i++) {
16             String FileName = args[i];
17             File fs = new File(FileName);
18             if (fs.isDirectory()) {
19                 File[] filelist = fs.listFiles();
20                 for (int n = 0; n < filelist.length; n++) {
21                     new FileProccessing(filelist[n].getAbsolutePath());
22                 }
23
24             } else {
25                 new FileProccessing(FileName);
26             }
27         }

  2.对ByValueComparator类做了修改,使其能够按词频降序排列的同时,对同频率的单词进行升序排列。

 1 public class ByValueComparator implements Comparator<Entry<String,Integer>> {
 2     Map<String, Integer> hashmap;
 3     public ByValueComparator(Map<String, Integer> hm) {
 4         this.hashmap = hm;
 5     }
 6
 7     @Override
 8     public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
 9         // TODO Auto-generated method stub
10
11         if (o1.getValue().compareTo(o2.getValue()) == -1) {
12             return 1;
13         } else if (o1.getValue().compareTo(o2.getValue()) == 0) {
14             return o1.getKey().compareTo(o2.getKey());  //单次出现频率相同时,对单词进行升序排列
15         } else {
16             return -1;
17         }
18     }
19 }

  3.与上一次相比,为了方便调用,将对文件进行统计操作的代码归入新的类FileProccessing。同时将readline()改为read(char[] c),解决了当一行字符过多时报错的问题。当进行统计的文件过大时,原本输出到屏幕会自动改为输出到文件中,避免了因输出而占用了大部分时间,同时方便用户查阅(默认输出到工程目录下)。

  其中有个小细节:程序中char数组默认大小为64,当读到最后一块时,字符不足64个时,多余未读入字符的数组元素默认为‘\0‘,拆分之后输出结果中会多出一项“    ——1”。因此,在StringTokenizer方法中要录入"\0"作为分隔字符。

  读入文件并进行统计,结果存入到hashmap中:

 1         int i = 0;
 2         char[] c = new char[64];
 3         String thelast = "";
 4         String wordpart = "";
 5         while ((i = br.read(c)) > 0) {
 6             wordpart = "";
 7
 8             int m = i - 1;
 9             while (Character.isLetter(c[m])) {
10                 wordpart = String.valueOf(c[m]) + wordpart;
11                 c[m] = ‘ ‘;
12                 m--;
13             }
14             String s = thelast + String.valueOf(c);
15             StringTokenizer st = new StringTokenizer(s, " ,.!?\"\‘;:0123456789\n\r\t“”‘’·——-=*/()[]{}…()【】{}\0"); // 用于切分字符串
16
17             while (st.hasMoreTokens()) {
18                 String word = st.nextToken();
19                 if (hm.get(word) != null) {
20                     int value = ((Integer) hm.get(word)).intValue();
21                     value++;
22                     hm.put(word, new Integer(value));
23                 } else {
24                     hm.put(word, new Integer(1));
25                 }
26             }
27             thelast = wordpart;
28         }
29         if (!wordpart.isEmpty()) {
30             if (hm.get(wordpart) != null) {
31                 int value = ((Integer) hm.get(wordpart)).intValue();
32                 value++;
33                 hm.put(wordpart, new Integer(value));
34             } else {
35                 hm.put(wordpart, new Integer(1));
36             }
37         }

  判断输出内容多少,自动匹配标准输出还是文件输出。其中运用了正则替换,用来打印当前文件名。同时还对总单词量及词汇量进行了统计:

 1         int NumofWord = 0;
 2         Iterator iter = hm.entrySet().iterator();
 3         while (iter.hasNext()) {
 4             Map.Entry entry = (Map.Entry) iter.next();
 5             NumofWord += (Integer) entry.getValue();
 6         }
 7         String reg = ".*\\\\(.*)";
 8         String name = filename.replaceAll(reg, "$1");
 9         if (hm.size() > 100) {
10
11             FileWriter result = new FileWriter("Result.txt", true);
12
13             result.write("~~~~~~~~~~~~~~~~~~~~\r\n");
14             result.write(name.substring(0, name.lastIndexOf(".")) + "\r\n");
15             result.write("number of the words:" + NumofWord + "\r\n");
16             result.write("totals:" + hm.size() + "\r\n");
17             for (Map.Entry<String, Integer> str : ll) {
18                 result.write(str.getKey() + "——" + str.getValue() + "\r\n");
19             }
20
21             result.write("~~~~~~~~~~~~~~~~~~~~\r\n");
22
23             System.out.println("由于" + name.substring(0, name.lastIndexOf(".")) + "文件过大,输出到文件Result中。");
24             result.close();
25         } else {
26             System.out.println("~~~~~~~~~~~~~~~~~~~~");
27             System.out.println(name.substring(0, name.lastIndexOf(".")));
28             System.out.println("number of the words:" + NumofWord);
29             System.out.println("totals:" + hm.size());
30             for (Map.Entry<String, Integer> str : ll) {
31                 System.out.println(str.getKey() + "——" + str.getValue());
32             }
33
34             System.out.println("~~~~~~~~~~~~~~~~~~~~");
35         }

运行结果:

  1.命令行标准输入界面:

  

  2.执行结果:

  

  3.控制台界面:

  

  4.命令行传入文件:

  

  5.同时传入大文件及文件夹:

  

  

  6.重定向输入:

  

代码地址:

  HTTPS   https://coding.net/u/regretless/p/WordFrequencyCount/git

  SSH      [email protected]:regretless/WordFrequencyCount.git

  GIT       git://git.coding.net/regretless/WordFrequencyCount.git

时间: 2024-08-15 03:13:41

Java实现的词频统计——功能改进的相关文章

词频统计-功能一

一.完成一个小程序 我 拿到这个题目之后,就决定用最不熟悉的c#来实现,因为老师说不懂的去学才会有进步.布置任务后的第二天就开始去图书馆借了两本书<c#从入门到精髓>,<c#项目实战>,拿到书之后看了入门书<c#从入门到精髓>,看书的过程时痛苦的,因为发现大二选修课学的c#全交还给老师了,只能重头再学了.唯一有点印象的就是窗口应用程序,基于UI的设计. 写代码首先需要工具,由于电脑上没有visual studio的安装包,当时求助了度娘. 如果没有安装包的同学们,可以借

词频统计-功能二

一.完成一个小程序 今天的任务是处理一本英文小说.我处理的英文小说是<war and peace> 本想着用多线程来解决的,发现看书还不是太懂,并不能真正动手编程. 我在编程的过程中主要遇到了以下两个问题: 1.在对整个英文小说进行单词总数统计遇见困难. 2.字符串数组的空字符串处理问题.因为我开始用空格来代替标点等不是英文单词来进行对单词分割,其中用到了正则表达式,后来统计对单词出现频数时,发现空格竟然排第一名,有4万多空格. 最终我的处理方式是使用List泛型集合的ForEach方法循环获

Java实现的词频统计——Web迁移

本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英文小说词频统计结果: 3.支持用户自定义单词分隔符: 4.词汇范围对比(额外项). 实现: 1.迁移至web工程中,支持用户手动选择txt文件上传: 2.用户提交之后,会在后台运行词频统计函数,并且将统计结果的前10项打印到屏幕上: 3.统计结果文件Result.txt可以进

Java实现的词频统计

要求: 1.读取文件: 2.记录出现的词汇及出现频率: 3.按照频率降序排列: 4.输出结果. 概要: 1.读取的文件路径是默认的,为了方便调试,将要统计的文章.段落复制到文本中即可:2.只支持英文:3.会按照词汇出现的频率降序排列. 实现: 1.使用FileReader.BufferedReader读取文件: 2.采用StringTokenizer进行字符分割: 3.用hashmap保存统计数据: 4.自定义一个类用来实现按value排序: 5.输出结果. 默认路径文件: 1 String f

Java实现的词频统计——单元测试

前言:本次测试过程中发现了几个未知字符,这里将其转化为十六进制码对其加以区分. 1)保存统计结果的Result文件中显示如图: 2)将其复制到eclipse环境下的切分方法StringTokenizer中却没有显示: 复制前: 复制后: 前后看似没有任何变化: 3)改动后的统计结果: 因此为了检测这个字符做了一个将其转化为十六进制码的小程序: 1 String t = "\0"; 2 String s = "\0"; 3 byte[] bbb = t.getByte

java实现文本词频统计

File f=new File(path); Map<String,Integer>map=new HashMap<>(); Version matchVersion = Version.LUCENE_31; Analyzer analyzer = new StopAnalyzer(matchVersion); BufferedReader br = new BufferedReader(new FileReader(f));//读取文件 TokenStream ts = anal

201671010423 词频统计软件项目报告

需求分析 1.程序可读入任意英文文本文件,该文件中英文词数大于等于1个. 2.程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. 基本功能 1.指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. 2.高频词统计功能:用户从键盘输入高频词输出的个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词. 3.统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件

201671010454词频统计软件项目报告

一.课程名称:2016级计算机科学与工程学院软件工程(西北师范大学) 二.课程要求:实验二 软件工程个人项目 三.实验目标: (1)掌握软件项目个人开发流程. (2)掌握Github上发布软件项目的操作方法. 四.实验内容: (一)需求分析 程序可读入任意英文文本文件,改文件中英文词数大于等于1个,且能读取容纳英文原版<哈利波特>10万词以上的文章. 指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. 高

201671010441徐浩杰 词频统计软件项目报告

实验二.软件工程个人项目 一.需求分析 尝试按照<构建之法>第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发.软件基本功能要求如下: •程序可读入任意英文文本文件,该文件中英文词数大于等于1个. •程序需要很壮健,能读取容纳英文原版<哈利波特>10万词以上的文章. •指定单词词频统计功能:用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图. •高频词统计功能:用户从键盘输入高