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));
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: 很高兴回答你的问题。要用Java实现词云图,你可以使用Java开发的词云生成库,例如WordCloud或者JWC。这些库可以让你生成一个基于文本的词云图,你可以自己定义每个词的颜色、字体、大小等属性,生成一个美观的词云图。你需要准备好需要制作词云图的文本,然后使用这些库中的API调用,来实现词云图的生成。希望这个回答能够帮助你。 ### 回答2: 词云图是一种将文本数据中频繁出现的词汇按照词频可视化展示的图形。要用Java实现词云图,可以按照以下步骤进行操作: 1. 获取文本数据:首先需要从文件、数据库或网络等来源获取需要制作词云图的文本数据。 2. 文本预处理:对文本数据进行预处理,包括去除特殊字符、停用词、标点符号等,以保留重要的词汇。 3. 统计词频:对预处理后的文本数据,通过遍历每个词汇并计算其出现的频率,统计每个词汇的词频。 4. 生成词云图:使用第三方库或自行实现词云图的生成算法。一种常用的方式是使用Java的标准绘图库(如AWT、Swing等)来绘制词云图。 - 设置画布大小和背景颜色:创建一个窗口或画布,设置画布的大小和背景颜色。 - 根据词频大小设置词的大小:将词频按照从高到低排序,并将高频词与大的字体关联,低频词与小的字体关联。 - 随机生成词的位置和颜色:为每个词随机生成一个位置和颜色,保证词云图的多样性和美观性。 - 绘制词云图:使用选定的字体和位置信息,在画布上绘制词云图。 5. 显示词云图:将生成词云图显示在图形界面上,或导出为图片格式保存。 以上是用Java实现词云图的基本步骤。需要注意的是,Java并非词云图的最佳实现语言,一些其他编程语言或工具如Python、R、JavaScript等也提供了更丰富的第三方库和工具来实现词云图。在选择具体实现方案时,建议根据实际需求和能力进行选择。 ### 回答3: 词云图是一种以文字为基础,呈现词语频率和重要性的可视化图形。如果想使用Java实现词云图,以下是一种简单的实现方法: 1. 准备工作:确保已经安装好Java开发环境,并且了解基本的Java编程知识。 2. 导入相关库:Java并没有原生支持词云图的库,但有许多第三方库可以实现。根据自己的需求选择合适的库,比如WordCloud、WordCloud2、Kumo等。 3. 获得文本数据:从本地文件或网络中获取待处理的文本数据。可以使用Java的文件读写功能,将文本内容读入内存中。 4. 数据处理:使用字符串处理函数将文本数据进行分词、过滤停用词等处理。可以使用Java的正则表达式和字符串处理方法。 5. 构建词频统计:根据处理后的文本数据,统计每个词语的出现频率。可以使用HashMap或TreeMap等数据结构来存储词频信息。 6. 根据词频生成词云图:根据词频信息以及选择的库的API,调用相关方法生成词云图。可以设置词云图的大小、颜色、字体等属性。 7. 展示或保存词云图:将生成词云图展示在图形界面上或保存为图片文件。可以使用Java的图形用户界面库(如JavaFX、Swing)来展示图形,也可以使用Java的图像处理库将词云图保存为图片文件。 8. 代码优化与后续操作:优化代码,提高生成词云图的效率和质量。可以尝试使用多线程技术加速处理过程,或者进一步处理词云图数据,使其更具可读性和可视化效果。 以上是用Java实现词云图的一般步骤。具体的实现方法还需要根据选择的库和具体需求来进行调整和完善。通过Java的文本处理、数据结构和图形处理等相关知识,可以实现出各种各样的词云图应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fourier_1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值