词频计算器(废话不多,直接上代码)

文章提供了两个Java程序,分别实现了控制台版本和GUI版本的词频统计功能。用户可以指定文件路径,程序会读取文本,使用正则表达式分词,并输出前n个出现频率最高的词语及其次数。GUI版本增加了交互性,允许用户选择文件并设置输出词语数量。
摘要由CSDN通过智能技术生成

基础版本(控制台指定路径文件统计)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

/**
 * @Author: dh
 * @Description :
 * @Date: Created in 2023/6/7 15:21
 * @Modified By:
 **/
public class cp {
    public static void main(String[] args) {
        // 要统计词频的文件路径
        String filePath = "D:\\a仓库\\a.txt";
        // 从命令行输入需要输出的前 n 个最高频率词语
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入需要输出的前 n 个最高频率词语 n = ");
        int topN = sc.nextInt();

        Map<String, Integer> wordFreqMap = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                // 利用正则表达式将一行文本拆分为若干词语
                String[] words = line.trim().split("[^\\u4e00-\\u9fa5]+");
                for (String word : words) {
                    // 统计每个词语的出现频率
                    if (wordFreqMap.containsKey(word)) {
                        wordFreqMap.put(word, wordFreqMap.get(word) + 1);
                    } else {
                        wordFreqMap.put(word, 1);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将所有词语按照出现频率排序
        List<Map.Entry<String, Integer>> wordFreqList = new ArrayList<>(wordFreqMap.entrySet());
        Collections.sort(wordFreqList, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });

        // 输出出现频率最高的前 n 个词语
        System.out.printf("出现频率最高的前 %d 个词语为:\n", topN);
        for (int i = 0; i < topN && i < wordFreqList.size(); i++) {
            System.out.printf("%d. %s(%d 次)\n", i + 1, wordFreqList.get(i).getKey(), wordFreqList.get(i).getValue());
        }
    }
}

GUI 版本

 

 源码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.regex.*;

public class WordFrequencyCounter extends JFrame {
    // 用于显示当前选择的文件路径
    private JLabel filePathLabel = new JLabel("请选择要统计词频的文件:");
    // 用于选择要统计词频的文件
    private JButton chooseFileButton = new JButton("选择文件");
    // 用于输入需要输出的前 n 个最高频率词语
    private JTextField topNField = new JTextField("10", 5);
    // 用于计算词频
    private JButton calculateButton = new JButton("开始计算");
    // 用于显示计算结果
    private JTextArea resultArea = new JTextArea();
    // 当前选择的文件路径
    private String filePath;

    public WordFrequencyCounter() {
        // 设置界面标题
        super("词频统计器");

        // 将按钮和标签添加到窗口中
        JPanel panel = new JPanel();
        panel.add(filePathLabel);
        panel.add(chooseFileButton);
        panel.add(new JLabel("输出前"));
        panel.add(topNField);
        panel.add(new JLabel("个最高频率词语"));
        panel.add(calculateButton);
        add(panel, BorderLayout.NORTH);
        // 将文本域添加到窗口中
        resultArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(resultArea);
        add(scrollPane, BorderLayout.CENTER);

        // 设置窗口大小和关闭方式
        setSize(800, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        // 注册选择文件按钮的事件处理器
        chooseFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                int result = fileChooser.showOpenDialog(WordFrequencyCounter.this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File file = fileChooser.getSelectedFile();
                    filePath = file.getAbsolutePath();
                    filePathLabel.setText("当前选择的文件为:" + filePath);
                }
            }
        });

        // 注册开始计算按钮的事件处理器
        calculateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 从文本框中获取需要的前 n 个最高频率词语
                int topN = Integer.parseInt(topNField.getText());

                if (filePath == null) {
                    JOptionPane.showMessageDialog(WordFrequencyCounter.this, "请选择要统计词频的文件!");
                    return;
                }

                // 在单独的线程中计算词频,并将结果显示到文本域中
                Thread thread = new Thread() {
                    @Override
                    public void run() {
                        String result = calculateWordFrequency(filePath, topN);
                        SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                resultArea.setText(result);
                            }
                        });
                    }
                };
                thread.start();
            }
        });
    }

    /**
     * 计算词频,并返回结果字符串
     * @param filePath 要统计词频的文件路径
     * @param topN 需要输出的前 n 个最高频词语
     * @return 词频统计结果字符串
     */
    private String calculateWordFrequency(String filePath, int topN) {
        Map<String, Integer> wordFreqMap = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                // 利用正则表达式将一行文本拆分为若干词语
                String[] words = line.trim().split("[^\\u4e00-\\u9fa5]+");
                for (String word : words) {
                    // 统计每个词语的出现频率
                    if (wordFreqMap.containsKey(word)) {
                        wordFreqMap.put(word, wordFreqMap.get(word) + 1);
                    } else {
                        wordFreqMap.put(word, 1);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 将所有词语按照出现频率排序
        List<Map.Entry<String, Integer>> wordFreqList = new ArrayList<>(wordFreqMap.entrySet());
        Collections.sort(wordFreqList, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });

        // 构造结果字符串
        StringBuilder sb = new StringBuilder();
        sb.append("出现频率最高的前 ").append(topN).append(" 个词为:\n\n");
        for (int i = 0; i < topN && i < wordFreqList.size(); i++) {
            sb.append(i + 1).append(". ")
                    .append(wordFreqList.get(i).getKey())
                    .append("(").append(wordFreqList.get(i).getValue()).append(" 次)\n");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        WordFrequencyCounter frame = new WordFrequencyCounter();
        frame.setVisible(true);
    }
}

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值