单词统计
用户需求:
英语的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); } }