用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)

          

题目:用java程序实现字符的统计,并显示打印出排名前十的高频字符(一般的冠词,代词和虚词除外)
主要涉及的知识点:文件的读取,存取以及排序,分割字符,事件的处理机制

源代码:
/*
 * 题目:用java程序统计文件里出现频率最高的十个词并排序显示(一般的冠词虚词不计入排名)
 * 作者:kasabulan
 * 日期:2014.10.1
 * 功能实现步骤:
        将文件内容存入StringBuffer然后利用split()函数分割字符串,可按(“,”,“.”,“!”/n“空格”用
       选择语句排除一般的虚词冠词(可以吧这些词统一存在一个地方再比较),最后进行排序。
  

---------------------------------------------------------------------------
 */
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.*;
  
public class Tong1 {
     public static void main(String[] args) 
     {
         try {
             BufferedReader br = new BufferedReader(new FileReader("D:\\test.txt"));//新建缓存区读取为所需统计文件的读取
             
             StringBuffer mp= new StringBuffer();//更新字符缓存为mp
             String s;
             ;//把要统计的文件装入字符串m
          while (( s=br.readLine())!= null) {
                 mp.append(s);//设置字符缓存的搜索路径是字符串m
             }
             Map   map = new HashMap();//运用哈希排序的方法进行排序
             StringTokenizer st = new StringTokenizer(mp.toString(),",.! \n");//分割字符串
           //用来测试是否有此标记生成器的字符串可以有更多的标记。并把分割好的单词保存在letter字符串中。
             while (st.hasMoreTokens()) {
                 String letter = st.nextToken();
                 int count;
                 if (map.get(letter) == null) {
                     count = 1;//表明了没有进行分割。
                 } else {
                     count = map.get(letter).intValue() + 1;
                 }
                 map.put(letter,count);
             }
             Set set = new TreeSet();
             for (String key : map.keySet()) {
                 set.add(new WordEntity(key,map.get(key)));
             }
            
             
             System.out.println("频率排名前十的单词是:");
             int count = 1;
             for (Iterator it = set.iterator(); it.hasNext(); ) {
                 WordEntity w = it.next();
//以下的if语句较为繁琐,由于有太多的冠词代词还有虚词了
                 if(!w.getKey().equals("the")&&!w.getKey().equals("is")&&!w.getKey().equals("to")&&!w.getKey().equals("by")&&!w.getKey().equals("is")&&!w.getKey().equals("a")&&!w.getKey().equals("and")&&!w.getKey().equals("was")&&!w.getKey().equals("has")&&!w.getKey().equals("had")&&!w.getKey().equals("I")&&!w.getKey().equals("for")&&!w.getKey().equals("my")&&!w.getKey().equals("me")&&!w.getKey().equals("with")&&!w.getKey().equals("of")&&!w.getKey().equals("in")&&!w.getKey().equals("on")&&!w.getKey().equals("that")&&!w.getKey().equals("it")&&!w.getKey().equals("The")&&!w.getKey().equals("at")&&!w.getKey().equals("which")&&!w.getKey().equals("he")&&!w.getKey().equals("as")
                		 &&!w.getKey().equals("but")&&!w.getKey().equals("his")&&!w.getKey().equals("from")&&!w.getKey().equals("some")&&!w.getKey().equals("be")&&!w.getKey().equals("were")&&!w.getKey().equals("not") &&!w.getKey().equals("they")&&!w.getKey().equals("this")&&!w.getKey().equals("an")&&!w.getKey().equals("no")&&!w.getKey().equals("into")&&!w.getKey().equals("It")&&!w.getKey().equals("there")&&!w.getKey().equals("But")&&!w.getKey().equals("him")&&!w.getKey().equals("could")&&!w.getKey().equals("been")&&!w.getKey().equals("would")&&!w.getKey().equals("she")&&!w.getKey().equals("then")&&!w.getKey().equals("Then")&&!w.getKey().equals("have"))
                		 { System.out.println("第" + count + "名为单词:" + w.getKey() + " 出现的次数为: "
                         + w.getCount());
                 if (count == 10)// 当输出10个后跳出循环
                     break;
                 count++;
             }
                 }
         } catch (FileNotFoundException e) {
             System.out.println("文件未找到~!");//异常处理
         } catch (IOException e) {
             System.out.println("文件读异常~!");//异常处理
         }
     }
 }
class WordEntity implements Comparable {
	    private String key;
	    private Integer count;
	    public WordEntity (String key, Integer count) {
	        this.key = key;
	        this.count = count;
	    }
	    public int compareTo(WordEntity o) {
	        int cmp = count.intValue() - o.count.intValue();
	        return (cmp == 0 ? key.compareTo(o.key) : -cmp);
	        //只需在这儿加一个负号就可以决定是升序还是降序排列  -cmp降序排列,cmp升序排列
	        //因为TreeSet会调用WorkForMap的compareTo方法来决定自己的排序
	    }
	 
	 
	    public String toString() {
	        return key + " 出现的次数为:" + count;
	    }
	 
	   public String getKey() {
	        return key;
	    }
	 
	   public Integer getCount() {
	        return count;
	    }
	}
	 
  

以下为实验的截图,统计文件大小为90kb

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第1张图片

用Eclipse自带的性能测试软件Jvisualvm进行性能测试,以下为测试截图:

在未启动程序之前的cpu及线程情况:用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第2张图片

然后运行程序以后的测试图:

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第3张图片

接着是线程图:

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第4张图片

接下来是方法工作截图:

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第5张图片

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第6张图片

用java程序分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来(一般的冠词,虚词除外)_第7张图片


 
   
  

不足点:在解决代词,冠词和虚词的影响的时候运用的方法不是很好,我选择的是用if条件语句来进行筛选,但是由于冠词代词和虚词等额量太大了,所以很是麻烦。我想是不是可以在网上下载一个代词冠词虚词的单词大全

然后再进行文件的比对,这样或许精确度会高一些。

 


你可能感兴趣的:(计算机科学与技术)