单词统计

Posted xhj1074376195

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单词统计相关的知识,希望对你有一定的参考价值。

一、题目要求

  《哈利波特》 中最常用的短语是什么,等等。我们就写一些程序来解决这个问题,满足一下我们的好奇心。第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。字母频率 = 这个字母出现的次数 / (所有A-Za-z字母出现的总数)。如果两个字母出现的频率一样,那么就按照字典序排列。  如果 S 和 T 出现频率都是 10.21%, 那么, S 要排在T 的前面。第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文本文件中的英语单词出现频率。单词:以英文字母开头,由英文字母和字母数字符号组成的字符串视为一个单词。单词以分隔符分割且不区分大小写。在输出时,所有单词都用小写字符表示。英文字母:A-Z,a-z字母数字符号:A-Z,a-z0-9。第1步:输出单个文件中的前 N 个最常出现的英语单词。分割符:空格,非字母数字符号 例:good123是一个单词,123good不是一个单词。goodGoodGOOD是同一个单词。

二、代码

package dao;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Dao{
    static String str;
    static boolean flag=true;
    static int i;
    static int j;
    static int m;
    static Scanner scan=new Scanner(System.in);
    public static void main(String[] args) {
        System.out.println("运行成功,请稍等!");
        readFile();
        while(flag) {
            System.out.print("输入1查询字母所占的比例,输入2查询占前几个的单词,输入3退出:");
            int n=scan.nextInt();
            switch(n) {
            case 1:
                findletter();//查询字母所占比例
                break;
            case 2:
                findword();//查询单词所占的比例
                break;
            case 3:
                System.out.println("退出成功!");
                flag=false;
                break;
            }
        }
    }
    public static  void readFile() {
        String pathname = "Harry Potter and the Sorcerer‘s Stone.txt"; //这里为要统计的文本文档名,同时需要将该文档导入到本工程中
try (FileReader reader = new FileReader(pathname);
             BufferedReader br = new BufferedReader(reader) 
        ) {
            String line;
            while ((line = br.readLine()) != null) {
                str+=line;
            }
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void findletter() {
        char s[]=str.toCharArray();
        int[] a=new int[52];
        char[] b=new char[52];
        String str1="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        b=str1.toCharArray();
        for(j=0;j<str.length();j++) {
            if(s[j]>=‘a‘&&s[j]<=‘z‘) {
                m=s[j]-‘a‘;
                a[m]++;
            }
            else if(s[j]>=‘A‘&&s[j]<=‘Z‘) {
                m=s[j]-‘A‘+26;
                a[m]++;
            }
        }
        int t = 0;
        char ts;
        for(i=0;i<52;i++) {
            for(j=i+1;j<52;j++) {
                if(a[i]<a[j]) {
                    t=a[i];
                    a[i]=a[j];
                    a[j]=t;
                    ts=b[i];
                    b[i]=b[j];
                    b[j]=ts;
                }
            }
        }
        double sum=0;
        for(i=0;i<52;i++) {
            sum+=a[i];
        }
        NumberFormat nt = NumberFormat.getPercentInstance(); 
        nt.setMinimumFractionDigits(2);
        for(i=0;i<52;i++) {
            System.out.println(b[i]+" "+nt.format(a[i]/sum*1.0));
        }
    }
    public static void findword() {
        str.toLowerCase(); // 将str转换为小写
        String[] words = str.split("[^(a-zA-Z)]+");  // 非单词的字符来分割,得到所有单词
        Map<String ,Integer> map = new HashMap<String, Integer>() ;
        for(String word :words){
            if(map.get(word)==null){  // 若不存在说明是第一次,则加入到map,出现次数为1
                map.put(word,1);
            }else{
                map.put(word,map.get(word)+1);  // 若存在,次数累加1
            }
        }
        // 排序
       List<Map.Entry<String ,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
        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) {
             int i=left.getValue()-right.getValue();
                if(i==0) {
                 return (right.getKey().compareTo(left.getKey()));
                }
                return (left.getValue().compareTo(right.getValue()));
            }
        };
      
        // 集合默认升序
        Collections.sort(list,comparator);
        int n=list.size();
        System.out.println("一共有"+n+"种单词");
        System.out.println("请输入你要排序前几个单词:");
        Scanner scanner=new Scanner(System.in);
        n=scanner.nextInt();
        for(int i=0;i<n;i++){// 由高到低输出
            System.out.println(list.get(list.size()-i-1).getKey() +":"+list.get(list.size()-i-1).getValue());
        }    
    }
}

三、运行结果

技术图片

技术图片

 四、统计的文档

Harry Potter and the Sorcerer‘s Stone.txt

链接:https://pan.baidu.com/s/1zDyMbTzeXqxwGKHmCEFgTQ
提取码:3lxm

以上是关于单词统计的主要内容,如果未能解决你的问题,请参考以下文章

词频统计单元测试

片段(Java) | 机试题+算法思路+考点+代码解析 2023

统计单词频率

单词个数统计上机实验

编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段

如果我想从另一个片段中添加书签,为啥我的书签单词没有保存到 sqlite 数据库?