R语言文本聚类实例——以《金庸全集》为例

本文介绍了使用R语言进行文本聚类分析的过程,以《金庸全集》为例,详细讲解了从文本获取、预处理、导入R、分词、词频统计、选取聚类指标、数据整合到分析和可视化的每一步,帮助读者理解实际操作中的难点和技巧。通过分析,得出的聚类结果与大众认知相吻合。
摘要由CSDN通过智能技术生成

 

写在前面

因为结课论文的需要,我想写一篇关于分析金庸小说的小论文,查了些资料,感觉还行,一动手,发现问题大了去了。

所有的资料都有一个共同的问题:碎片化,不成体系。乍一看感觉是可行的,但是你真的动手去做的时候,就发现两个问题:

1、无从下手。脑子里的想法不知道怎么开始落实。

 2、连不起来。各个步骤你基本都能查到,但是没办法理成一个完整、切实可行的流程。

以上是我着手做这件事的时候遇到的问题,把这些问题都解决好花了我小半个月的时间(时间零散,加上人也笨),终于可以把它整个的走一遍了。跟着我来,从获取素材开始,带你完整的走一遍文本聚类分析,不一定直接对你有用,但是它一定是一个好的分析模板。

下是目录,先直观的看看需要哪些步骤:

        1、文本获取

        2、文本预处理

        3、导入R(代码开始)

        4、分词和词频统计

        5、选取聚类指标

        6、数据整合

        7、文本聚类及可视化

        8、总结

 

1、文本获取

文本的获取当然很简单,自己从网上找到金庸先生的小说就好了,想分析哪个版本就下载哪个版本,这些资料很容易找到。

需要注意的是R语言对中文还是不太友好,需要找简体的小说,不能有繁体字,否则之后的分析会很麻烦。

 

2、文本预处理

这一步很重要,因为得到的原始小说是无法正常导入R中的。我在这一步尝试了很久,它一直提示读取到某某字符发生错误,而这些字符你在下载来的小说里根本就找不到。。。

弄了很久,我才想到一个有损信息质量的操作:

去标点符号。把所有你知道的标点符号都去掉,只留下汉字和空格、换行符,在导入R就顺利得多了。去标点符号需要用word,把小说一部一部的复制进word,通过【通配符】把所有的标点符号都替换成空格,就达到了目的。

我用到的通配符有:[『』,。、?!:“”……《》](英文的“[ ]”是通配符的标志)。

具体步骤如下:

这里需要一点时间,因为整部小说很长,word处理它可能需要一两分钟,需要一点点耐心,而且得一部一部得弄,会有点小烦。

 

3、导入R(代码开始)

做好第一步的数据预处理,后面的难度就下降很多了。把14部小说以向量的形式导入R,还是那个笨办法:一部一部的导入。

当然也有更轻松的方法,不过它不够简单易懂。

导入的代码如下:

#设置工作空间
setwd("C:\\Users\\Administrator\\Desktop\\金庸小说全集-旧版")

#导入文本
x <- readLines("白马啸西风.txt")
head(x) #查看头几行,看是否乱码

这里以及本文的所有代码,都只有设置工作空间的代码要改,其它的都不用,只要把处理好的小说保存为txt格式就和我的代码完全对上了。

如果能看到小说的前几行,也没有乱码,那就没问题了。

 

4、分词和词频统计

确定小说能够导入之后,就可以进行文本分析的步骤了。这里的代码和上一部分的代码有一些重复,不过完全不影响,可以以此复制粘贴,肯定可以运行。

#设置工作空间
setwd("C:\\Users\\Administrator\\Desktop\\金庸小说全集-旧版")

#导入包【 下载:install.packages("包名") ,下载不成功:选择镜像】
library(Rwordseg)
library(rJava)


#白马啸西风

#导入文本
x <- readLines("白马啸西风.txt")
#开始分词
y <- segmentCN(x,nature = FALSE, nosymbol = TRUE, returnType = c("vector", "tm"), isfast = FALSE, outfile = "", blocklines = 10000)
#拆分列表为向量
y <- unlist(y)
#过滤数字
y <- y[!grepl('[0-9]',y)]
#过滤空白以及单个词
y <- y[nchar(y)>=2]
#1、词频统计   2、进行排序   3、留下前50个   4、封装成数据框
y1 <- as.data.frame(sort(table(y),decreasing = TRUE)[1:50])
#看看效果
y1

#碧血剑
x2 <- readLines("碧血剑.txt")
y2 <- segmentCN(x2,nature = FALSE, nosymbol = TRUE, returnType = c("vector", "tm"), isfast = FALSE, outfile = "", blocklines = 10000)
y2 <- unlist(y2)
y2 <- y2[!grepl('[0-9]',y2)]
y2 <- y2[nchar(y2)>=2]
y2 <- as.data.frame(sort(table(y2),decreasing = TRUE)[1:50])
y2
#飞狐外传
x <- readLines("飞狐外传.txt")
y <- segmentCN(x,nature = FALSE, nosymbol = TRUE, returnType = c("vector", "tm"), isfast = FALSE, outfile = &
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值