zoukankan      html  css  js  c++  java
  • 单词统计2 续

     这次的课堂作业是接着上一次的课堂作业。第一步:输出单个文件中的前 N 个最常出现的英语单词。输出文件中所有不重复的单词,按照出现次数由多到少排列,出现次数同样多的,以字典序排列。 指定文件目录,对目录下每一个文件执行统计的操作。 指定文件目录,是会递归遍历目录下的所有子目录的文件进行统计单词的功能。输出出现次数最多的前 n 个单词。

    代码为:

    package piao;
    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.Scanner;
    import java.util.TreeMap;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class piao { 
                public static void main(String[] args) throws Exception {
                    BufferedReader reader = new BufferedReader(new FileReader(
                            "D:\飘.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());
                    /*
                     * 重写比较器
                     * 取出单词个数(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);// 排序
                    System.out.println("请输入要输出的单词个数:");
                    Scanner s=new Scanner(System.in);
                    int n=s.nextInt();
                    int last = list.size() - 1;
                    for (int i = last; i > last - n; i--) {
                        String key = list.get(i).getKey();
                        Integer value = list.get(i).getValue();
                        System.out.println(key + " :" + value);
                    }
                }
    
                
            }

    结果截图为:

    第二步:

    支持 stop words。在一本小说里, 频率出现最高的单词一般都是 "a",  "it", "the", "and", "this", 这些词, 可以做一个 stop word 文件 (停词表), 在统计词汇的时候,跳过这些词。  我们把这个文件叫 "stopwords.txt" 。

    思路就是,建立一个stopwords.txt文本文件,把一些常用词放在这个表里,然后利用这个停词表,在输出文件中出现频率最高的单词时,去掉这几个单词。

    代码为:

    package piao;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.TreeMap;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    public class piao2 {    
        public class stopwords
        {
            HashSet<String> set = new HashSet<>();

            public stopwords()
            {
                String File = "";
                try
                {
                    String path = "D:\stopwords.txt";
                    Scanner in = null;
                    piao2 pp2=new piao2();
                    in = new Scanner(pp2.get(path));
                    while (in.hasNextLine())
                    {
                        File += in.nextLine();
                    }
                } catch (Exception e)
                {
                    System.err.println("无该文件");
                    e.printStackTrace();
                }
                for (String string : File.split(" "))
                {
                    set.add(string);
                }
                System.out.println(set);
            }
            
            public boolean get(String a)
            {
                return set.contains(a);
            }
            }

            

        public static void main(String[] args) throws Exception {
            BufferedReader r = new BufferedReader(new FileReader("D:\飘.txt"));
            StringBuffer buffer = new StringBuffer();
            String line = null;
            while ((line = r.readLine()) != null) {
                  buffer.append(line);
            }
            r.close();
            Pattern expression = Pattern.compile("[a-zA-Z]+");// 定义正则表达式匹配单词
            String s = buffer.toString();
            Matcher m = expression.matcher(s);
            Map<String, Integer> map = new TreeMap<String, Integer>();
            String word = "";
            int times = 0;
            while (m.find()) {// 是否匹配单词
                word = m.group();// 得到一个单词-树映射的键
                if (map.containsKey(word)) {// 如果包含该键,单词出现过
                    times = map.get(word);// 得到单词出现的次数
                    map.put(word, times + 1);
                }
                else {
                    map.put(word, 1);// 否则单词第一次出现,添加到映射中
                }
            }
            List<Map.Entry<String, Integer>>list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
            Collections.sort(list, 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());
                    }
                });
            int last = list.size() - 1;
            for (int i = last; i > 0; i--) {
                String key = list.get(i).getKey();
                Integer value = list.get(i).getValue();
                System.out.println(key + " :" + value);
            }
        }



        public Readable get(String path) {
            // TODO Auto-generated method stub
            return null;
        }

        
        
    }

    这个是stopwords.txt里的内容

    结果截图:

  • 相关阅读:
    Java进阶(七)布隆过滤器
    NIO面试题
    TCP/IP面试题
    SPRING面试题
    SpringBoot(五)原理剖析:Transaction原理
    SpringBoot(四)原理剖析:AOP原理
    SpringBoot(三)原理剖析:IOC原理
    SpringBoot(二)原理剖析:AutoConfiguration原理
    mysql 安全更新
    查看端口占用
  • 原文地址:https://www.cnblogs.com/zhaoxinhui/p/11002906.html
Copyright © 2011-2022 走看看