R语言绘制文字云

来源:互联网 发布:农村淘宝加盟费 编辑:程序博客网 时间:2024/04/27 18:42

差不多一年没有怎么认真写过博客了,最近要做毕业设计,记录一下有关实验。参考实验楼上一个实验。主要学习使用分词包Rwordseg对莎士比亚的名著《仲夏夜之梦》中的内容进行单词频数统计,提取关键词,并进行数据清洗,最后使用包wordcloud根据关键词出现的频数对该书绘制标签云图。
主要内容:“文字云”也称“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。

  1. 环境准备
    数据准备:
    首先下载下载summer压缩包
    summer压缩包解压得到txt文件。把txt文件放在R的工作目录下。
    R的逻辑包准备
    项目中需要用到的分词包Rwordseg用于对文本中的词进行频数统计,该包是R中的中文分词包,Rwordseg包依赖于rJava包,并且需要预装好java环境,以及java环境变量的配置。
  2. 数据清洗
    英文中很多单词并没有实际上的关键词作用,例如冠词the、人称代词he等单词并不能指向实际的意义,它们只是构成一句话的语法组成元素,那么这一类的词就需要被剔除,被清洗,这就是数据清洗,清洗对文本关键词提取没有影响的单词。
    文本分词
    分词在英文中就是单词或者词组(本文主要是单词),一个单词在文中出现的频率越高就越证明它在文章中占有的地位,也就是关键字。其中文本分词包Rwordseg用于提取单词。
    下面使用Rwordseg对文档进行分词统计(输入?function可以查询函数的具体使用方法)
# 加载包> library(Rwordseg)# 以字符串形式读入文本> text<-readLines('summer.txt')# 清除所有空字符串的行> res <- text[text!=""]# 使用segmentCN函数对字符串res进行分词归类> words <- unlist(lapply(X=res,FUN=segmentCN))# 以空字符串为分隔符对字符串分割并对每个单词位置进行赋值> word <- lapply(X=words,FUN=strsplit," ")  # 计算每个单词的频数> v <- table(unlist(word))# 按照单词出现的频数(词频)降序排列> v <-sort(v,decreasing=T)# 将数据存储为数据框的形式,数据由单词和对应的频数组成> datas <- data.frame(word=names(v),freq=v)

数据预处理

数据预处理就是噪声数据清除。首先,观察数据集的分布:

> summary(datas$freq)> length(datas$freq)> head(datas,100)

数据预处理
由上图中summary函数的输出结果可知,频数的分布并不均匀,中位数为1,说明文中有一半左右的单词都只是出现了一次而已,单词出现一次的可以忽略不计,且第3分位数为3,也就是说3362个单词中,关键词主要分布在频数为3-475的单词中,因此需要将数据集中频数比较低的数据剔除。

观察head函数的运行结果,频数排名前22的单词均是冠词、人称代词、连接词、介词之类与文章内容无关的单词,从第23个开始,与文章有关的单词才开始出现,因此需要将这一类组成英文句子语法结构的单词剔除。

首先,使用subset函数实现数据集的初步筛选,剔除频数低的单词(关于subset函数的使用可以输入?subset查看函数文档)。再剔除与文章无关的单词。

# 使用sunset函数选取关键词分布区域> newdatas <- subset(datas,freq>=3)# 剔除与文章无关的单词> newdatas <- newdatas[-c(1:22),]> nrow(newdatas)> head(newdatas,30)

subset
由length函数的输出结果可知,清洗数据后保留了990个单词,由于初次清洗后的数据集仍然比较大,而且根据head函数查看排名前30的数据中仍然有很多与文章内容无关的单词,因此需要抽样;但是剔除这些单词,观察一些大写的单词:LYSANDER、HERMIA、BOTTOM、THESEUS这些专有名词都是需要关注的关键词,可能是人名或者地名。

# 设置随机种子> set.seed(3000)# 抽样后使用floor函数对抽样结果取整> sample_1 <- floor(runif(30,min=1,max=990))# 新的数据集样本> new_sample <- newdatas[c(sample_1,1),]

这里的抽样数量选择31(30+1),是取总体数量990的开平方31,其中由于排名第一的love这个单词是与文章内容有关的关键词,因此需要加入到样本中。因此选取的样本数据集应该就是将floor抽取的行号和第1行所代表的数据。
3. 绘制文字云

# 加载词云包> library(wordcloud)# 参数scale设置字体的大小,col设置字体颜色为彩虹色> wordcloud(words=new_sample$word,freq=new_sample$freq,scale=c(10,.5),col=rainbow(length(new_sample$freq)))

文字云

0 0
原创粉丝点击