• 单词统计


    用户需求:

    英语的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);
              
        }  
      
    }
  • 相关阅读:
    火狐显示不安全链接
    signal信号
    I/O缓冲
    [pe530]GCD of Divisors
    学校寒假集训作业
    纳克萨玛斯「GDOI2007」(网络流)
    [清华集训2016] 汽水
    有上下界网络流
    [AHOI2014]支线剧情(有上下界的网络流)
    [SCOI2016]妖怪
  • 原文地址:https://www.cnblogs.com/flw0322/p/11037277.html
Copyright © 2020-2023  润新知