R-wordcloud: 词云图
好几位读者来信说,《R语言数据可视化之美》(增强版)的词云图的代码有问题,我今天更新了一轮,这主要原因在R语言及其包的更新,导致源代码有可能运行错误。R语言的优势在于其开源,有世界的专家学者一起开发新的包,以及其R语言本身不断更新迭代增强;这也是它的问题,因为很多时候不同包由于版本问题,会导致老版本的程序运行有误。
Anyway,很感谢诸位读者的来信!考虑到,我怕wordcloud包会再更新导致文本处理又出现错误,而不能绘制词云图。我专门把处理的文本分析结果导出存成csv文件。这样的话,可以使文本分析过程与词云图绘制分离开来,不会因为其中一部分的程序有误而不能运行另外一部分的程序。关于词云图更加详细的讲解,请学习《R语言数据可视化之美》(增强版)。
R中的wordcloud包提供了绘制词云图的函数:wordcloud()、comparison.cloud()和commonality. cloud()。其中,用wordcloud(words,freq)函数绘制词云图时,只需要提供文本(words)和对应的频率(frequency);comparison.cloud(term.matrix)和cpommonality.cloud(term.matrix)可以绘制对比词云图,term. matrix是一个行名,代表文本,每列数值代表文本对应的频数的矩阵。图3-9-3 单篇文章的词云图和图3-9-4两篇文章的词云图的具体代码如下所示。
library(tm)
library(wordcloud)
Paper1<-paste(scan("Paper1.txt", what = character(0),sep = ""), collapse = " ") #读入TXT 文档1
Paper2<-paste(scan("Paper2.txt", what = character(0),sep = ""), collapse = " ") #读入TXT 文档2
tmpText<- data.frame(c(Paper1, Paper2),row.names=c("Text1","Text2"))
df_title <- data.frame(doc_id=row.names(tmpText),
text=tmpText$c.Paper1..Paper2.)
ds <- DataframeSource(df_title)
#创建一个数据框格式的数据源,首列是文档id(doc_id),第二列是文档内容
corp <- VCorpus(ds)
#加载文档集中的文本并生成语料库文件
corp<- tm_map(corp,removePunctuation) #清除语料库内的标点符号
corp <- tm_map(corp,PlainTextDocument) #转换为纯文本
corp <- tm_map(corp,removeNumbers) #清除数字符号
corp <- tm_map(corp, function(x){removeWords(x,stopwords())}) #过滤停止词库
term.matrix <- TermDocumentMatrix(corp)
#利用TermDocumentMatrix()函数将处理后的语料库进行断字处理,生成词频权重矩阵
term.matrix <- as.matrix(term.matrix) #频率
colnames(term.matrix) <- c("Paper1","paper2")
df<-data.frame(term.matrix)
write.csv(df,'term_matrix.csv') #导出两篇文章的频率分析结果
导出的文本频率分析结果'term_matrix.csv'如图3-9-2所示,其中文本为索引行名,然后每列对应每篇文章的文本频率,然后我们使用一下语句就可以展示单篇和两篇文章的词云图:
df<-read.csv('term_matrix.csv',header=TRUE,row.names=1)
#图3-9-3(a): 单篇文章Paper1数据的展示
wordcloud(row.names(df) , df$Paper1 , min.freq=10,col=brewer.pal(8, "Dark2"), rot.per=0.3 )
#图3-9-3(b): 单篇文章Paper2数据的展示
wordcloud(row.names(df) , df$Paper2 , min.freq=10,col=brewer.pal(8, "Dark2"), rot.per=0.3 )
#两篇文章数据的对比
#图3-9-4(a):两篇文章的独有部分
comparison.cloud(df,max.words=300,random.order=FALSE,colors=c("#00B2FF", "red"))
#图3-9-4(b):两篇文章的共有部分
commonality.cloud(df,max.words=100,random.order=FALSE,color="#E7298A")
图3-9-2 词的频率数据
图3-9-3 单篇文章的词云图
图3-9-4 两篇文章的词云图
【本文内容摘自《R语言数据可视化之美》】
- Socket学习总结系列(二) -- CocoaAsyncSocket
- 比特币勒索病毒肆虐,腾讯云安全专家给你支招
- HTML5 直播协议之 WebSocket 和 MSE
- IoC在ASP.NET Web API中的应用
- 跟鹅厂老司机学技术之一:“遇见” Kotlin
- 简单的 H5 视频推流解决方案
- 来腾讯云开发者实验室学习.NET
- 跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
- 使用腾讯云 GPU 学习深度学习系列之六:物体的识别与定位
- npm5 新版功能特性解析及与 yarn 评测对比
- H5直播避坑指南
- 龙门阵之 DevOps 门外汉须知
- 全面进阶 H5 直播(上)
- 这年头,不会斗图都毕不了业?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 程序中并没有走缓存,为什么执行时间短了
- ES 常用Linux查询命令汇总
- PostgreSql 怎么获取数据库中关键系统信息(一)
- 树莓派基础实验36:通用串口通信实验
- PIMPL:休想窥探我的隐私!
- 树莓派基础实验37:pyserial模块通信实验
- 【答疑解惑】为什么你的 Charles 会抓包失败?
- Mybatis-generator 逆向工程 自定义PO,xml,mapper,example
- 高速上云/网络穿透/视频上云网关EasyNTS组网服务登录状态检测优化记录
- 树莓派基础实验38:逻辑分析仪分析PWM、UART信号
- 【终端设备】视频上云/网络穿透EasyNTS云组网硬件终端无法单独修改账号的优化方式
- 测试环境问题排查的那些事儿
- RTSP流媒体协议视频平台EasyNVR和EasyNTS智能云组网同一浏览器运行为什么会导致EasyNTS无法登陆?
- Java:手写线程安全LRU缓存X探究影响命中率的因素
- 视频上云/网络穿透/网络映射服务EasyNTS设备管理为什么会出现无法搜索到设备的情况?