[机器学习] --- 红楼梦后四十回到底是谁写的?机器学习分析法

流传到今天的《红楼梦》共有120回,很多人认为是曹雪芹写了前八十回,后四十回是高鹗续写。后来随着新材料的发现,红学界经过慎重考察,认为后四十回并不是高鹗所写,高鹗和程伟元只是整理出版了《红楼梦》。这究竟是怎么回事?曹雪芹到底有没有写完《红楼梦》?今天小七试试从机器学习的角度破解这个悬案。

原理

  1. 每个人的写作都有些小习惯,虽然文章前后说的内容会有差别,但是这些用词的小习惯不容易改变;

  2. 将红楼梦120回通过统计方法转换为向量,并打上是否为前八十回的标签,之后从中抽取一小部分作为训练集,剩下大部分为测试集;

  3. 训练集送入分类算法进行学习,然后用此算法放在测试集上检验;

  4. 如果精度较高则表明前八十回和后四十回的写作风格的确有所不同,那么就说明很可能是两个人写的。

本文选择了“之”、“其”、“亦”等五十多个文言虚词,加上红楼梦中在所有120回中均有出现的部分词语共同组成特征值,这样算下来一共有一百余个词,采用这些词的出现频率来作为特征,最大程度地排除了情节的影响,某种程度上体现了写作者的写作风格。
选择了常用的SVM算法,用的语言是Python 3.5。

具体操作分成四步进行:

一、引入模块

开头部分没什么过多可以说的,就是引入需要的模块,以scikit-learn的内容为主。HC这个模块里面是自己写的一些常用函数。
这里写图片描述

二、向量化

首先是读取红楼梦的文本,这个文本是在网上抓取的一个无脂批的红楼梦120回版本,经过了一定预处理然后保存下来的文件。

之后调用了张华平博士开发的NLPIR汉语分词系统,将所有文本进行分词,然后收集成一个词典。

下一步,将每一回均出现的词加上五十余个文言虚词合并起来,作为特征值。程序运行结果显示最后作为特征值的词有138个。

将文本向量化的时候使用了最简单粗暴的词频统计方法,一开始也试过tf-idf等方法将文本向量化,但是运行之后发现在本次应用里其结果还没有简单的词频方法好。
这里写图片描述

三、分类算法

将120回随机分成了两部分,比例是0.8,也就是训练集占20%,24回,剩下的96回作为测试集。由于是文本分类任务,就直接把SVM的核定为线性核,然后用gridsearch搜索一下参数C,得到一个最优化的参数。最后在测试集上验证算法。

这里写图片描述

四、可视化

为了有个直观一些的印象,将138维的文本向量压缩成2维并画出来,降维过程采用的是PCA的方法。

这里写图片描述
运行程序后,在测试集上得到了如下的验证结果:

Precision Recal F1-score Support
0 0.97 0.88 0.92 34
1 0.94 0.98 0.96 62
Avg 0.95 0.95 0.95 96

在验证集上得到了0.95的平均f1值,效果还是不错的。这也可以表明,前八十回和后四十回至少在写作用词习惯上是有所区别的,使用算法可以很清楚地区分开。光看f1值有些抽象,可以考虑将高维的文本向量降维,然后画出来,虽然会损失很多信息,但是也可能有一些直观的东西呈现出来。

将138维向量压缩到2维之后得到的图像如下:

这里写图片描述

其中蓝色星形为前八十回,红色十字为后四十回。可以看到,虽然经过了从138维到2维的剧烈压缩,损失了大量信息,但是仍然可以发现前八十回和后四十回没完全重合,分布有所区别。

依照如上方式,如果将红楼梦分为三部分画出来,可以得到:

这里写图片描述

其中绿色圆形为前四十回,蓝色星形为四十一至八十回,红色十字为后四十回。同理,可以发现前四十回与四十一至八十回分布基本上重合,也就是前八十回内部是比较均匀和相似的,而后四十回则是另一种分布。

小结

本文用机器学习的方法选取了一个很小的方面来对红楼梦前八十回和后四十回的区别做了些探究,算法并不复杂,结果还是比较明显。由于用词风格上存在明显差异,我们有理由相信,《红楼梦》后四十回,极有可能是他人假托曹雪芹之名的伪作!

猜你喜欢

转载自blog.csdn.net/lynn0085/article/details/80140697