官方微信 手机客户端
查看: 1802|回复: 0

线性代数告诉你《红楼梦》后四十回是不是曹雪芹写的

760

主题

847

帖子

3225

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3225
发表于 2018-8-10 17:46:24 | 显示全部楼层 |阅读模式
线性代数告诉你《红楼梦》后四十回是不是曹雪芹写的

本文作者前进四先生,是一枚航天工程师。因航天是非常严谨的行业,容不得半点差错,于是前进四先生将多余的想法付诸数据分析,喜欢用算法分析文学上各种好玩的东西,形成了算法和文学的完美结合。个人微信公众号:前进日志(id:mrqianjinsi)。
之前,文字Geek转载了前进四先生的一篇文章:计算机告诉你,唐朝诗人之间的关系到底是什么样的?里面用算法思想分析了唐代诗人的社交网络,相比于经验分析,算法显得更客观,更全面。同时,算法的引入这个新奇的思想,也打开了文学分析的新局面,实在是件非常好玩的事情。许多小伙伴都感到非常好奇。
这次,文字Geek给大家带来了前进四先生另外一篇非常好玩的文章:运用数学知识来分析《红楼梦》的后四十回是不是曹雪芹写的。当然,这个问题的结论已经被红学家讨论很多年了,而线性代数知识在此分析中的应用却还是相当新奇的。
先放一张林妹妹的美照镇楼。


1.为什么我能讨论《红楼梦》
我当然不是文学家,只是中学时草草看过一遍《红楼梦》,并无更深的研究。按道理,我并没有资格评论《红楼梦》。不过,借助于机器学习的力量,外行跨领域研究也是有可能了。
比如,这几天正在和柯洁下棋的alpha go,已经被公认为是当世围棋第一狗。但我相信alpha go的幕后开发团队一定有不懂围棋的程序员。
类似的道理,虽然我不熟悉《红楼梦》,但还是可以用机器学习算法分析一下啦。
2.问题的描述
判断后四十回是不是曹雪芹所写,这是一个典型的文本分类(text category)问题。我们把每一回当成一个独立文本,对全书的一百二十回文本进行分类,若确实能分成两类,那就能说明问题了。
一般来说,文本分类问题是将不同主题的文本划分为不同的类别。比如我的公众号文章可以明显的分为”线性代数”类和“文理交汇”类,这两类文章的常用词有明显的不同。“线性代数”类的常用词是:矩阵、向量、乘积、旋转、坐标等等,‘“文理交汇”类的常用词则是:人物、诗词、时间等等。
但是,在我们这个应用场景下,文本主题显然不是分类的依据。因为全书在故事情节上是一体的,讨论的话题也是一致的。如果还是按照话题来划分,估计全书会被划作一类。
3.回目的向量化
说到底,要判断后四十回和前八十回是不是一个人写的,应该看的是写作风格。一个人或许可以写不同情节的故事,但是不同故事的写作风格应该是一致的。比如我是刘慈欣的铁杆粉丝,他写的所有小说我都看过,其中有中篇,有长篇;有喜剧、有悲剧,但是其作品中常出现的对环境的冷峻描写,细小事物与宏大场景之间的关联叙述这种风格却一以贯之,让人一看就知道是他的作品。
不过让计算机来识别到这种程度的文风有点欺负它了,我们只能找寻一些更简单的判别文风的证据。
其中一个有力的证据就是虚词的使用频率。所谓虚词就是副词、介词、连接词之类不表达具体含义,只有语法功能的词。这些词的使用频率与具体的故事情节、写作话题无关,而主要与作者的使用习惯有关。比如我的公众号“线性代数”和“文理交汇”这两大类文章,虽然讨论的话题毫无关联,但是文章中“的”、“当”、“了”、“把”等字/词的出现频率应该都差不多。
那么,我们就从《红楼梦》中每一回目中出现的虚词频率入手,来判断作者的文风。
大部分虚词其实都只有一个字,我们把词频转化为字频,这样连分词这一步都可以省略了。
汉语中的虚词有数百个。但是如果某个虚词只在某几个回目中出现,那其实对写作风格的判定帮助不大。我们要求虚词在尽可能多的回目中出现,干脆要求在一百二十回中都出现的虚词才算作为统计对象。实际上,算上标点符号,也只有117个字在全书每个回目都出现过,如下:



