【从入门到放弃-Java】工具-词频分析

简介:

前言

最近有根据文件内容进行词频分析的需求,如果是纯英文的,写个程序处理比较容易,但涉及到中文词频分析,最关键的一步就是中文分词。

搜了不少文章,最后找到一篇比较好用的 Java实现中文词频统计。主要利用了ansj_seg进行中文分词,分词后再进行词频统计。

针对文章中提供的代码示例,做了稍许改动,贴在下面 做个记录。

依赖

添加最新版ansj_seg依赖

<dependency>
    <groupId>org.ansj</groupId>
    <artifactId>ansj_seg</artifactId>
    <version>5.1.6</version>
</dependency>

代码实现

代码可见 AloofJr

package com.my.tools.ansj;

import com.alibaba.common.lang.StringUtil;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.io.*;
import java.util.*;
/**
 * 对文件中文分词后,根据词频排序输出
 * @author wq
 * @date 2020/4/8
 */
public class Analysis {
    public static void main(String[] args) throws IOException {
        wordFrequency("");
    }

    public static void wordFrequency(String path) throws IOException {
        List<Map.Entry<String, Integer>> wordList = getWordList(path);
        wordList.forEach(entry -> {
            System.out.println(entry.getKey() + "\t" + entry.getValue());
        });
    }

    /**
     * 获取 分词-词频 列表
     * */
    private static List<Map.Entry<String, Integer>> getWordList(String path) throws IOException {
        Map<String, Integer> map = new HashMap<>(16);

        String result = ToAnalysis.parse(getString(path)).toStringWithOutNature();

        //分词后的内容,分词间使用英文逗号分隔。
        String[] words = result.split(",");

        for (String word : words) {

            String str = word.trim();

            // 过滤空白字符

            if (StringUtil.isBlank(str)) {
                continue;
            }

            // 过滤一些高频率的符号

            else if (str.matches("[)|(|.|,|。|+|-|“|”|:|?|\\s]")) {
                continue;
            }

            // 此处过滤长度为1的str
            else if (str.length() < 2) {
                continue;
            }

            if (!map.containsKey(word)) {

                map.put(word, 1);

            } else {

                int n = map.get(word);

                map.put(word, ++n);

            }

        }

        return sortByValue(map);
    }

    /**
     * 根据词频从高到低排序
     * */
    private static List<Map.Entry<String, Integer>> sortByValue(Map<String, Integer> map) {
        if (map == null) {
            return null;
        }
        List<Map.Entry<String, Integer>> list = new ArrayList<>();
        list.addAll(map.entrySet());

        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });

        return list;
    }

    /**
     * 获取文件内容
     * */
    private static String getString(String path) throws IOException {

        FileInputStream inputStream = new FileInputStream(new File(path));

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        StringBuilder strBuilder = new StringBuilder();


        String line;

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

            strBuilder.append(line);

        }

        reader.close();

        inputStream.close();

        return strBuilder.toString();

    }
}

参考

作者:Asche   

出处:https://www.cnblogs.com/asche/p/9673611.html

更多文章

见我的博客:https://nc2era.com

written by AloofJr,转载请注明出处

目录
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
88 9
|
9天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
81 60
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
152 83
|
11天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
69 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
17天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
67 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
62 26
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
60 24
|
1月前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。