【从入门到放弃-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,转载请注明出处

目录
相关文章
|
12天前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
124 3
|
21天前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
137 1
|
14天前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
58 0
|
2月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
69 0
|
2月前
|
存储 Java 大数据
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用(198)
简介:本文探讨Java大数据技术在智能家居能源消耗分析与节能策略中的应用。通过数据采集、存储与智能分析,构建能耗模型,挖掘用电模式,制定设备调度策略,实现节能目标。结合实际案例,展示Java大数据在智能家居节能中的关键作用。
|
2月前
|
缓存 NoSQL Java
Java Web 从入门到精通之苍穹外卖项目实战技巧
本项目为JavaWeb综合实战案例——苍穹外卖系统,涵盖Spring Boot 3、Spring Cloud Alibaba、Vue 3等主流技术栈,涉及用户认证、订单处理、Redis缓存、分布式事务、系统监控及Docker部署等核心功能,助你掌握企业级项目开发全流程。
225 0
|
2月前
|
存储 安全 Java
Java 学习路线 35 掌握 List 集合从入门到精通的 List 集合核心知识
本文详细解析Java中List集合的原理、常用实现类(如ArrayList、LinkedList)、核心方法及遍历方式,并结合数据去重、排序等实际应用场景,帮助开发者掌握List在不同业务场景下的高效使用,提升Java编程能力。
267 0
|
2月前
|
前端开发 Java API
基于 Spring Boot 3 与 React 的 Java 学生信息管理系统从入门到精通实操指南
本项目基于Spring Boot 3与React 18构建学生信息管理系统,涵盖前后端开发、容器化部署及测试监控,提供完整实操指南与源码,助你掌握Java全栈开发技能。
106 0
|
3月前
|
并行计算 Java API
Java 入门循环结构基础知识点详解
摘要:本文介绍了Java现代循环技术的进阶应用,包括Stream API、响应式编程和模式匹配,展示了如何用Stream API替代传统循环进行声明式集合处理(如过滤、映射和并行计算),以及响应式编程在异步非阻塞场景下的优势。文章还通过电商订单处理系统的案例演示了这些技术的综合应用,并提供了性能优化建议,如合理使用并行处理和避免循环内对象创建。这些现代特性使Java代码更简洁、高效,更适合高并发和I/O密集型场景。
46 1
|
3月前
|
Oracle Java 关系型数据库
java 入门学习视频_2025 最新 java 入门零基础学习视频教程
《Java 21 入门实操指南(2025年版)》提供了Java最新特性的开发指导。首先介绍了JDK 21和IntelliJ IDEA 2025.1的环境配置,包括环境变量设置和预览功能启用。重点讲解了Java 21三大核心特性:虚拟线程简化高并发编程,Record模式优化数据解构,字符串模板提升字符串拼接可读性。最后通过图书管理系统案例,展示如何运用Record定义实体类、使用Stream API进行数据操作,以及结合字符串模板实现控制台交互。该指南完整呈现了从环境搭建到实际项目开发的Java 21全流程实
99 1

热门文章

最新文章