第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(),",.! \n"); 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(),",.! \n"); 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 }
實驗結果: