单词统计

用户需求:

英语的26 个字母的频率在一本小说中是如何分布的?

某类型文章中常出现的单词是什么?

某作家最常用的词汇是什么?

《哈利波特》 中最常用的短语是什么,等等。

我们就写一些程序来解决这个问题,满足一下我们的好奇心。

第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。

字母频率 = 这个字母出现的次数 / (所有A-Z,a-z字母出现的总数)

如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。

第1步:输出单个文件中的前 N 个最常出现的英语单词。

作用:一个用于统计文本文件中的英语单词出现频率。

单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。

英文字母:A-Z,a-z

字母数字符号:A-Z,a-z,0-9

第1步:输出单个文件中的前 N 个最常出现的英语单词。

分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。good,Good和GOOD是同一个单词。

 

【思路分析】

   * 将txt按行读入程序

   * 然后每一行进行统计,新建字母数组,将每个字母出现的次数都统计进去

        * 将所有字母的个数进行统计

   * 然后求每个字母出现的频率,存到数组中

   ***  对于单词的统计和字母类似,按行读入后对每一行进行分割,然后判断单词是否出现过,如果出现则num++,如果没有则将单词存进数组且次数为1;最后进行汇总。***

package tongjizimn;


import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
  
public class tj0
 {
  /**
   *
 功能:Java读取txt文件的内容
   *
 步骤:1:先获得文件句柄
   *
 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
   *
 3:读取到输入流后,需要读取生成字节流
   *
 4:一行一行的输出。readline()。
   *
 备注:需要考虑的是异常情况
   *
 @param filePath
   */
  public static void readTxtFile(String
 filePath){
      Word_Time str[] = new Word_Time[100000];
      int i = 0;
      int k;
      try {
        String encoding="GBK";
        File file=new File(filePath);
        String Huafen[];
        if(file.isFile()&& file.exists())
        { //判断文件是否存在
            InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到编码格式
            BufferedReader bufferedReader = new BufferedReader(read);
            String lineTxt = null;
            String passage = "";
            /**
             * 对读入文件逐行进行操作*/
            while((lineTxt = bufferedReader.readLine()) != null)
            {
                passage += lineTxt;
                //System.out.println(lineTxt);
            }
            
            Huafen = passage.split("\\,|\\.|\\?|\\!|\"|\\:| |\\;|\\—— |\\  |\\ ");
            System.out.println(Arrays.toString(Huafen));
            ArrayList list = new ArrayList();
            ArrayList<danci> dl = new ArrayList<danci>();
            ArrayList<zimu> zl = new ArrayList<zimu>();
            char charc[] = passage.toCharArray();
            float sum[] = {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};
            float sum2[] = {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(i=0;i<charc.length;i++) 
            {
                char a = charc[i];
                switch (a)
                {
                case 'a':sum[0]++;break;
                case 'b':sum[1]++;break;
                case 'c':sum[2]++;break;
                case 'd':sum[3]++;break;
                case 'e':sum[4]++;break;
                case 'f':sum[5]++;break;
                case 'g':sum[6]++;break;
                case 'h':sum[7]++;break;
                case 'i':sum[8]++;break;
                case 'j':sum[9]++;break;
                case 'k':sum[10]++;break;
                case 'l':sum[11]++;break;
                case 'm':sum[12]++;break;
                case 'n':sum[13]++;break;
                case 'o':sum[14]++;break;
                case 'p':sum[15]++;break;
                case 'q':sum[16]++;break;
                case 'r':sum[17]++;break;
                case 's':sum[18]++;break;
                case 't':sum[19]++;break;
                case 'u':sum[20]++;break;
                case 'v':sum[21]++;break;
                case 'w':sum[22]++;break;
                case 'x':sum[23]++;break;
                case 'y':sum[24]++;break;
                case 'z':sum[25]++;break;
                case 'A':sum[0]++;break;
                case 'B':sum[1]++;break;
                case 'C':sum[2]++;break;
                case 'D':sum[3]++;break;
                case 'E':sum[4]++;break;
                case 'F':sum[5]++;break;
                case 'G':sum[6]++;break;
                case 'H':sum[7]++;break;
                case 'I':sum[8]++;break;
                case 'J':sum[9]++;break;
                case 'K':sum[10]++;break;
                case 'L':sum[11]++;break;
                case 'M':sum[12]++;break;
                case 'N':sum[13]++;break;
                case 'O':sum[14]++;break;
                case 'P':sum[15]++;break;
                case 'Q':sum[16]++;break;
                case 'R':sum[17]++;break;
                case 'S':sum[18]++;break;
                case 'T':sum[19]++;break;
                case 'U':sum[20]++;break;
                case 'V':sum[21]++;break;
                case 'W':sum[22]++;break;
                case 'X':sum[23]++;break;
                case 'Y':sum[24]++;break;
                case 'Z':sum[25]++;break;
                }
            }
            int zmsum = 0;
            for(int l = 0;l < sum.length;l++ ) //计算字母总数
            {
                zmsum += sum[l];
            }
            for(int l = 0;l<sum2.length;l++) //将率存到sum2里
            {
                sum2[l] = sum[l]/zmsum;
            }
               char a = 97;
               for(int s=0;s<sum2.length;s++)
               {
                   
                   zimu z = new zimu(a++,sum2[s]);
                   zl.add(z);
               }
               zimu zmarray[] = new zimu[26];//转换数组
               zl.toArray(zmarray);
               for(int q=0;q<zmarray.length;q++){

                for(int j=0;j<zmarray.length-q;j++){
                    if(zmarray[j].getSum()<zmarray[j+1].getSum())
                    {
                        zimu h = zmarray[j];
                        zmarray[j] = zmarray[j+1];
                        zmarray[j+1] = h;
                    }
                    }
                //交换位置
                
            }
               for(int s = 0;s<zmarray.length;s++)
               {
                   System.out.println(zmarray[s].getS()+"频率:"+String.format("%.2f", zmarray[s].getSum()));
//                   System.out.println(zl.get(s).s+"的频率为:"+String.format("%.2f", zl.get(s).sum));
               }
               danci array[] = new danci[30000];           
            for(i=0;i<Huafen.length;i++)
            {
                if(!list.contains(Huafen[i])&&Huafen[i]!=" ")
                    list.add(Huafen[i]);
                for(k = 0;k < list.size();k++)
                {
                    int flage = 0;
                    for(int j = 0;j < Huafen.length;j++)
                    {
                        if(list.get(k).equals(Huafen[j]))
                            flage ++;
                    }
                    danci bean=new danci((String) list.get(k),flage);
                    dl.add(bean);
//                    System.out.print(list.get(k) + " ");
//                    System.out.println(flage);
                }
            }
            System.out.println("--------分割线---------");
            dl.toArray(array);
            System.out.println("dl.size="+dl.size());
            System.out.println("array.length="+array.length);
            for(int q=0;q<dl.size();q++){
                for(int j=0;j<dl.size()-q;j++){
                    if(array[j].num<array[j+1].num)
                    {
                        danci h = array[j];
                        array[j] = array[j+1];
                        array[j+1] = h;
                    }
                    }
                //交换位置
                
            } 
            for(int q = 0;q<dl.size();q++)
                System.out.println(q+array[q].danci + "出现的次数为:" + array[q].num);
            read.close();
        }
        
        else{
            System.out.println("找不到指定的文件");
            }
        }
        catch (Exception e) 
    {
          System.out.println("读取文件内容出错");
          e.printStackTrace();
    }

    
  }
    
    public static void main(String arges[])
    {
          
        String filePath = "E:\\Program Files\\eclipse操作\\TongJiDanCi\\src\\tongjizimn\\piao.txt";
          
          readTxtFile(filePath);
          
    }  
  
}

 

posted @ 2019-05-05 21:51  枫黎  阅读(135)  评论(0编辑  收藏  举报