写在前面
因为结课论文的需要,我想写一篇关于分析金庸小说的小论文,查了些资料,感觉还行,一动手,发现问题大了去了。
所有的资料都有一个共同的问题:碎片化,不成体系。乍一看感觉是可行的,但是你真的动手去做的时候,就发现两个问题:
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 = &