红楼梦文本折腾纪要

June 1, 2012
By

This post was kindly contributed by 数据科学与R语言 - go there to comment and to read the full post.


虽然对红学一无所知,也不敢说精于文本挖掘,但并不妨碍我们勇于折腾的生活方式。上周参加了第五届R会议,学到不少好东西,其中一个就是中文分词的工具。当然就找个对象来折腾一下啦。本次的黑手伸向了被人蹂躏无数次的小说《红楼梦》。

从网上找来一个纯文本的文档,也不知道什么版本。先用记事本打开后转成UTF8格式,然后在R中读入资料。此时的存储格式是list格式,list的每一个元素是文本中的一段。首先找出文本的章节划分点,然后计算出每一章节的段落数。下图即是这120回的段落数条形图,似乎在后四十回段落数量较少,而且趋于稳定,不如前八十回变化大。对二者作一个wilcox检验,证实了数量较少的显著性。同时用置换检验也证实了这一点。


除了段落,我们还可以观察不同章节的字数和句子数量。前者容易弄一些,后者是采用迂回的法子,去搜索文档中的几种标点,用标点数量来代表句子数量。先建立了一个搜索函数,然后分别搜索了句号、问号和感叹号的总数量。如下图所示,看起来没体现出什么模式。

进一步的,可以将每个章节的句子数量除以段落数量,得到平均的段落所包含的句子数量 。画成散点图,看起来后四十回的段落中句子数量较为一致,不象前八十回那么起伏变化。或许是写手为了仿照前文,文笔有些拘谨?

还可以查询每个章节中几位主角名字的出现频次,在这里是用相对频率来表现三位主角名字在每章节的出现比例。黛玉啊,100回之后就没怎么出来了。

下面我们再深入一步,用rmmseg4j包将文本进行分词,再用tm包构建语料库和词频矩阵。在最后生成词频矩阵时得到一个奇怪的结果,就是只获得了三个字以上词的矩阵,折腾许久也不知道是什么原因。就用这个结果,再用余弦距离来计算120回文本之间的疏离度,也就是距离。将这个距离矩阵用MDS降到二维来展现。从下图来看,前八十回和后四十回似乎分的比较清楚。呵呵,折腾完毕。
代码在此,原文本在此。欢迎大家来拍砖。

Tags: , ,

Comments are closed.