这样的话,首先统计每一回目中,这117个字的出现次数。比如第一个回目中这些字的出现次数为:



再将出现次数除以该回目的总字数,就到了字频。把这些字频摞在一起,构成了一个117维的向量。117维?嗯,我想起了大学被线性代数支配的恐惧感。
这样,我们就将每一个回目抽象为一个向量了。接下来,我们就该用某种分类算法检验看看是否能将一百二十回分为两类。
4.降维显示
在进行分类之前,我们直观上看一看,前八十回和后四十回到底有没有区别。现在每一回都变为了一个117维的向量,我们没有办法把这么高维度的数据画出来。没关系,数学上提供了一个降维打击算法:主成分分解(Principal Component Analysis)算法,以下简称PCA。
PCA算法的具体内容大家有兴趣的可以自己了解一下,我现在可以给出一个直观的解释,比如我们形容某个小伙子“健康”、“灵活”、“聪明”、“反应快”。这四个形容词就构成了一个四维向量【“高大”、“健康”、“聪明”、“反应快”】,现在我们要对这个向量降维为二维向量。怎么办,我们只需要抓住这个四维向量所表达的主要含义就够了,比如【“矫健”、“机灵”】这两个词就不错。于是,我们就将四维向量降维了二维向量,并且没有损失太多的信息。


(点开图片放大可查看高清大图)
我们将每个回目的117维向量降维到3维,在3维空间中画出每个回目的散点图。
图中红色圆圈表示的是前八十回的回目,蓝色圆圈表示的是后四十回的回目。
从图中可以看出,前八十回和后四十回确实分散在空间中不同的区域。这是一个好兆头,给我们下一步的分类增加了一些信心。
5.分类
这里我们需要用到传说中的kNN(k-nearest neighbors)算法,其实就是一个投票算法而已。
那么什么是kNN算法呢?
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。简单来说就是我的邻居中的大多数属于哪一类,我就属于哪一类。



举个简单的例子:上图中,中心的绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,选3个最相邻的邻居,即里面的小圆圈,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类;而如果K=5,则要选5个最相邻的邻居,即外面的大圆圈,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
这里k就是寻找最近的k个种子(最相邻的邻居)的意思。一般来说k越大,算法抵御噪声的能力就越强,但是分类的边界就越不准确。在我们这个问题中k取为3就好了。
从上面的图中可以看出,在三维空间中前八十回和后四十回聚拢为不同的两堆。我们将前八十回所属的类别称之为类别1,后四十回所属的类别称之为类别2。
从这种空间散布特征出发,我们立刻就能提出一个分类算法:
先给出一些回目作为种子,这些种子标明了类别。比如我们将第20回~29回作为类别1的种子,第110回~119回作为类别2的种子。
分析回目n与这些种子的距离,找出离回目n最近的3个种子。假设第75回离得最近的三个种子为21回、28回、115回。根据种子的类别,进行投票,投票胜出的即为回目n的离别。由于21回、28回、115回这三个种子中两个为类别1,一个为类别2,所以我们可以判定第75回属于类别1。
经过我们的3NN算法一阵运转,最终分别得到了全书一百二十回所属的类别。如下图:



可以看出,前80回中大多数都被判定为类别1,只有6个误判。后四十回中大部分都被判定为类别2,只有7个误判。
注:因为这篇文章的阅读对象,我在这里没有刻意的区分training set和test set,请熟悉机器学习的朋友见谅。
这说明,《红楼梦》在前80回和后40回的写作风格有了明显的区分。这与文学界认为后40回非曹雪芹原文,是后人补写的结论是相一致的。
不过在后40回的7个误判,有6个集中在第81回到第90回这10回,这是不是说明这10回中有部分内容是曹雪芹的原文,后人再润色修改的呢?有没有懂行的朋友给个结论,欢迎在留言中指出。


               

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 关注微信 下载APP 返回列表