设为首页 加入收藏

TOP

R系列:分词、去停用词、画词云(词云形状可自定义)(一)
2017-10-10 12:09:16 】 浏览:8837
Tags:系列 :分词 用词 形状 定义

附注:不要问我为什么写这么快,是16年写的。

R的优点:免费、界面友好(个人认为没有matlab友好,matlab在我心中就是统计软件中极简主义的代表)、小(压缩包就几十M,MATLAB.R2009b的压缩包是1.46G)、包多(是真的多,各路好友会经常上传新的包)。

R的麻烦之处:经常升级,是经常,非常经常,这就导致你在加载一个包之前需要考虑这个包要在R的哪个版本上才能使用,而往往做一件事情都要加载10个包左右,一般比较方便的做法就是先升级到最新版,因为只有小部分的包在新版本上不能用。

言归正传,下面用R语言画出红楼梦的词云图。主要是为了演示词云图的画法,不涉及分析。

一直对红楼有不可言说的感情,再见,纯真,你好,任重道远!

 一、软件准备

版本:R x64 3.2.5(我的电脑是64位的,可根据自己电脑自行安装相应版本)

下载链接:https://mirrors.tuna.tsinghua.edu.cn/CRAN/

二、数据准备

文本:红楼梦txt,1.69M,链接:

http://vdisk.weibo.com/s/AfY-rVkr37U3?sudaref=www.so.com

词典:

http://pinyin.sogou.com/dict/search/search_list/%BA%EC%C2%A5%C3%CE/normal/1

停用词库:根据需要自定义了部分停用词,详情见附录1。

三、算法介绍

采用R语言里的Rwordseg包分词。Rwordseg是R环境下的中文分词工具,用rJava调用Java分词工具Ansj。Ansj也是一个开源的Java中文分词工具,基于中科院ictclas中文分词算法,采用HMM模型。

自带基础词库,支持新加词典。

新加词典放在E:\R-3.2.5\library\Rwordseg\dict目录下。(E是R安装位置)

Rwordseg包的详细说明可在E:\R-3.2.5\library\Rwordseg\doc\Rwordseg_Vignette_CN.pdf目录下查看。

四、程序及结果

1.总耗时:1min左右

1.1.分词耗时:24.54秒

图1 分词耗时

2.结果

2.1分词结果

图2 分词部分结果

2.2过滤单字后结果

图3显示,结果中有部分没有意义的词,如“什么”,“一个”,这些没有意义的词也称为“停用词”,需要把他们去掉。

图3 过滤单字后部分结果

2.3去停用词后结果

到图4这里,我们便完成了词频的统计,实际应用中还需要合并同义词的词频,如“林黛玉”“黛玉”“颦颦”便属于同义词。

图4 去停用词后部分结果

2.4词云

词云结果如下。

图5 词云图

 

 

 

 

3.程序

#加载分词需要用到的包
library(tm)
library(Rwordseg)
library(wordcloud2)
library(tmcn)
#自定义词典
installDict(dictpath = 'C:/Users/Thinkpad/Desktop/红楼梦/红楼梦诗词.scel',
            dictname ='hlmsc', dicttype = 'scel')
installDict(dictpath = 'C:/Users/Thinkpad/Desktop/红楼梦/红楼梦群成员名字词库.scel',
            dictname ='hlmname', dicttype = 'scel')
installDict(dictpath = 'C:/Users/Thinkpad/Desktop/红楼梦/红楼梦词汇.scel',
            dictname ='hlmch', dicttype = 'scel')
installDict(dictpath = 'C:/Users/Thinkpad/Desktop/红楼梦/红楼词语.scel',
            dictname ='hlmcy', dicttype = 'scel')
installDict(dictpath = 'C:/Users/Thinkpad/Desktop/红楼梦/《红楼梦》词汇大全【官方推荐】.scel',
            dictname = 'hlmch', dicttype = 'scel')
#查看已添加词典
listDict()
 
#添加新词可以使用函数insertWords(),这里不添加新词
 
#分词,对segmentCN()第一个参数对应的文本分词,并将结果返回给第二个参数对应的位置,这种方式可以节约很多时间
system.time(segmentCN('C:/Users/Thinkpad/Desktop/红楼梦/红楼梦.txt',outfile='C:/Users/Thinkpad/Desktop/红楼梦/word_result.txt',blocklines=10000))
 
#统计词频,加载data.table()包,提高读取速度;把上步txt格式的分词结果变为csv格式再读取
library(data.table)
fc_result=fread("C:/Users/Thinkpad/Desktop/红楼梦/word_result.csv")
word_freq=getWordFreq(string = unlist(fc_result))
#按照词频排序,排名前100的词
word_freq[1:100,]
#dim(word_freq)[1]
#过滤前10000个热词中的单字
x=rep(0,times=10000)
for(i in 1:10000){
if(nchar(word_freq[i,])[1]>1)
x[i]=i
}
length(x)
y=sort(x)[2930:10000]
y=word_freq[y,]
#y[1:200,]
write.table(y,file="C:/Users/Thinkpad/Desktop/红楼梦/word_result2.txt")
#去停用词
ssc=read.table("C:/Users/Thinkpad/Desktop/红楼梦/word_result2.txt",header=TRUE)
class(ssc)
ssc[1:10,]
ssc=as.matrix(ssc)
stopwords=read.table("C:/Users/Thinkpad/Desktop/红楼梦/停用词.txt")
class(stopwords)
stopwords=as.vector(stopwords[,1])
wordResult=removeWords(ssc,stopwords)
#去空格
kkk=which(wordResult[,2]=="")
wordResult=wordResult[-kkk,][,2:3]
#去停用词结果
wordResult[1:100,]
write.table(wordResult,file="C:/Users/Thinkpad/Desktop/红楼梦/wordResult.txt")
#画出词云
w
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇logistic回归和probit回归预测公.. 下一篇支持向量机(SVM)理论总结系列...

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目