星期五, 六月 01, 2012

红楼梦文本折腾纪要


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

折腾的思路基本上就是:1、将文本按章回划分。2、按章回获取某些统计量,看能否区别前八十回和后四十回。3、中文分词后以空间向量模型方法构造词条-文档关系矩阵。4、计算文档间距离后用多维标度方法降到二维展现120回的散点图形。

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


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

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

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

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

10 条评论:

  1. 強大! 但有些地方没看懂 :'( 可能本科水平不夠高

    回复删除
  2. 这个可以去去吓吓那些红学家,呵呵

    回复删除
  3. > wilcox.test(paragraph[1:70],paragraph[71:120])

    Wilcoxon rank sum test with continuity correction

    data: paragraph[1:70] and paragraph[71:120]
    W = 2158.5, p-value = 0.02962
    alternative hypothesis: true location shift is not equal to 0

    > wilcox.test(paragraph[1:90],paragraph[91:120])

    Wilcoxon rank sum test with continuity correction

    data: paragraph[1:90] and paragraph[91:120]
    W = 1921.5, p-value = 0.0005283
    alternative hypothesis: true location shift is not equal to 0

    回复删除
    回复
    1. 楼上说的是,我后来也想到这问题,人类总喜欢寻找可能不存在的模式,比如看一片云。

      删除
    2. 对于词频矩阵中获得三个字以上词的矩阵,可以使用
      list(wordLengths=c(2, lnf))就可以生成两个字的词了。
      呵呵,其实因为英文中的单词大多都是三个字母以上的组合(除了a、 I 、am这些),估计就默认设置为三个了。

      删除
  4. 此评论已被作者删除。

    回复删除
  5. 结果可喜可贺, 不过有几点还要请教。首先,置换检验是仅用于第一部分还是随后所有显著的检验。其次,林黛玉名字的出现问题可能是情节设置,不知放入考虑因素是否妥当。最后,我个人以为关于章节中句子数量受情节影响较大,作为考量因素未必合适。此外,如果考虑每短句(逗号之间的句子)的长度可能更能表现作者的写作风格。(因为和音律有关)还有,听说有人探求红龙梦中stopwords(罢,亦,了等等)的使用模式从而判定前后两部分显著区分与否。我以为此方法相对较为可靠,毕竟越细节的部分是越难模仿的。

    回复删除
  6. 您实在是太过分了!哈哈

    回复删除