单词 统计续

 

  

第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

我们希望在实现上面的各种功能的时候,有一个选项, 就是把动词的各种变形都归为它的原型来统计。  

功能 支持动词形态的归一化

package piao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


class letter
{
private char l;
private int count;

public char getL() {
    return l;
}
public void setL(char l) {
    this.l = l;
}
public int getCount() {
    return count;
}
public void setCount(int count) {
    this.count = count;
}

public letter() {};
public letter(char l,int count) 
{
    this.l=l;
    this.count=count;
}
}
class word
{
    private String value;
    private int count;
    
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public word() {};
    public word(String value,int count)
    {
        this.value=value;
        this.count=count;
    }
}

public class Piao {

    public static void main(String[] args)throws FileNotFoundException, IOException {
        // TODO 自动生成的方法存根
        Interface();
        Scanner scan=new Scanner(System.in);
        System.out.println("请选择:");
        int num=scan.nextInt();
        while(num!=0) 
            {
        switch(num)
        {
        case 1:LetterList();break;
        case 2:WordList();break;
        case 3:System.out.println("输入数量n");int n=scan.nextInt();WordList(n);break;
        }
        Interface();
        System.out.println("请选择:");
        num=scan.nextInt();
            }
    }
    
    public static void Interface()//主界面
    {
        System.out.println("1:统计字母数量及占比");
        System.out.println("2:统计单词数量及占比");
        System.out.println("3:统计前n个单词数量及占比");
        System.out.println("按0退出");
    }
    
    public static void LetterList()throws FileNotFoundException, IOException//统计字母
    {
        File file=new File("F:/java开发/piao.txt");
        BufferedReader br=new BufferedReader(new FileReader(file));
        FileOutputStream out=new FileOutputStream("F:/java开发/jieguo.txt");
        PrintStream p=new PrintStream(out);//文件写入流

        String s;
        int i=0;
        double b=0;
        int j=0;

        double sum=0;
        int count=0;
        s=br.readLine();
        char [] strArr1 = s.toCharArray();//转化为单个字符
        
        for(i=0;i<strArr1.length;i++)
        {
            if(strArr1[i]!=' '||strArr1[i]!=','||strArr1[i]!='.')
                sum++;
        }//求全部字母数
        for(char ch='a';ch<'z';ch++)
        {
            count=0;//计数器
            for(i=0;i<strArr1.length;i++)
            {
                if(ch==strArr1[i]||strArr1[i]==ch-32)
                    count++;
            }
            if(count!=0)
                b=count/sum;
                System.out.print("字符中"+ch+"有"+count+"个");
                System.out.println("占比:"+String.format("%.2f", b));

        }  
        
    }
    
    public static void WordList()throws FileNotFoundException, IOException//统计单词
    {
        File file=new File("F:/java开发/piao.txt");
        File file2=new File("F:/java开发/notuse.txt");
        BufferedReader br=new BufferedReader(new FileReader(file));
        BufferedReader br2=new BufferedReader(new FileReader(file2));
        FileOutputStream out=new FileOutputStream("F:/java开发/jieguo.txt");
        PrintStream p=new PrintStream(out);//文件写入流

        String s;
        String ss;
        int i=0;
        double b=0;
        int j=0;
        List<String> list=new ArrayList<String>();
        double sum=0;
        int count=0;
        s=br.readLine();
        ss=br2.readLine();
        String []s1=s.split(" ");//以空格为分割划分每个单词
        String []s2=ss.split(" ");
        
    
        word []w=new word[s1.length];
        
        for(i=0;i<s1.length;i++)
        {
            
            count=0;
            for(j=0;j<s1.length;j++)
            {
                if(s1[i].equals(s1[j]))
                {
                    count++;
                }
                
            }
                
                 w[i]=new word(s1[i],count);
        }

        word temp=new word();
        for(i=0;i<s1.length;i++)
        {
            for(j=0;j<s1.length-1;j++)
            {
                if(w[j].getCount()<w[j+1].getCount())
                {
                    temp=w[j];
                    w[j]=w[j+1];
                        w[j+1]=temp;    
                }
            }
            
        }
        list.add(w[0].getValue());
        for(i=0;i<w.length;i++)
        {
            boolean bool=true;
            for(int m=0;m<s2.length;m++)
            {
                if(w[i].getValue().equals(s2[m]))
                {
                    bool=false;
                }
            }
                if(list.contains(w[i].getValue()))
                continue;
                else 
                { 
                if(bool)
                {
                System.out.println(w[i].getValue()+":"+w[i].getCount());
                }
                list.add(w[i].getValue());
                }
            
        }
        
    }
    
    public static void WordList(int n)throws FileNotFoundException, IOException//统计单词
    {File file=new File("F:/java开发/piao.txt");
    BufferedReader br=new BufferedReader(new FileReader(file));
    FileOutputStream out=new FileOutputStream("F:/java开发/jieguo.txt");
    PrintStream p=new PrintStream(out);//文件写入流

    String s;
    int i=0;
    double b=0;
    int j=0;
    List<String> list=new ArrayList<String>();
    double sum=0;
    int count=0;
    s=br.readLine();
    String []s1=s.split(" ");//以空格为分割划分每个单词

    

    word []w=new word[s1.length];
    
    for(i=0;i<s1.length;i++)
    {
        
        count=0;
        for(j=0;j<s1.length;j++)
        {
            if(s1[i].equals(s1[j]))
            {
                count++;
            }
            
        }
            
             w[i]=new word(s1[i],count);
    }

    word temp=new word();
    for(i=0;i<s1.length;i++)
    {
        for(j=0;j<s1.length-1;j++)
        {
            if(w[j].getCount()<w[j+1].getCount())
            {
                temp=w[j];
                w[j]=w[j+1];
                    w[j+1]=temp;    
            }
        }
        
    }
    list.add(w[0].getValue());
    int nn=0;
    for(i=0;i<s1.length;i++)
    {
        if(nn<n)
        {
            if(list.contains(w[i].getValue()))
            continue;
            else
            {
            System.out.println(w[i].getValue()+":"+w[i].getCount());
            list.add(w[i].getValue());
            nn++;
            }
        }
        else
            break;
    }
    
    }
}

  

原文地址:https://www.cnblogs.com/gkl20173667/p/11066405.html