R系列:分词、去停用词、画词云(词云形状可自定义)

附注:不要问我为什么写这么快,是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")
#画出词云
wordResult=read.table("C:/Users/Thinkpad/Desktop/红楼梦/wordResult.txt")
#词云以"红楼梦"的形式展示
wordcloud2(wordResult,figPath=‘C:/Users/Thinkpad/Desktop/2.jpg‘)
#词云以"石头记"的形式展示
wordcloud2(wordResult,figPath=‘C:/Users/Thinkpad/Desktop/3.jpg‘)
#词云以汉字“红楼梦”的形式展示
letterCloud(wordResult,"红楼梦")

  

五、附录

附录1:停用词库

停用词库截图

停用词库详情

什么

一个

我们

那里

你们

如今

起来

出来

知道

说道

这里

他们

自己

一面

怎么

两个

没有

不知

只见

这个

这样

听见

进来

咱们

告诉

就是

东西

回来

出去

这些

所以

过来

心里

如此

不能

一时

只得

今日

几个

这么

一回

只管

今儿

那些

问道

如何

那边

原来

回去

看见

进去

一声

一句

这话

到底

别人

于是

果然

还有

有些

此时

岂不

的话

别的

想起

许多

多少

不用

不如

十分

后来

时候

附录2:画词云使用的图

end!

时间: 2024-12-19 08:55:35

R系列:分词、去停用词、画词云(词云形状可自定义)的相关文章

(3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类

酒店评论情感分析系统(三)—— 将分词和去停用词后的评论文本基于“环境.卫生.价格.服务”分类 思想: 将进行了中文分词和去停用词之后得到的词或短语按序存在一个数组(iniArray)中,从中找出所有和“环境.卫生.价格.服务”四个方面相关的词或短语,并记录下其位置信息(sortRefNum).然后按照位置信息,对每一个标记出的关键词,记录下从当前关键词起到下一个关键词止的信息,放入一个String型的数组中(midArray),最后将此数组中的关键词再分别基于“环境.卫生.价格.服务”四个方面

中文分词和去停用词

最近学习主题模型pLSA.LDA,就想拿来试试中文.首先就是找文本进行切词.去停用词等预处理,这里我找了开源工具IKAnalyzer2012,下载地址: https://code.google.com/p/ik-analyzer/ 由于太多,而且名称我也搞不清楚,不知道下载哪个.后来我下载了IKAnalyzer2012.zip 压缩文件. 压缩后,按照说明说,需要配置 然而这里开始我连IKAnalyzer2012.jar安装部署否不清楚,后来慢慢摸索才弄清楚: 首先在Eclipse中建一个Jav

IKAnalyzer进行中文分词和去停用词

最近学习主题模型pLSA.LDA,就想拿来试试中文.首先就是找文本进行切词.去停用词等预处理,这里我找了开源工具IKAnalyzer2012,下载地址:(:(注意:这里尽量下载最新版本,我这里用的IKAnalyzer2012.zip 这本版本后来测试时发现bug,这里建议IKAnalyzer2012_u6.zip)) https://code.google.com/p/ik-analyzer/ 由于太多,而且名称我也搞不清楚,不知道下载哪个.后来我下载了IKAnalyzer2012.zip 压缩

本地编译全志R系列的步骤7(Ubuntu 17.04非长期支持版本)

2017/6/29 13:49 0.获取全志R系列的Android源码包: 请通过渠道/代理商/方案公司获取全志R系列的Android源码包. 1.安装ubuntu 已经验证过的系统:ubuntu-17.04-desktop-amd64.iso 下载地址:http://releases.ubuntu.com/releases/17.04/ubuntu-17.04-desktop-amd64.iso ubuntu的官方下载地址(喜欢中文优化版本的,可以选择麒麟版本): http://release

用jieba库统计文本词频及云词图的生成

一.安装jieba库 :\>pip install jieba #或者 pip3 install jieba 二.jieba库解析 jieba库主要提供提供分词功能,可以辅助自定义分词词典. jieba库中包含的主要函数如下: jieba.cut(s)                                                               精确模式,返回一个可迭代的数据类型 jieba.cut(s,cut_all=True)                  

在Solr4.9中使用IKAnalyzer,实现同义词,扩展词库,停顿词的添加

在使用solr4.9的过程中,使用了IKAnalyzer分词器,其中遇到了不少问题,现在做个记录,以备后续只用. 首先使用IKAnalyzer是看到群里有人介绍,但是貌似现在IKAnalyzer已经没人更新了...不知道是不是真的,先不管这些,下面介绍一下如何在solr中使用它. 在solr的配置文件schema.xml中添加 <!--IKAnalyzer-->    <fieldType name="text_ik" class="solr.TextFie

百度搜索词&amp;淘宝搜索词 接口实现

百度和淘宝并没有正式的提供一个公开API给我们用,但是经过分析他们的源代码,还是找到了解决方法. /*baidu&taobao callback*/ function dachie(d) { if (d.s) return d.s else { return d.result.map(function(item) { return item[0] }); } }; 以上是我分析了他们的数据结构做的一个callback函数. 首先是百度: $.get("http://suggestion.

每日一程-19.检查输入的两个词是否构成变位词

Author: Notus(hehe_xiao@qq.com) Create: 2019-02-26 Update: 2019-02-26 检查输入的两个词是否构成变位词 环境 Python version: 3.7.1 代码如下(a.py) ''' 检查输入的两个词是否构成变位词, 即字母相同,顺序不同. @Author: Notus(hehe_xiao@qq.com) @Create: 2019-02-26 @Update: 2019-02-26 @Version: 0.1 ''' def

python 语料处理(从文件夹中读取文件夹中文件,分词,去停用词,去单个字)

# -*- coding:utf8 -*- import os import jieba def splitSentence(inputFile): fin = open(inputFile, 'r') #以读的方式打开文件 global fout #以写得方式打开文件 #print fin global stop for eachLine in fin: #print eachLine line = eachLine.strip()#.decode('utf-8', 'ignore') #去除