单词统计

用户需求:

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

 

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

import java.util.Map;

import java.util.TreeMap;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Danci {

    public static void main(String[] args) throws Exception {

        BufferedReader reader = new BufferedReader(new FileReader(

                "E:\\.txt"));

        StringBuffer buffer = new StringBuffer();

        String line = null;

        while ((line = reader.readLine()) != null) {

            buffer.append(line);

        }

        reader.close();

        Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词

        String string = buffer.toString();

        Matcher matcher = expression.matcher(string);//

        Map<String, Integer> map = new TreeMap<String, Integer>();

        String word = "";

        int times = 0;

 

  while (matcher.find()) {// 是否匹配单词

            word = matcher.group();// 得到一个单词-树映射的键

            if (map.containsKey(word)) {// 如果包含该键,单词出现过

                times = map.get(word);// 得到单词出现的次数

                map.put(word, times + 1);

            } else {

                map.put(word, 1);// 否则单词第一次出现,添加到映射中

            }

        }

        /*

         * 核心:如何按照TreeMap value排序而不是key排序.Map.Entry放在集合里, 重写比较器,在用

         * Collections.sort(list, comparator);进行 排序

         */

 

        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(

                map.entrySet());

        /*ZZZZZZZZZZZZZZZ

         * 重写比较器

         * 取出单词个数(value)比较

         */

        Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {

            public int compare(Map.Entry<String, Integer> left,

                    Map.Entry<String, Integer> right) {

                return (left.getValue()).compareTo(right.getValue());

            }

        };

        Collections.sort(list, comparator);// 排序

        int last = list.size() - 1;

        for (int i = last; i > last - 1000; i--) {

            String key = list.get(i).getKey();

            Integer value = list.get(i).getValue();

            System.out.println(key + " :" + value);

            

        }

        

    }

}

 

posted @ 2019-05-04 15:12  暗梦  阅读(105)  评论(0编辑  收藏  举报