单词统计

单词统计

发表日期:2019-5-5

实验要求:

用户需求:

英语的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 shuzu;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.text.DecimalFormat;

import java.util.HashMap;

import java.util.Map;

//piao单词统计

 

 

 

public class Pipei {

    public static Map<String,Integer> map1=new HashMap<String,Integer>();

    static int g_Wordcount[]=new int[27];

    static int g_Num[]=new int[27];

   

    static String []unUse=new String[] {

        "it",

        "in",

        "to",

        "of",

        "the",

        "and",

        "that",

        "for"

    };

   

    public static void main(String arg[]) {

        //daoruFiles("piao.txt","tongji");

        traverseFolder2("D:\\piao");

       

    }

    public static void daoruFiles(String a,String dc)

    {

        map1.clear();

        try {

            daoru(a);

        } catch (IOException e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

           

        }

        String sz[];

        Integer num[];

        final int MAXNUM=10; //统计的单词出现最多的前n个的个数

       

        for(int i=0;i<g_Wordcount.length;i++)

        {

            g_Wordcount[i]=0;

            g_Num[i]=i;

        }

       

        sz=new String[MAXNUM+1];

        num=new Integer[MAXNUM+1];

        Pipei pipei=new Pipei();

        int account =1;

        //Vector<String> ve1=new Vector<String>();

        try {

            daoru(a);

        } catch (IOException e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

        System.out.println("英文单词的出现情况如下:");

        int g_run=0;

       

        for(g_run=0;g_run<MAXNUM+1;g_run++)

        {

            account=1;

            for(Map.Entry<String,Integer> it : Pipei.map1.entrySet())

            {

                if(account==1)

                {

                    sz[g_run]=it.getKey();

                    num[g_run]=it.getValue();

                    account=2;

                }

                if(account==0)

                {

                    account=1;

                    continue;

                }

                if(num[g_run]<it.getValue())

                {

                    sz[g_run]=it.getKey();

                    num[g_run]=it.getValue();

                }

                //System.out.println("英文单词: "+it.getKey()+" 该英文单词出现次数: "+it.getValue());

            }

            Pipei.map1.remove(sz[g_run]);

        }

        int g_count=1;

        String tx1=new String();

        String tx2=new String();

        for(int i=0;i<g_run;i++)

        {

            if(sz[i]==null)

                continue;

            if(sz[i].equals(""))

                continue;

            tx1+="出现次数第"+(g_count)+"多的单词为:"+sz[i]+"\t\t\t出现次数: "+num[i]+"\r\n";

            System.out.println("出现次数第"+(g_count)+"多的单词为:"+sz[i]+"\t\t\t出现次数: "+num[i]);

            g_count++;

        }

        try {

            daochu(tx1,dc+"2.txt");

        } catch (IOException e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

       

        //------------------------------

        int temp=g_Wordcount[0];

        int numtemp=0;

        for(int i=0;i<26;i++)

        {

            for(int j=i;j<26;j++)

            {

                if(g_Wordcount[j]>g_Wordcount[i])

                {

                    temp=g_Wordcount[i];

                    g_Wordcount[i]=g_Wordcount[j];

                    g_Wordcount[j]=temp;

                    numtemp=g_Num[i];

                    g_Num[i]=g_Num[j];

                    g_Num[j]=numtemp;

                   

                }

            }

        }

        int sum=0;

        for(int i=0;i<26;i++)

        {

            sum+=g_Wordcount[i];

        }

        for(int i=0;i<26;i++)

        {

            char c=(char) ('a'+g_Num[i]);

            tx2+=c+":"+String.format("%.2f%% \r\n", (double)g_Wordcount[i]/sum*100);

        }

        try {

            daochu(tx2,dc+"1.txt");

        } catch (IOException e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

        }

       

        //------------------------------

       

    }

    public static void daoru(String s) throws IOException

    {

       

        File a=new File(s);

        FileInputStream b = new FileInputStream(a);

        InputStreamReader c=new InputStreamReader(b,"UTF-8");

        String string2=new String("");

        while(c.ready())

        {

            char string1=(char) c.read();

            if(WordNum(string1)>=0)

            {

                g_Wordcount[WordNum(string1)]+=1;

            }

           

            //------------------------

            if(!isWord(string1))

            {

                if(!isBaseWord(string2))

                {

                    if(map1.containsKey(string2.toLowerCase()))

                    {

                        Integer num1=map1.get(string2.toLowerCase())+1;

                        map1.put(string2.toLowerCase(),num1);

                    }

                    else

                    {

                        Integer num1=1;

                        map1.put(string2.toLowerCase(),num1);

                    }

                }

                string2="";

            }

            else

            {

                if(isInitWord(string1))

                {

                    string2+=string1;

                }

            }

        }

        if(!string2.isEmpty())

        {

            if(!isBaseWord(string2))

            {

                if(map1.containsKey(string2.toLowerCase()))

                {

                    Integer num1=map1.get(string2.toLowerCase())+1;

                    map1.put(string2.toLowerCase(),num1);

                }

                else

                {

                    Integer num1=1;

                    map1.put(string2.toLowerCase(),num1);

                }

            }

           

            string2="";

        }

        c.close();

        b.close();

    }

    public static void daochu(String txt,String outfile) throws IOException

    {

        File fi=new File(outfile);

        FileOutputStream fop=new FileOutputStream(fi);

        OutputStreamWriter ops=new OutputStreamWriter(fop,"UTF-8");

        ops.append(txt);

        ops.close();

        fop.close();

    }

    public static boolean isWord(char a)

    {

        if(a<='z'&&a>='a'||a<='Z'&&a>='A'||a=='\'')

            return true;

        return false;

    }

    public static boolean isInitWord(char a)

    {

        if(a<='z'&&a>='a'||a<='Z'&&a>='A'||a>'0'&&a<'9'||a=='\'')

            return true;

        return false;

    }

    public static boolean isBaseWord(String word)

    {

        for(int i=0;i<unUse.length;i++)

        {

            if(unUse[i].equals(word)||word.length()==1)

                return true;

        }

        return false;

    }

    public static int WordNum(char a)

    {

        if(a<='z'&&a>='a')

            return a-'a';

        else if(a<='Z'&&a>='A')

            return a-'A';

        return -1;

    }

    //----递归文件夹

    public static void traverseFolder2(String path) {

 

        File file = new File(path);

        if (file.exists()) {

            File[] files = file.listFiles();

            if (null == files || files.length == 0) {

                System.out.println("文件夹是空的!");

                return;

            } else {

                for (File file2 : files) {

                    if (file2.isDirectory()) {

                        System.out.println("文件夹:" + file2.getAbsolutePath());

                        traverseFolder2(file2.getAbsolutePath());

                    } else {

                        System.out.println("文件:" + file2.getAbsolutePath());

                        String name=file2.getName();

                        daoruFiles(file2.getAbsolutePath(), file2.getParentFile()+"\\"+name.replace(".txt", "")+"tongji");

                       

                    }

                }

            }

        } else {

            System.out.println("文件不存在!");

        }

    }

 

   

}

 

 总结:单词统计利用文件读取,利用split分割字符。

 

posted @ 2019-05-05 19:06  Caper123  阅读(257)  评论(0编辑  收藏  举报