单词统计之单词频率统计

  

第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 }

实验结果:

 

转载于:https://www.cnblogs.com/jmdd/p/11061958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值