用户需求:
英语的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是同一个单词。
实验思想:
通过文件流读入飘英文版的内容,排除无用字符,统计字母个数,然后计算频率。
实验代码:
统计字母个数和频率
package sy0509_ZiMu; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; public class sy0509 { public static void main(String[] args)throws IOException { List<Integer> list=new ArrayList<>(); DecimalFormat df=new DecimalFormat("######0.00"); //格式化 // File f = new File("D:\飘英文版.txt"); FileInputStream fip = new FileInputStream("D:\飘英文版.txt"); InputStreamReader reader = new InputStreamReader(fip, "gbk"); StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read()); } System.out.println(sb.toString()); reader.close(); fip.close(); int i; String A=sb.toString(); String M="abcdefghijklmnopqrstuvwxyz"; String temp = ""; char NUM[]=new char[A.length()]; char Z[]=new char[26]; int X[]=new int[26]; int MAX=0; Z=M.toCharArray(); for(int k=0;k<26;k++) { X[k]=0; for(i=0;i<A.length();i++) { NUM[i]=A.charAt(i); if(Z[k]==NUM[i]||Z[k]==ch(NUM[i])) { X[k]++; } } } System.out.println("这篇文章中英文字母个数分别为:"); double sum=0; System.out.println("////////////排序如下:"); for(i=0;i<25;i++) for(int k=0;k<25-i;k++) { if(X[k]<X[k+1]) { int temp2=X[k]; X[k]=X[k+1]; X[k+1]=temp2; char temp3=Z[k]; Z[k]=Z[k+1]; Z[k+1]=temp3; } } for(i=0;i<26;i++) { System.out.println(Z[i]+"字母个数为:"+X[i]); sum=sum+X[i]; } for(i=0;i<26;i++) { double jkl=(X[i])/sum*100; System.out.println(Z[i]+"字母频率为:"+df.format(jkl)+"%"); } } static char ch(char c) { if(!(c>=97&&c<=122)) c+=32; return c; } }
实验结果截图: