java词云生成,kumo项目详解

0. 前言

需要在后端生成一个词云图给小程序。
使用kumo项目实现。

1. demo

首先新建maven项目,prom.xml中加入以下依赖。加完之后记得reload。
要确保自己电脑或者服务器安装了设置的字体,否则中文会出现乱码

<dependency>
    <groupId>com.kennycason</groupId>
    <artifactId>kumo-core</artifactId>
    <version>1.28</version>
</dependency>
<dependency>
    <groupId>com.kennycason</groupId>
    <artifactId>kumo-tokenizers</artifactId>
    <version>1.28</version>
</dependency>

TagWordCloudService 是一个生成词云图的类,有逐句注释。

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.bg.PixelBoundaryBackground;
import com.kennycason.kumo.font.FontWeight;
import com.kennycason.kumo.font.KumoFont;
import com.kennycason.kumo.font.scale.SqrtFontScalar;
import com.kennycason.kumo.image.AngleGenerator;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.nlp.FrequencyFileLoader;
import com.kennycason.kumo.nlp.tokenizers.ChineseWordTokenizer;
import com.kennycason.kumo.palette.ColorPalette;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.List;
public class TagWordCloudService {

    // 照片纵横比
    private double ratio = 1;
    // 获取词云图片
    // wordFile:单词及其频率文件路径
    // pngOutputPath:图片输出路径,应该以.png结尾
    // shapePicPath:词云形状图片路径,其背景应为透明背景,格式为png
    public void generate(String wordFile, String pngOutputPath, String shapePicPath) throws IOException {
//        final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
        // 共检索多少个词
//        frequencyAnalyzer.setWordFrequenciesToReturn(1000);
        // 单词最短长度,一个汉字和一个英文字符都是1
//        frequencyAnalyzer.setMinWordLength(2);
//        frequencyAnalyzer.setStopWords(loadStopWords());
        // 设置中文支持,另一种加载方式不用设置
//        frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
        final List<WordFrequency> wordFrequencies;
        // 加载词云有两种方式,一种是在txt文件中统计词出现的个数,另一种是直接给出每个词出现的次数,这里使用第二种
        // 文件格式如下
//        100: frog
//        94: dog
//        43: cog
//        20: bog
        FrequencyFileLoader frequencyFileLoader = new FrequencyFileLoader();
        File file = new File(wordFile);
        wordFrequencies = frequencyFileLoader.load(file);
        // 生成图片的像素大小
        final Dimension dimension = new Dimension(1024, (int)(1024*ratio));
        final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
        // 调节词云的稀疏程度,越高越稀疏
        wordCloud.setPadding(10);

        //设置背景色
        wordCloud.setBackgroundColor(new Color(255,255,255));
        //设置背景图片
        wordCloud.setBackground(new PixelBoundaryBackground(shapePicPath));

        // 颜色模板,不同频率的颜色会不同
        wordCloud.setColorPalette(new ColorPalette(new Color(0x4055F1), new Color(0x408DF1), new Color(0x40AAF1), new Color(0x40C5F1), new Color(0x40D3F1), new Color(0xFFFFFF)));
        // 设置字体
        java.awt.Font font = new java.awt.Font("楷体", 0, 20);
        wordCloud.setKumoFont(new KumoFont(font));
        // 设置偏转角,角度为0时,字体都是水平的
//        wordCloud.setAngleGenerator(new AngleGenerator(0, 90, 9));
        wordCloud.setAngleGenerator(new AngleGenerator(0));
        // 字体的大小范围,最小是多少,最大是多少
        wordCloud.setFontScalar(new SqrtFontScalar(5, 40));
        wordCloud.build(wordFrequencies);
        wordCloud.writeToFile(pngOutputPath);
    }
}

2. 方法详解

2.1 FrequencyFileLoader

加载每个单词及其频次有两种方法,一种是使用FrequencyAnalyzer,统计文档中每个词出现的次数。另一种是FrequencyFileLoader,直接获取每个词及出现的次数。每行使用 次数:词 的形式。
使用如下语句进行加载

wordFrequencies = frequencyFileLoader.load(file);

例如如下文件:

1: 赤赤
2: 赤橙
3: 赤红
4: 赤绿
5: 赤青
6: 赤蓝
7: 赤紫
8: 橙赤
9: 橙橙
10: 橙红
11: 橙绿
12: 橙青
13: 橙蓝
14: 橙紫
15: 红赤
16: 红橙
17: 红红
18: 红绿
19: 红青
20: 红蓝
21: 红紫
22: 绿赤
23: 绿橙
24: 绿红
25: 绿绿
26: 绿青
27: 绿蓝
28: 绿紫
29: 青赤
30: 青橙
31: 青红
32: 青绿
33: 青青
34: 青蓝
35: 青紫
36: 蓝赤
37: 蓝橙
38: 蓝红
39: 蓝绿
40: 蓝青
41: 蓝蓝
42: 蓝紫
43: 紫赤
44: 紫橙
45: 紫红
46: 紫绿
47: 紫青
48: 紫蓝
49: 紫紫

2.2 WordCloud

wordCloud.setBackground

设置背景样式,背景类包括CircleBackground、RectangleBackground、PixelBoundaryBackground。
最好用的莫过于PixelBoundaryBackground,可以使用一张透明背景图来限制词云生成的位置。
使用如下语句设置背景。

wordCloud.setBackground(new PixelBoundaryBackground(shapePicPath));

我使用如下图片进行词云生成。
在这里插入图片描述
最后效果:
在这里插入图片描述

wordCloud.setAngleGenerator

设置词旋转角度。
有两种形式,第一种是所有词的角度都相同。

        wordCloud.setAngleGenerator(new AngleGenerator(0));

第二种是不同的词进行随便的旋转,从一个角度到另一个角度,设置一个step,限制有几个随机值。

wordCloud.setAngleGenerator(new AngleGenerator(0, 90, 9));
<think>好的,我现在需要帮助用户了解如何用Java生成图。用户提到了参考内容中的Python示例,但需要转换到Java,并希望得到库推荐和示例代码。首先,我应该回顾一下用户提供的引用,虽然引用是关于Python的Wordcloud库,但用户需要的是Java的解决方案。 首先,我得确定Java中有哪些常用的生成库。记得之前听说过Kumo这个库,是专门为Java设计的,应该是一个不错的选择。另外,可能还有其他库或者工具,比如JWordCloud,但需要确认其可用性和文档情况。 接下来,需要验证这些库的当前状态,比如是否还在维护,是否有足够的文档支持。比如Kumo在GitHub上是否有活跃的仓库,是否有示例代码。同时,可能需要考虑用户的使用场景,是否需要处理中文,字体支持等问题。 然后,用户需要示例代码。需要先引入相关依赖,比如Maven或Gradle的配置,然后编写生成的步骤。例如,使用Kumo库的话,可能需要创建频列表,设置字体、尺寸、背景颜色等参数,并输出图片文件。 另外,还需要考虑中文乱码的问题,可能需要设置中文字体路径,确保生成能正确显示中文。这一点在示例代码中需要特别指出,避免用户遇到问题时不知道如何解决。 最后,可能需要比较不同的库,比如提到Kumo和JWordCloud,说明各自的优缺点,帮助用户根据需求选择。同时,提醒用户如果库的功能有限,可以考虑其他方案,比如调用Python脚本或者使用在线工具,但主要重点还是放在Java原生库上。 总结步骤: 1. 推荐Java库,如Kumo和JWordCloud。 2. 提供Kumo的Maven依赖和示例代码。 3. 解决中文显示问题,设置字体路径。 4. 对比不同库的优缺点。 5. 提供备选方案,如集成Python或使用在线工具。 6. 生成相关问题,引导用户进一步探索。 需要确保所有技术细节准确,比如依赖的版本是否正确,代码是否存在语法错误,以及步骤是否清晰。同时,按照用户的要求,数学公式需要使用正确的LaTeX格式,但在这个问题中可能用不上,不过仍需注意其他格式要求,如代码块和引用标识。</think>### 如何用 Java 生成图? #### 1. 推荐库 Java 生成图可使用以下库: - **Kumo**:专为 Java 设计的库,支持自定义形状、颜色和布局[^1]。 - **JWordCloud**:轻量级库,适合基础需求,但功能相对有限。 #### 2. 使用 Kumo 的示例代码 ##### Maven 依赖 ```xml <dependency> <groupId>com.kennycason</groupId> <artifactId>kumo</artifactId> <version>1.28</version> </dependency> ``` ##### 基础代码实现 ```java 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.scale.LinearFontScalar; import java.awt.*; import java.util.Arrays; import java.util.List; public class WordCloudDemo { public static void main(String[] args) throws Exception { // 创建频列表 final List<WordFrequency> wordFrequencies = Arrays.asList( new WordFrequency("Java", 50), new WordFrequency("Kumo", 40), new WordFrequency("", 30) ); // 设置参数 final Dimension dimension = new Dimension(600, 600); final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT); wordCloud.setPadding(2); wordCloud.setBackground(new CircleBackground(300)); wordCloud.setFontScalar(new LinearFontScalar(20, 80)); // 字体大小范围 // 加载中文字体(避免乱码) wordCloud.setKumoFont(new Font("微软雅黑", Font.PLAIN, 1)); // 生成并保存图片 wordCloud.build(wordFrequencies); wordCloud.writeToFile("wordcloud.png"); } } ``` ##### 注意事项 - **中文支持**:需指定支持中文的字体(如 `微软雅黑`),并将字体文件(`.ttf`)放置在项目资源目录中,或通过绝对路径引用。 - **形状扩展**:可通过 `RectangleBackground` 或自定义图片掩码(如 `PixelBoundryBackground`)生成特定形状的。 #### 3. 备选方案 - **集成 Python 脚本**:若 Java 库功能不足,可通过 `ProcessBuilder` 调用 Python 的 `wordcloud` 库(需安装 Python 环境)[^1]。 - **在线工具**:如 WordArt.com 提供 API 接口,可通过 HTTP 请求生成
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fourier_1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值