红楼梦作者解析
https://github.com/Adnios/RedDream.git程序代码放在了GitHub上了~~~~~~~~~~~~~~~~~~~~~~~
摘要
本文通过对120章回中主要人物名称出现的频率、虚词的词频、词与词之间的相关性以及前后的写作风格的比较来进行红楼梦作者异同的分析。
针对问题一,我们运用了Python工具分别统计主要人物分别在前八十和后四十出现的频数。我们得出前八十回与后四十回人物的出现频率与情节发展有关,并不能从中看出作者的差异。
针对问题二,我们先对前八十和后四十中出现的虚词和标点符号进行检索,再通过kNN算法对其进行分析,可以明显看出前八十回与后四十回的差异。
针对问题三,我们基于同一句话中两个人物出现的次数来提取人物关系,即若一句话中两个人物出现,则加两个节点name1-name2,weight=1,若以后在其他语句中再出现,则weight+1,以此类推,直到找到所有人物关系节点。分别建立前八十和后四十的人物节点图。
针对问题四,我们在语义用法方面对前八十章与后四十章的“这么”和“那么”进行了分析,并由此得出了其中的差异。
关键词:Python、主成分分析算法、降维、kNN算法、Gephi
问题重述
文本分析是指对文本的信息及其特征项的选取,是文本挖掘、信息检索的一个基本问题,它把从文本中抽取出的特征词进行量化来表示文本信息。文本(text),与讯息(message)的意义大致相同,指的是由一定的符号或符码组成的信息结构体,这种结构体可采用不同的表现形态,如语言的、文字的、影像的等等。文本是由特定的人制作的,文本的语义不可避免地会反映人的特定立场、观点、价值和利益。因此,由文本内容分析,可以推断文本提供者的意图和目的。
作为中国古典四大名著的《红楼梦》,其影响深远,家喻户晓。历来红学家们都致力于研究《红楼梦》。本文基于Python语言对《红楼梦》中的语言进行一系列的处理,进而从中寻找一种能够推断《红楼梦》作者异同的方法。
判断后四十回是否曹雪芹本人所写是一个典型的文本分类(text category)问题。我们把每一回当成一个独立文本,对全书的一百二十回文本进行分类,若确实能分成两类,那就能说明问题了。
目前有关文本表示的研究主要集中于文本表示模型的选择和特征词选择算法的选取上。用于表示文本的基本单位通常称为文本的特征或特征项。特征项必须具备一定的特性:1)特征项要能够确实标识文本内容;2)特征项具有将目标文本与其他文本相区分的能力;3)特征项的个数不能太多;4)特征项分离要比较容易实现。在中文文本中可以采用字、词或短语作为表示文本的特征项。相比较而言,词比字具有更强的表达能力,而词和短语相比,词的切分难度比短语的切分难度小得多。因此,目前大多数中文文本分类系统都采用词作为特征项,称作特征词。这些特征词作为文档的中间表示形式,用来实现文档与文档、文档与用户目标之间的相似度计算 。如果把所有的词都作为特征项,那么特征向量的维数将过于巨大,从而导致计算量太大,在这样的情况下,要完成文本分类几乎是不可能的。特征抽取的主要功能是在不损伤文本核心信息的情况下尽量减少要处理的单词数,以此来降低向量空间维数,从而简化计算,提高文本处理的速度和效率。文本特征选择对文本内容的过滤和分类、聚类处理、自动摘要以及用户兴趣模式发现、知识发现等有关方面的研究都有非常重要的影响。通常根据某个特征评估函数计算各个特征的评分值,然后按评分值对这些特征进行排序,选取若干个评分值最高的作为特征词,这就是特征选择(Feature Selection)。
因此,我们通过前八十回和后四十回分别建立数学模型,分别从主要人物出现的频率、虚词的词频、词与词之间的相关性以及前后的艺术性来进行比较。
问题分析
本问题主要是通过不同的文本分析角度,建立数学模型,实现对文本的识别,来推断文本提供者的表述方式,意图和目的。
对于问题一,我们通过Python工具分别统计主要人物分别在前八十回和后四十回出现的频数。我们得出前八十回与后四十回作者存在的差异。
针对问题二,我们通过分析前八十和后四十中出现的虚词和标点符号,我们选择了
针对问题三,我们基于同一句话中两个人物出现的次数来提取人物关系,即一句话中两个人物出现,则加两个节点name1-name2,weight=1,若以后在其他语句中再出现,则weight+1,以此类推,直到找到所有人物关系节点。分别建立前八十和后四十的人物节点图。
基本假设
1、虚词的使用频率的不同足以充分区分作者的写作风格;
2、对于全文出现频率很低的人物名可以忽略,不会对结果产生影响;
3、忽略同名不同义的词对研究结果的影响。
问题一的求解
Python与文本挖掘
说起科学计算,首先会被提到的可能是MATLAB。然而除了MATLAB中一些专业性很强的工具箱还无法被替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相应的扩展库。和MATLAB相比,用Python做科学计算有如下优点:1、与MATLAB相比,Python是一门更易学、更严谨的程序设计语言。它能让用户编写出更易读、易维护的代码。2、MATLAB主要专注于工程和科学计算。然而在计算领域,我们经常会需要进行文件管理、界面设计、网络通信等工作。由于Python有着丰富的扩展库,所以可以轻易完成各种高级任务,开发者可以用Python实现完整应用程序所需的各种功能。
文本挖掘是从大量文本中抽取出有价值的内容,并利用这些内容创造出价值,实现变现的过程,目的是把文本信息转化为人类可利用的工具。Python中有许多强大的库,可以用于文本挖掘,所以我们采用Python对《红楼梦》进行文本挖掘。
对于问题一,我们采用了Python的jieba库,jieba库是Python中的中文分词组件。其具有三种模式。精确模式,可以将句子最精确地分开,适合文本分析;全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
为了更好地比较《红楼梦》前八十回和后四十回的差异并保证每个样品数据量的相等,我们通过层次划分,将前八十回平均分为两层,最后得到三个样本(前四十回,中四十回,后四十回),再通过Python对其进行文本挖掘。
《红楼梦》作为四大名著之一,其对于生活的描述十分细腻,人物更是纷繁复杂,我们需要对人物的出现次数进行统计,由于中文文章的分析需要用到分词手段才能进行词频统计,所以这里我们用到第三方库 jieba对其进行分析。初步我们将所有可能的情况都进行记录,其统计结果如图所示:
图1 初始统计结果
这里只截取了部分数据,从图中不难看出有很多非人名的词如:“寿星”、“小老婆”、“雪浪笺”、“秋霜”等混杂在其中,显然这属于无效信息,应将其过滤。所以我们将代码进行了修改,只统计出现频率超过一百次的人名,以使其能够将非人名信息筛选掉。
在增加条件后我们所检索出的数据与之前相比的确减少了很多,将检索出的数据导入Excel中并针对每个数据的出现次数进行降序排列可以得出如下图所示的数据表格,并对表格中的数据转化为饼状图及气泡图以观察其差异。
图2 Excel数据表格
图3 前四十回饼状图
图4 中四十回饼状图
图5 后四十回饼状图
图6 前四十回气泡图
图7 中四十回气泡图
图8 后四十回气泡图
从饼图以及气泡图中可以看出只有个别人物具有较高的出现频率且人物排序在三部分中难以看出作者的不同。我们分析这是由于《红楼梦》本身作为一部长篇小说,其中人物的出现频率与小说的剧情发展有着较大的关联,而为了保证情节的连续性,改变作者并不会对其中人物的出现频率产生较大的影响,所以我们认为分析人物的出现频率并不能用于证明不同章回之间作者的异同。
问题二的求解
章回的向量化
文本分类(text category)是用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。判断后四十回是不是曹雪芹所写,这是其实就是一个典型的文本分类问题。我们把每一回当成一个独立文本,对全书的一百二十回文本进行分类,若确实能分成两类,那就能说明问题了。
一般来说,文本分类问题是将不同主题的文本划分为不同的类别。 比如,数学上的常用词是:矩阵、向量、乘积、旋转、坐标等等,文学上的常用词则是:人物、诗词、时间等等。但是,在我们这个应用场景下,文本主题显然不是分类的依据。因为全书在故事情节上是一体的,讨论的话题也是一致的。如果还是按照话题来划分,估计全书会被划作一类。
所以,要判断后四十回和前八十回是不是一个人写的,应该看的是写作风格。一个人或许可以写不同情节的故事,但是不同故事的写作风格应该是一致的。我们选择虚词作为判别文风的证据。所谓虚词就是副词、介词、连接词之类不表达具体含义,只有语法功能的词。这些词的使用频率与具体的故事情节、写作话题无关,而主要与作者的使用习惯有关。同一个作者,虽然文章主题不同,但是虚词的使用频率应该是十分接近的。那么,我们就从《红楼梦》中每一回目中出现的虚词频率入手,来判断作者的文风。[1-3]
大部分虚词其实都只有一个字,我们把词频转化为字频,这样连分词这一步就可以省略了。
在汉语中虚词有数百多个,如何正确地选择虚词以更好地分析写作风格。首先如果某个虚词只在某几个回目中出现,这种虚词对我们作者解析帮助不大。为了使我们使用的虚词具有统计意义,我们要求在一百二十回中都出现的虚词才算做统计对象。
我们通过Python运行得到的结果如下图所示:
图9 出现的虚词
首先统计每一回中上述虚词的出现次数,仔细观察会发现,这里面包括了标点符号。因为标点符号从某一方面也可以反应作者的写作风格,所以我们认为将标点符号算入虚词对最终的结果不会产生影响。从结果也可以看出,算上标点符号,也只有117个字在全书的每个章回出现过。
我们在第一回中得到的这些虚词出现的频率如图所示: