使用kennycason.kumo.WordCloud For JAVA 制作词云图

news2024/11/17 16:28:23

官网:https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html  

一:添加POM文件

		<!-- 词云 -->
		<dependency>
			<groupId>com.kennycason</groupId>
			<artifactId>kumo-core</artifactId>
			<version>1.27</version>
		</dependency>
		<dependency>
			<groupId>com.kennycason</groupId>
			<artifactId>kumo-tokenizers</artifactId>
			<version>1.27</version>
		</dependency>

 二:词云图方法生成

import cn.hutool.core.lang.UUID;
import com.kennycason.kumo.CollisionMode;
import com.kennycason.kumo.WordCloud;
import com.kennycason.kumo.WordFrequency;
import com.kennycason.kumo.bg.CircleBackground;
import com.kennycason.kumo.font.KumoFont;
import com.kennycason.kumo.image.AngleGenerator;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.nlp.tokenizers.ChineseWordTokenizer;
import com.kennycason.kumo.palette.LinearGradientColorPalette;
import com.kennycason.kumo.placement.RectangleWordPlacer;
import com.*.*.bigdata.dto.GxyItemData;
import com.*.*.bigdata.entity.SchoolGeneralDataEntity;
import com.*.*.bigdata.utils.AutoReport.CreateSchoolReportV4;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.List;

/**
 * ClasseName: WordCloud
 *
 * @Author: 李指导
 * @Create: 2024/01/09 - 12:44
 * @Version: v1.0
 * Description: 通过com.kennycason生成词云图
 **/
public class WordCloudUtils {
    private static final Logger logger= LoggerFactory.getLogger(WordCloudUtils.class);

    public static final String PATH = "src/main/resources/image/";
        public static void main(String[] args) throws IOException, IllegalAccessException {
            //GxyItemData 为我自己的对象 这里可以根据实际情况切换
            List<GxyItemData> list = new ArrayList<>();
            GxyItemData data = new GxyItemData();

            data.setName("张三");
            data.setName2("一年级");
            data.setValue2("25");
            data.setValue1("100");
            data.setValue4(new double[] {100});
            GxyItemData data2 = new GxyItemData();

            data2.setName("李四");
            data2.setName2("二年级");
            data2.setValue2("74");
            data2.setValue1("200");
            data2.setValue4(new double[] {100});
            GxyItemData data3 = new GxyItemData();

            data3.setName("王五");
            data3.setName2("三年级");
            data3.setValue2("60");
            data3.setValue1("300");
            data3.setValue4(new double[] {100});
            list.add(data);list.add(data2);list.add(data3);


            GxyItemData dataa = new GxyItemData();

            dataa.setName("马六");
            dataa.setName2("一年级");
            dataa.setValue2("45");
            dataa.setValue1("220");
            dataa.setValue4(new double[] {100});
            GxyItemData dataa2 = new GxyItemData();

            dataa2.setName("九七");
            dataa2.setName2("二年级");
            dataa2.setValue2("14");
            dataa2.setValue1("1200");
            dataa2.setValue4(new double[] {100});
            GxyItemData dataa3 = new GxyItemData();

            dataa3.setName("勾八");
            dataa3.setName2("三年级");
            dataa3.setValue2("40");
            dataa3.setValue1("2100");
            data.setValue4(new double[] {100});
            list.add(dataa);list.add(dataa2);list.add(dataa3);

            WordCloudUtils wordCloudUtils =new WordCloudUtils();
            wordCloudUtils.createWordCountPic(list);
        }
    /**
     * 制作词云图方法
     * **/
    public  String createWordCountPic(List<GxyItemData> list) throws IOException {
        //是一个用于分析文本中词频的工具类
        FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
        //设置要返回的词频数量,这里设置为 600
        frequencyAnalyzer.setWordFrequenciesToReturn(600);
        //设置词的最小长度,这里设置为 2,表示忽略长度小于 2 的词。
        frequencyAnalyzer.setMinWordLength(2);
        //设置词的分词器,这里使用了中文的分词器 ChineseWordTokenizer,用于将中文文本拆分成单个词语。
        frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
        // 可以直接从文件中读取
        List<WordFrequency> wordFrequencies = new ArrayList<>();
        // 用词语来随机生成词云
        Collections.sort(list, Comparator.comparing(GxyItemData::getValue2).reversed());
        //这里换成自己对象当中的参数,name和value
        list.forEach(c->{
            wordFrequencies.add(new WordFrequency(c.getName(),Integer.parseInt(c.getValue2())));
        });
        //设置图片分辨率
        Dimension dimension = new Dimension(300, 300);
        //此处的设置采用内置常量即可,生成词云对象
        WordCloud wordCloud = new com.kennycason.kumo.WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
        //词频的背景为白色
        wordCloud.setBackgroundColor(Color.WHITE);
        //调节词云的稀疏程度,越高越稀疏
        wordCloud.setPadding(0);
        //字号的大小范围,最小是多少,最大是多少
        //wordCloud.setFontScalar(new LinearFontScalar(10, 200));
        //设置词云显示的三种颜色,越靠前设置表示词频越高的词语的颜色
        //wordCloud.setColorPalette(new ColorPalette(15));
        wordCloud.setColorPalette(new LinearGradientColorPalette(new Color(90,174,243), new Color(251,110,108), new Color(254,182,77), 30, 30));
        // 设置字体 //此处不设置会出现中文乱码 字体设置为仿宋
        wordCloud.setKumoFont(new KumoFont(new Font("楷体", Font.BOLD, 25)));
        // 设置偏转角,角度为0时,字体都是水平的
        wordCloud.setAngleGenerator(new AngleGenerator(2,2,2));
        wordCloud.setBackground(new CircleBackground(100));
        wordCloud.build(wordFrequencies);
        //生成词云图路径
        UUID uuid = UUID.randomUUID();
        String hexString = uuid.toString().replace("-", "").substring(0,32);

        //获取编译路径,这里运行后会写到改目录下,可以自定义一个目录,
        String targetPath = "./output/";
        //String targetPath = this.getClass().getResource("/").getPath()
        String path = targetPath+hexString+".png";

        // windows目录符号 \\  , 提交到linux 要改成 //
        File filePath = new File(targetPath+File.separator);
        if(!filePath.exists()){
            filePath.mkdirs();
        }
        wordCloud.writeToFile(path);
        return path;
    }

}

