词云简介

“词云”由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)于2006年最先使用,是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的“关键词”的视觉上的突出

网上大部分文章介绍的是使用Python的jieba、wordcloud的库生成词云图,本文则介绍在C#中如何使用jieba.NET、WordCloudSharp库生成词云图,后者是前者的.NET实现。

准备工作

创建一个C#的控制台项目,通过NuGet添加引用对jieba.NETWordCloudSharp的引用,使用方法可以参考以下链接:

安装之后,在packages\jieba.NET目录下找到Resources目录,将整个Resources目录拷贝到程序集所在目录,这里面是jieba.NET运行所需的词典及其它数据文件。

基本算法

算法主要步骤如下:

  • 提取关键词:基于TF-IDF算法、TextRank算法提取文本的关键词,按权重大小选取部分关键词。
  • 统计关键词词频:先将文本分词,统计每个词的词频,再筛选出关键词的词频。
  • 生成词云图:根据关键词及其词频信息在蒙版图片的基础上生成词图。

注:本文采用TF-IDF算法提取关键词,蒙版图目前只支持黑白图片

TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降

算法实现

使用JiebaNet.Analyser.TfidfExtractor.ExtractTagsWithWeight(string text, int count = 20, IEnumerable allowPos = null)从指定文本中抽取关键词的同时得到其权重,代码如下:

/// <summary>
/// 从指定文本中抽取关键词的同时得到其权重
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
static WordWeightPair[] ExtractTagsWithWeight(string text)
{
var extractor = new TfidfExtractor();
var wordWeight = extractor.ExtractTagsWithWeight(text, 50);
StringBuilder sbr = new StringBuilder();
sbr.Append("词语");
sbr.Append(",");
sbr.Append("权重");
sbr.AppendLine(",");
foreach (var item in wordWeight)
{
sbr.Append(item.Word);
sbr.Append(",");
sbr.Append(item.Weight);
sbr.AppendLine(",");
}
string filename = "关键词权重统计.csv";
File.WriteAllText(filename, sbr.ToString(), Encoding.UTF8);
Console.WriteLine("关键词提取完成:" + filename);
return wordWeight.ToArray();
}

使用JiebaNet.Segmenter.Common下的Counter类统计词频,其实现来自Python标准库的Counter类(具体接口和实现细节略有不同),代码如下:

/// <summary>
/// 分词并统计词频:默认为精确模式,同时也使用HMM模型
/// </summary>
/// <param name="text"></param>
/// <param name="wordWeightAry"></param>
/// <returns></returns>
static KeyValuePair<string, int>[] Counter(string text, WordWeightPair[] wordWeightAry)
{
var segmenter = new JiebaSegmenter();
var segments = segmenter.Cut(text);
var freqs = new Counter<string>(segments);
KeyValuePair<string, int>[] countAry = new KeyValuePair<string, int>[wordWeightAry.Length];
for (int i = 0; i < wordWeightAry.Length; i++)
{
string key = wordWeightAry[i].Word;
countAry[i] = new KeyValuePair<string, int>(key, freqs[key]);
}
StringBuilder sbr = new StringBuilder();
sbr.Append("词语");
sbr.Append(",");
sbr.Append("词频");
sbr.AppendLine(",");
foreach (var pair in countAry)
{
sbr.Append(pair.Key);
sbr.Append(",");
sbr.Append(pair.Value);
sbr.AppendLine(",");
}
string filename = "词频统计结果.csv";
File.WriteAllText(filename, sbr.ToString(), Encoding.UTF8);
Console.WriteLine("词频统计完成:" + filename);
return countAry;
}

使用WordCloudSharp生成词云图,蒙版图必须使用黑白图片,记得手动引用System.Drawing,代码如下:

/// <summary>
/// 创建词云图
/// </summary>
/// <param name="countAry"></param>
static void CreateWordCloud(KeyValuePair<string, int>[] countAry)
{
string markPath = "mask.jpg";
string resultPath = "result.jpg";
Console.WriteLine("开始生成图片,读取蒙版:" + markPath);
Image mask = Image.FromFile(markPath);
//使用蒙版图片
var wordCloud = new WordCloud(mask.Width, mask.Height, mask: mask, allowVerical: true, fontname: "YouYuan");
//不使用蒙版图片
//var wordCloud = new WordCloud(1000, 1000,false, null,-1,1,null, false);
var result = wordCloud.Draw(countAry.Select(it => it.Key).ToList(), countAry.Select(it => it.Value).ToList());
result.Save(resultPath);
Console.WriteLine("图片生成完成,保存图片:" + resultPath);
}

运行测试

以本文为分析文本生成词云图,代码如下:

static void Main(string[] args)
{
string text = File.ReadAllText("待处理数据.txt");
var wordWeight = ExtractTagsWithWeight(text);
var wordFreqs = Counter(text, wordWeight);
CreateWordCloud(wordFreqs);
Console.Read();
}

