前言
Kumo是一个开源的Java词云工具,可以快速构建词云图片。
开源地址
- Github:
https://github.com/kennycason/kumo
- 码云:
https://gitee.com/lyy289065406/kumo
Maven
<dependency>
<groupId>com.kennycason</groupId>
<artifactId>kumo-core</artifactId>
<version>1.13</version>
</dependency>
<dependency>
<groupId>com.kennycason</groupId>
<artifactId>kumo-tokenizers</artifactId>
<version>1.12</version>
</dependency>
使用方法
首先创建一个FrequencyAnalyzer
(词频分析)对象,该对象用来统计我们所需要构造词云数据的频率,主要包含以下方法:
方法名 | 参数 | 说明 |
---|---|---|
load | InputStream | 从流中获取语料 |
load | File | 从文件中获取语料 |
load | String | 从路径中打开文件获取语料 |
load | URL | 从URL中获取语料 |
load | List | 从字符串数组中获取语料 |
setWordTokenizer | WordTokenizer | 设置分词器 主要有ChineseWordTokenizer 和EnglishWordTokenizer |
setWordFrequenciesToReturn | int | 设置返回数据长度 |
setMinWordLength | int | 最小分词长度 |
setMaxWordLength | int | 最大分词长度 |
public static String getWordCloud(List<String> words) {
// 新建FrequencyAnalyzer 对象
FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
// 设置分词返回数量(频率最高的600个词)
frequencyAnalyzer.setWordFrequenciesToReturn(600);
// 最小分词长度
frequencyAnalyzer.setMinWordLength(2);
// 引入中文解析器
frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
// 获取词语频率数据
final List<WordFrequency> wordFrequencyList = frequencyAnalyzer.load(words);
}
创建一个Dimension对象,用于设置生成图片的分辨率。
// 设置图片分辨率
Dimension dimension = new Dimension(500, 500);
创建一个词云对象WordCloud
WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
// 我也不知道有啥用 但是不加中文会乱码
java.awt.Font font = new java.awt.Font("STSong-Light", 2, 18);
wordCloud.setKumoFont(new KumoFont(font));
// 设置边缘留空
wordCloud.setPadding(2);
// 设置颜色频率越高用越靠前的颜色
wordCloud.setColorPalette(new ColorPalette(new Color(0xed1941), new Color(0xf26522), new Color(0x845538)));
// 设置形状 这里用的圆 参数为半径
wordCloud.setBackground(new CircleBackground(200));
// 设置字体大小范围
wordCloud.setFontScalar(new SqrtFontScalar(10, 40));
// 设置背景色
wordCloud.setBackgroundColor(new Color(255, 255, 255));
调用词云对象的build
方法,参数为刚才生成的分词频率。
// 生成词云
wordCloud.build(wordFrequencyList);
最后可以对生成的图片进行处理,这里需要返回到前端,使用Base64编码
OutputStream output = new ByteArrayOutputStream();
wordCloud.writeToStream("png", output);
byte[] outputByte = ((ByteArrayOutputStream)output).toByteArray();
return org.apache.commons.codec.binary.Base64.encodeBase64String(outputByte);
完整代码如下
public static String getWordCloud(List<String> words) {
FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
frequencyAnalyzer.setWordFrequenciesToReturn(600);
frequencyAnalyzer.setMinWordLength(2);
// 引入中文解析器
frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
final List<WordFrequency> wordFrequencyList = frequencyAnalyzer.load(words);
// 设置图片分辨率
Dimension dimension = new Dimension(500, 500);
// 此处的设置采用内置常量即可,生成词云对象
WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
java.awt.Font font = new java.awt.Font("STSong-Light", 2, 18);
wordCloud.setKumoFont(new KumoFont(font));
wordCloud.setPadding(2);
wordCloud.setColorPalette(new ColorPalette(new Color(0xed1941), new Color(0xf26522), new Color(0x845538),new Color(0x8a5d19),new Color(0x7f7522),new Color(0x5c7a29),new Color(0x1d953f),new Color(0x007d65),new Color(0x65c294)));
wordCloud.setBackground(new CircleBackground(200));
wordCloud.setFontScalar(new SqrtFontScalar(10, 40));
wordCloud.setBackgroundColor(new Color(255, 255, 255));
// 生成词云
wordCloud.build(wordFrequencyList);
OutputStream output = new ByteArrayOutputStream();
wordCloud.writeToStream("png", output);
byte[] outputByte = ((ByteArrayOutputStream)output).toByteArray();
return org.apache.commons.codec.binary.Base64.encodeBase64String(outputByte);
}
生成的效果图如下