测试运行结果:

生产运行结果:

 可以单独设置纬度高的词语颜色,字体稀疏度和字体的旋转角度, 都在代码当中,如果有比较好的修改建议,可以评论区留言,一起学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1371938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Verilog】期末复习——分别画出下面两个程序综合后的电路图/reg型数据和wire型数据的区别

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…

认识Linux指令之 “find grep” 命令

01.find指令&#xff1a; -name Linux下find命令在目录结构中搜索文件&#xff0c;并执行指定的操作。 Linux下find命令提供了相当多的查找条件&#xff0c;功能很强大。由于find具有强大的功能&#xff0c;所以它的选项也很多&#xff0c;其中大部分选项都值得我们花时间来…

LeetCode 84:柱状图中的最大矩形

一、题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a…

智慧工地SaaS云平台源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最终实现项目对人、机、料、法、环的全…

vue组件内外数据保持同步 组件数据加载解析顺序

背景与简介 一个公共的组件&#xff0c;比如BaseTable&#xff0c;需要同步组件内外部数据的同步&#xff0c;组件内部数据修改&#xff0c;组件外数据同步修改&#xff0c;组件外部数据修改&#xff0c;组件内部数据同步修改&#xff1b;同时&#xff0c;当组件内外部数据修改…

Java建筑工程建设智慧工地源码

智慧工地管理平台依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&#xff0c;打通从一线操作与远程监管的数据…

【Pytorch】学习记录分享13——OCR(Optical Character Recognition,光学字符识别)

[TOC](OCR(Optical Character Recognition,光学字符识别)) 1. OCR资源汇总 OCR(Optical Character Recognition,光学字符识别)指提取图像中的文字信息&#xff0c;通常包括文本检测和文本识别。 文字检测&#xff1a;将图片中的文字区域位置检测出来&#xff08;如图1(b)所示…

FaceChain-FACT:免训练的丝滑体验,秒级别的人像生成

FaceChain-FACT&#xff1a;免训练的丝滑体验&#xff0c;秒级别的人像生成 项目主页&#xff1a;FaceChain-fact&#xff1a;Face Adapter for Human AIGC github项目&#xff1a;https://github.com/modelscope/facechain 1.介绍 作为AI人像写真开源项目的佼佼者&#xff…

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

Qt During startup program exited with code 0xc0000135

网上试了好多办法没有用&#xff0c;可以试试在pro目录下加入如图所示的.dll 可以下个everything搜索整个电脑查看是否有上述dll&#xff0c;如果没有也可以网上下载或者点击连接

【博士每天一篇论文-算法】Optimal modularity and memory capacity of neural reservoirs

阅读时间&#xff1a;2023-11-15 1 介绍 年份&#xff1a;2019 作者&#xff1a;Nathaniel Rodriguez 印第安纳大学信息学、计算和工程学院&#xff0c;美国印第安纳州布卢明顿 期刊&#xff1a; Network Neuroscience 引用量&#xff1a;39 这篇论文主要研究了神经网络的模块…

认识SpringBoot中的条件注解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

Java多线程并发篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、volatile 是什么?可以保证有序性吗?二、Thread 类中的start() 和 run() 方法有什么区别?三、为什么wait, notify 和 notifyAll这些方法不在thread类里面?四、为什么wait和notify方法要在同步块中调用?前言 前些天发现了一个巨…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(4) 质量刚体的在坐标系下运动

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

狄克逊(Dixon)检验

目录 1.介绍&#xff1a;2.效果&#xff1a;小结&#xff1a; 1.介绍&#xff1a; 狄克逊检验法是一种用于检测异常值的统计方法&#xff0c;它是一种非参数的方法&#xff0c;可以有效地寻找数据集中不正常的观测值。该方法由美国统计学家布鲁斯E狄克逊&#xff08;Bruce E. …

代理IP连接不上?网速过慢?自检与应对方法来了

当您使用代理时&#xff0c;您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中&#xff0c;我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

【题解】—— LeetCode一周小结1

1.经营摩天轮的最大利润 题目链接&#xff1a; 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩…

任务管理器的 top

文章目录 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示指定的进程信息指定用户的进程信息更多信息 任务管理器的 top top命令比较像Windows里面的任务管理器&#xff0c;提供一个动态实时的系统状态检测&#xff0c;可以检测实时显示内存、CPU、…

openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读

文章目录 openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读193.1 switchover操作时&#xff0c;主机降备卡住193.1.1 问题现象193.1.2 原因分析193.1.3 处理办法 193.2 磁盘空间达到阈值&#xff0c;数据库只读193.2.1 问题现象193.2.2 原因分…