蒙版图如下:

词云图如下(使用蒙版):

词云图如下(不使用蒙版):

在得到关键词的词频信息后,通过在线工具网站生成词云图片会更加方便一点,如词云文字图悦等。

参考资料

C#中使用jieba.NET、WordCloudSharp制作词云图的更多相关文章

  1. 词云wordcloud类介绍&python制作词云图&词云图乱码问题等小坑

    词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信 ...

  2. e分钟带你利用Python制作词云图

    随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...

  3. Python之利用jieba库做词频统计且制作词云图

    一.环境以及注意事项 1.windows10家庭版 python 3.7.1 2.需要使用到的库 wordcloud(词云),jieba(中文分词库),安装过程不展示 3.注意事项:由于wordclo ...

  4. python爬取B站视频弹幕分析并制作词云

    1.分析网页 视频地址: www.bilibili.com/video/BV19E… 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀. 这次我选取的是自己 唯一的爆款 ...

  5. 运用jieba库统计词频及制作词云

    一.对中国十九大报告做词频分析 import jieba txt = open("中国十九大报告.txt.txt","r",encoding="utf ...

  6. python wordcloud 对电影《我不是潘金莲》制作词云

    上个星期五(16/11/18)去看了冯小刚的最新电影<我不是潘金莲>,电影很长,有点黑色幽默.看完之后我就去知乎,豆瓣电影等看看大家对于这部电影的评价.果然这是一部很有争议的电影,无论是在 ...

  7. 10分钟教你用Python玩转微信之抓取好友个性签名制作词云

    01 前言+展示 各位小伙伴我又来啦.今天带大家玩点好玩的东西,用Python抓取我们的微信好友个性签名,然后制作词云.怎样,有趣吧~好了,下面开始干活.我知道你们还是想先看看效果的. 后台登录: 词 ...

  8. 如何用Python 制作词云-对1000首古诗做词云分析

    公号:码农充电站pro 主页:https://codeshellme.github.io 今天来介绍一下如何使用 Python 制作词云. 词云又叫文字云,它可以统计文本中频率较高的词,并将这些词可视 ...

  9. 爬取B站弹幕并且制作词云

    目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...

随机推荐

  1. 不是都需要ARM吗?

    不是都需要ARM吗? ARM系统架构简介 什么是ARM处理器,为什么没有听说? ARM-缩写:Advanced RISC Machines 该处理器起源于1984年的英格兰.在成立之初,ARM代表Ac ...

  2. JUC 并发编程--01,线程,进程,经典卖票案例, juc的写法

    进程: 就是一个程序, 里面包含多个线程, 比如一个QQ程序 线程: 进程中最小的调度单元, 比如 QQ中的自动保存功能 并发: 多个线程操作同一资源, 抢夺一个cpu的执行片段, 快速交替 并行: ...

  3. Spring Cloud系列(一):服务注册中心

    一.Spring Cloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样 ...

  4. .NET平台系列23:.NET Core/.NET5/.NET6 和 .NET Framework 的选择建议

    系列目录     [已更新最新开发文章,点击查看详细] 有两种支持的 .NET 实现可用于生成服务器端应用: .NET Framework .NET Core/5+,包括 .NET Core..NET ...

  5. mapboxgl 互联网地图纠偏插件(一)

    之前写过一个 leaflet 互联网地图纠偏插件,引用插件后一行代码都不用写,就能解决国内互联网地图瓦片的偏移问题. 最近想对 mapboxgl 也写一个这样的插件. 原因是自己发布的OSM矢量瓦片地 ...

  6. 海康威视ISC平台的VUE二次开发接入实现

    第一步 取得ISC平台的appkey以及secret,以及安装ISC平台的主机IP,这一步至关重要!!! 第二步 由于目前我所在的公司项目前端的代码均由vue所实现,所以利用vue-cli创建一个最简 ...

  7. 第11章 PADS功能使用技巧(2)-最全面

    原文链接点击这里 七.Flood与Hatch有什么区别? 我们先看看PADS Layout Help 文档是怎么说的,如下图所示: 从检索到的帮助信息,我们可以得到Hatch与Pour的区别,原文如下 ...

  8. Java核心API-日期时间

    java.util.Date Date类用来表示时间点. 时间是用距离一个固定时间点的毫秒数表示的,这个时间点就是纪元. UTC时间是为表示这个纪元的科学标准时间,从1970年1月1日0时开始.另一种 ...

  9. Redis在linux系统中的优化

    通常来看,Redis开发和运维人员更加关注的是Redis本身的一些配置优化,例如AOF和RDB的配置优化.数据结构的配置优化等,但是对于操作系统是否需要针对Redis做一些配置优化不甚了解或者不太关心 ...

  10. centos7 system自定义服务

      1.介绍 centos中service命令与/etc/init.d的关系 service httpd start 其实是启动了存放在/etc/init.d目录下的脚本. 但是centos7的服务管 ...