专栏首页JAVA葵花宝典Java生成词云!你喜欢得书都在图里!

Java生成词云!你喜欢得书都在图里!

在做数据分析得时候,生成词云图是很常见得需求,正常情况下大部分都是通过python去采集数据并且生成,异常强大,本文来说说java如何生成词云!

在github上找轮子得时候,发现了这么一个项目:Kumo(项目地址:https://github.com/kennycason/kumo),

项目特点

  • 绘制矩形,圆形或图像叠加字云。图像叠加将在所有非透明像素上绘制单词。
  • 线性,平方根字体标量。完全可扩展。
  • 可变字体大小。
  • 单词轮换。只需提供开始角度,结束角度和切片数量。
  • 自定义背景颜色。完全可定制的BackGrounds即将推出。
  • 字填充。
  • 加载自定义彩色托盘。
  • Colision和Padding的两种模式:PIXEL_PERFECT和RECTANGLE。
  • 极地词云。在一个图像中绘制两个相对的字云,以便轻松比较/对比日期集。
  • 分层的词云。覆盖多个词云。
  • WhiteSpace和中文Word Tokenizer。完全可扩展。
  • 频率分析器用于标记,过滤和计算字数。

虽然功能没有python得轮子那么好使,但好歹也能满足基本需求,我们来看看该项目简介生成得效果图

本文以技术书籍随机权重来生成为例,看看生成得几个效果图

引入项目依赖

这里使用得是目前官方最新版本 1.17,第一个是核心包,第二个是语言支持

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

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

代码实战

final FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
        frequencyAnalyzer.setWordFrequenciesToReturn(600);
        frequencyAnalyzer.setMinWordLength(2);
        frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());

        // 可以直接从文件中读取
        //final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/chinese_language.txt"));

        final List<WordFrequency> wordFrequencies = new ArrayList<>();

        // 用后端技术书籍来随机生成词云
        String [] books = {"Spring实战","Spring源码深度解析","SpringBoot实战",
                "SpringBoot2精髓","一步一步学SpringBoot2","Spring微服务实战",
                "Head First Java","Java并发编程实战","深入理解Java 虚拟机",
                "Head First Design","effective java","J2EE development without EJB",
                "TCP/IP卷一"," 计算机网络:自顶向下","图解HTTP和图解TCP/IP",
                "计算机网络","深入理解计算机系统","现代操作系统",
                "Linux内核设计与实现","Unix网络编程","数据结构与算法",
                "算法导论","数据结构与算法(Java版)","算法图解,啊哈算法",
                "剑指offer","LeetCode"," Java编程思想",
                "Java核心技术卷一","深入理解JVM虚拟机","Java并发编程实战",
                " Java并发编程艺术","Java性能调优指南","Netty权威指南",
                "深入JavaWeb技术内幕","How Tomcat Works","Tomcat架构解析",
                "Spring实战","Spring源码深度解析","Spring MVC学习指南",
                "Maven实战","sql必知必会","深入浅出MySQL",
                "Spring cloud微服务实战","SpringBoot与Docker微服务实战","深入理解SpringBoot与微服务架构"
        };
        //加入分词并随机生成权重,每次生成得图片都不一样
        for (String book : books){
            wordFrequencies.add(new WordFrequency(book,new Random().nextInt(books.length)));
        }

        //此处不设置会出现中文乱码
        java.awt.Font font = new java.awt.Font("STSong-Light", 2, 18);

        final Dimension dimension = new Dimension(900, 900);
        final WordCloud wordCloud = new WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
        wordCloud.setPadding(2);
        wordCloud.setBackground(new CircleBackground(255));
        wordCloud.setFontScalar(new SqrtFontScalar(12, 42));
        //设置词云显示的三种颜色,越靠前设置表示词频越高的词语的颜色
        wordCloud.setColorPalette(new LinearGradientColorPalette(Color.RED, Color.BLUE, Color.GREEN, 30, 30));

        wordCloud.setKumoFont(new KumoFont(font));
        wordCloud.setBackgroundColor(new Color(255, 255, 255));
        //因为我这边是生成一个圆形,这边设置圆的半径
        wordCloud.setBackground(new CircleBackground(255));

        wordCloud.build(wordFrequencies);
        wordCloud.writeToFile("d://3.png");

使用感悟

1.分词可以通过读取文件,也可以指定数据,指定数据如上例所示或者数据库统计出来得数据,通过分词得权重来显示在词云中得大小

// 可以直接从文件中读取
//final List<WordFrequency> wordFrequencies = frequencyAnalyzer.load(getInputStream("text/chinese_language.txt"));

2.虽然支持中文,但除了使用中文解析器之外还得指定字体,否则出现中文乱码,这点作者没有提及,所以很多网上类似demo都有底下留言中文乱码如何解决

frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
 //此处不设置会出现中文乱码
java.awt.Font font = new java.awt.Font("STSong-Light", 2, 18);

3.可以指定生成得形状,以及背景色还有词频得颜色,想要生成得更好看,需要自己调整相关参数。

示例地址

https://github.com/pengziliu/kumo

本文分享自微信公众号 - JAVA葵花宝典(Javakhbd),作者:码畜君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot 定时任务踩坑记录

    springboot已经支持了定时任务Schedule模块,一般情况已经完全能够满足我们的实际需求。今天就记录一下我使用 schedule 时候踩的坑吧。

    JAVA葵花宝典
  • 如果没准备这些面试题,找工作还是先缓缓吧

    Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring B...

    JAVA葵花宝典
  • 如何让一个2008年的电脑可以正常服役

    这个系统基本是可以顶替百分之80的Windows系统,成为一个可以让你办公加休闲的一个系统,并且这个系统对一个新手来说毫无难度,半天可以上手办公,Deepin是...

    JAVA葵花宝典
  • Java操作MongoDB

    之前我们介绍的MongoDB的操作都是在shell命令中写的,在项目开发时我们当然都是用程序去操作MongoDB的,本文我们来看看如何用Java代码操作Mong...

    江南一点雨
  • JavaScript专题之深浅拷贝

    如果是数组,我们可以利用数组的一些方法比如:slice、concat 返回一个新数组的特性来实现拷贝。

    疯狂的技术宅
  • zip格式转化成String

    用户5166556
  • Http接口调用示例教程

    本文链接:https://blog.csdn.net/u014427391/article/details/97398717

    用户1208223
  • Linux-3.14.12内存管理笔记【构建内存管理框架(4)】

    虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),但这里不准备复述什么,仅针对required_m...

    233333
  • Flutter 学习记2 - 首个应用

    void main() 是入口方法,=> 用于单行方法,就是函数签名和函数体间的连接符号,感觉作用和 Kotlin 的单行函数体用 = 类似。既然这样,把代码修...

    七适散人
  • Java:未来已来

    在10月22的 Oracle Codeone大会上,Java平台的首席架构师 Mark Reinhold 做了The Future of Java is Tod...

    芋道源码

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动