第1步:输出单个文件中的前 N 个最常出现的英语单词。
功能1:输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。
功能2: 指定文件目录,对目录下每一个文件执行统计的操作。
功能3:指定文件目录,是会递归遍历目录下的所有子目录的文件进行统计单词的功能。
功能4:输出出现次数最多的前 n 个单词,
例如, 提示统计统计前多少名:输入10。 就是输出最常出现单词的前 10 名。 当没有指明数量的时候,我们默认列出所有单词的频率。
第2步:第二步: 支持 stop words
在一本小说里, 频率出现最高的单词一般都是 "a", "it", "the", "and", "this", 这些词, 可以做一个 stop word 文件 (停词表), 在统计词汇的时候,跳过这些词。 我们把这个文件叫 "stopwords.txt" file.
第三步: 想看看常用的短语是什么, 怎么办呢?
先定义短语:"两个或多个英语单词, 它们之间只有空格分隔". 请看下面的例子:
hello world //这是一个短语
hello, world //这不是一个短语
同一频率的词组, 按照字典序来排列。
第四步:把动词形态都统一之后再计数。
想找到常用的单词和短语,但是发现英语动词经常有时态和语态的变化,导致同一个词,同一个短语却被认为是不同的。 怎么解决这个问题呢?
假设我们有这样一个文本文件,这个文件的每一行都是这样构成:
动词原型 动词变形1 动词变形2... ,词之间用空格分开。
e.g. 动词 TAKE 有下面的各种变形:take takes took taken taking
我们希望在实现上面的各种功能的时候,有一个选项, 就是把动词的各种变形都归为它的原型来统计。
功能 支持动词形态的归一化
实验代码:
1 package sy0509_ZiMu; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.text.DecimalFormat; 9 import java.util.ArrayList; 10 import java.util.HashMap; 11 import java.util.Iterator; 12 import java.util.List; 13 import java.util.StringTokenizer; 14 15 16 public class sy0509 { 17 public static void main(String[] args)throws IOException 18 { 19 List<Integer> list=new ArrayList<>(); 20 DecimalFormat df=new DecimalFormat("######0.00"); //格式化 21 File f = new File("D:\飘英文版.txt"); 22 FileInputStream fip = new FileInputStream("D:\飘英文版.txt"); 23 InputStreamReader reader = new InputStreamReader(fip, "gbk"); 24 StringBuffer sb = new StringBuffer(); 25 while (reader.ready()) { 26 sb.append((char) reader.read()); 27 } 28 System.out.println(sb.toString()); 29 reader.close(); 30 fip.close(); 31 32 int i; 33 String A=sb.toString(); 34 String M="abcdefghijklmnopqrstuvwxyz"; 35 String temp = ""; 36 char NUM[]=new char[A.length()]; 37 char Z[]=new char[26]; 38 int X[]=new int[26]; 39 int MAX=0; 40 Z=M.toCharArray(); 41 for(int k=0;k<26;k++) 42 { 43 X[k]=0; 44 for(i=0;i<A.length();i++) 45 { 46 NUM[i]=A.charAt(i); 47 if(Z[k]==NUM[i]||Z[k]==ch(NUM[i])) 48 { 49 X[k]++; 50 } 51 } 52 } 53 System.out.println("这篇文章中英文字母个数分别为:"); 54 double sum=0; 55 System.out.println("////////////排序如下:"); 56 for(i=0;i<25;i++) 57 for(int k=0;k<25-i;k++) 58 { 59 if(X[k]<X[k+1]) 60 { 61 int temp2=X[k]; 62 X[k]=X[k+1]; 63 X[k+1]=temp2; 64 char temp3=Z[k]; 65 Z[k]=Z[k+1]; 66 Z[k+1]=temp3; 67 } 68 } 69 for(i=0;i<26;i++) 70 { 71 System.out.println(Z[i]+"字母个数为:"+X[i]); 72 sum=sum+X[i]; 73 } 74 for(i=0;i<26;i++) 75 { 76 double jkl=(X[i])/sum*100; 77 System.out.println(Z[i]+"字母频率为:"+df.format(jkl)+"%"); 78 } 79 StringTokenizer st = new StringTokenizer(sb.toString(),",.! "); 80 String []a1=StatList(sb.toString()); 81 int[]b1=StatList1(sb.toString()); 82 System.out.println("//////////////////////////////"); 83 for(i=0;i<a1.length-1;i++) 84 for(int j=0;j<a1.length-1-i;j++) 85 { 86 if(b1[j]<b1[j+1]) 87 { 88 int temp6=b1[j]; 89 b1[j]=b1[j+1]; 90 b1[j+1]=temp6; 91 String temp7=a1[j]; 92 a1[j]=a1[j+1]; 93 a1[j+1]=temp7; 94 } 95 } 96 for(i=0;i<a1.length-1;i++) 97 { 98 System.out.println("单词:"+a1[i]+" 且出现的次数:"+b1[i]); 99 } 100 } 101 static char ch(char c) 102 { 103 if(!(c>=97&&c<=122)) 104 c+=32; 105 return c; 106 } 107 static String[] StatList(String str) { 108 StringBuffer sb = new StringBuffer(); 109 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 110 String[] slist = str.split("\W+"); 111 int sum=0; 112 int sum1=0; 113 for (int i = 0; i < slist.length; i++) { 114 if (!has.containsKey(slist[i])) { // 若尚无此单词 115 has.put(slist[i], 1); 116 sum++; 117 sum1++; 118 } else {//如果有,就在将次数加1 119 Integer nCounts = has.get(slist[i]); 120 121 has.put(slist[i],nCounts+1 ); 122 } 123 } 124 int temp=0; 125 int temp1=0; 126 String []a=new String[sum]; 127 int []b=new int[sum1]; 128 Iterator iterator = has.keySet().iterator(); 129 while(iterator.hasNext()){ 130 String word = (String) iterator.next(); 131 a[temp]=word; 132 temp++; 133 } 134 return a; 135 } 136 static int[] StatList1(String str) { 137 StringBuffer sb = new StringBuffer(); 138 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 139 String[] slist = str.split("\W+"); 140 int sum=0; 141 int sum1=0; 142 for (int i = 0; i < slist.length; i++) { 143 if (!has.containsKey(slist[i])) { // 若尚无此单词 144 has.put(slist[i], 1); 145 sum++; 146 sum1++; 147 } else {//如果有,就在将次数加1 148 Integer nCounts = has.get(slist[i]); 149 150 has.put(slist[i],nCounts+1 ); 151 152 } 153 } 154 int temp=0; 155 int temp1=0; 156 String []a=new String[sum]; 157 int []b=new int[sum1]; 158 Iterator iterator = has.keySet().iterator(); 159 while(iterator.hasNext()){ 160 String word = (String) iterator.next(); 161 b[temp1]=has.get(word); 162 temp1++; 163 } 164 return b; 165 } 166 }//jcc 167 package sy0509_ZiMu; 168 169 import java.io.BufferedReader; 170 import java.io.File; 171 import java.io.FileInputStream; 172 import java.io.IOException; 173 import java.io.InputStreamReader; 174 import java.text.DecimalFormat; 175 import java.util.ArrayList; 176 import java.util.HashMap; 177 import java.util.Iterator; 178 import java.util.List; 179 import java.util.StringTokenizer; 180 181 182 public class sy0509 { 183 public static void main(String[] args)throws IOException 184 { 185 List<Integer> list=new ArrayList<>(); 186 DecimalFormat df=new DecimalFormat("######0.00"); //格式化 187 File f = new File("D:\飘英文版.txt"); 188 FileInputStream fip = new FileInputStream("D:\飘英文版.txt"); 189 InputStreamReader reader = new InputStreamReader(fip, "gbk"); 190 StringBuffer sb = new StringBuffer(); 191 while (reader.ready()) { 192 sb.append((char) reader.read()); 193 } 194 System.out.println(sb.toString()); 195 reader.close(); 196 fip.close(); 197 198 int i; 199 String A=sb.toString(); 200 String M="abcdefghijklmnopqrstuvwxyz"; 201 String temp = ""; 202 char NUM[]=new char[A.length()]; 203 char Z[]=new char[26]; 204 int X[]=new int[26]; 205 int MAX=0; 206 Z=M.toCharArray(); 207 for(int k=0;k<26;k++) 208 { 209 X[k]=0; 210 for(i=0;i<A.length();i++) 211 { 212 NUM[i]=A.charAt(i); 213 if(Z[k]==NUM[i]||Z[k]==ch(NUM[i])) 214 { 215 X[k]++; 216 } 217 } 218 } 219 System.out.println("这篇文章中英文字母个数分别为:"); 220 double sum=0; 221 System.out.println("////////////排序如下:"); 222 for(i=0;i<25;i++) 223 for(int k=0;k<25-i;k++) 224 { 225 if(X[k]<X[k+1]) 226 { 227 int temp2=X[k]; 228 X[k]=X[k+1]; 229 X[k+1]=temp2; 230 char temp3=Z[k]; 231 Z[k]=Z[k+1]; 232 Z[k+1]=temp3; 233 } 234 } 235 for(i=0;i<26;i++) 236 { 237 System.out.println(Z[i]+"字母个数为:"+X[i]); 238 sum=sum+X[i]; 239 } 240 for(i=0;i<26;i++) 241 { 242 double jkl=(X[i])/sum*100; 243 System.out.println(Z[i]+"字母频率为:"+df.format(jkl)+"%"); 244 } 245 StringTokenizer st = new StringTokenizer(sb.toString(),",.! "); 246 String []a1=StatList(sb.toString()); 247 int[]b1=StatList1(sb.toString()); 248 System.out.println("//////////////////////////////"); 249 for(i=0;i<a1.length-1;i++) 250 for(int j=0;j<a1.length-1-i;j++) 251 { 252 if(b1[j]<b1[j+1]) 253 { 254 int temp6=b1[j]; 255 b1[j]=b1[j+1]; 256 b1[j+1]=temp6; 257 String temp7=a1[j]; 258 a1[j]=a1[j+1]; 259 a1[j+1]=temp7; 260 } 261 } 262 for(i=0;i<a1.length-1;i++) 263 { 264 System.out.println("单词:"+a1[i]+" 且出现的次数:"+b1[i]); 265 } 266 } 267 static char ch(char c) 268 { 269 if(!(c>=97&&c<=122)) 270 c+=32; 271 return c; 272 } 273 static String[] StatList(String str) { 274 StringBuffer sb = new StringBuffer(); 275 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 276 String[] slist = str.split("\W+"); 277 int sum=0; 278 int sum1=0; 279 for (int i = 0; i < slist.length; i++) { 280 if (!has.containsKey(slist[i])) { // 若尚无此单词 281 has.put(slist[i], 1); 282 sum++; 283 sum1++; 284 } else {//如果有,就在将次数加1 285 Integer nCounts = has.get(slist[i]); 286 287 has.put(slist[i],nCounts+1 ); 288 } 289 } 290 int temp=0; 291 int temp1=0; 292 String []a=new String[sum]; 293 int []b=new int[sum1]; 294 Iterator iterator = has.keySet().iterator(); 295 while(iterator.hasNext()){ 296 String word = (String) iterator.next(); 297 a[temp]=word; 298 temp++; 299 } 300 return a; 301 } 302 static int[] StatList1(String str) { 303 StringBuffer sb = new StringBuffer(); 304 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 305 String[] slist = str.split("\W+"); 306 int sum=0; 307 int sum1=0; 308 for (int i = 0; i < slist.length; i++) { 309 if (!has.containsKey(slist[i])) { // 若尚无此单词 310 has.put(slist[i], 1); 311 sum++; 312 sum1++; 313 } else {//如果有,就在将次数加1 314 Integer nCounts = has.get(slist[i]); 315 316 has.put(slist[i],nCounts+1 ); 317 318 } 319 } 320 int temp=0; 321 int temp1=0; 322 String []a=new String[sum]; 323 int []b=new int[sum1]; 324 Iterator iterator = has.keySet().iterator(); 325 while(iterator.hasNext()){ 326 String word = (String) iterator.next(); 327 b[temp1]=has.get(word); 328 temp1++; 329 } 330 return b; 331 } 332 }
实验结果: