词法分析实验报告_红楼梦词汇统计分析

零、引言

前段时间的一次java作业,要用文本分析的手段,训练出一个模型,保证从红楼梦120回和三国演义120回中任意抽取一回的内容,可以判断给定文本属于红楼梦前80回、后40回还是三国演义。作业本身并不难,而且给了足够的提示,大致思路如图

2bb8854cb5e003b798113da36556923c.png

从每一回的文本中,统计之、其、了、的、呀等55个字的数量,将其视为55维特征向量,代表该章节,然后分别提取部分向量作为训练集,放入某有监督学习模型(我当时使用的是weka的J48决策树模型)进行训练。当时我初次接触机器学习,照猫画虎地把项目做了出来,发现准确率(Accurancy)居然有98.61%(后来发现是我当时理解有误,整体的准确率只有83.3%)!当时的我几乎确信这是一次成功的实验,只需要再考虑考虑其他划分情况(以后称该划分点为Number of Chapters Divided,缩写为ncd),如果最后可以得到一个以ncd = 80为顶点的钟形曲线,实验便算是成功了。虽然这样想,但当时课业繁忙,也没有闲工夫把这个想法付诸实践,也就搁置了。

放假以后,正好B站买来了四大名著的版权,我也正好乘此机会看了看87版红楼梦(说来惭愧,在此之前我只看过李少红版的红楼梦,原著也只是粗粗翻过罢了)。恰好那时,我正有系统学习一下机器学习的想法(贵校特色,尽管我做了人脸检测的项目,但还没有系统地学习过机器学习),于是就想起了当时的那个想法,想着刚好实践一下有监督学习和无监督学习。我放下豪言,少则三天,多则七天,必定完成这个项目,作出报告。结果真的上手做的时候,才发现这个项目没有我想的那么简单,磨磨蹭蹭便已经过去十余天了。

本来打算一次性做完再写报告,但越研究越觉得要学习的东西太多了,等菜都准备好了再下锅说不定就等到猴年马月去了,还是边学边做的好。报告初步打算做三个部分:

  1. 研究背景:包括红学界关于红楼梦作者的争论、统计分析在红学中的应用、机器学习简介。

  2. 实验规划:我会选择什么方法进行分析、这些方法各有什么特点、期望达到的实验目标等。

  3. 实验过程、优化方法、结果分析等。

目前基本实验已经完成,到优化阶段了,但这恰好涉及到我之前没接触过的领域,每天各种搜索资料,边学边做,照葫芦画瓢,进度十分缓慢。做完以后又发现有无法弥补的漏洞,因此就慢慢失去了动力。所以这里先介绍介绍研究背景和实验规划,具体的实验报告和分析要过一阵子了。

一、研究背景

(一)红楼梦作者是谁?——红学界的相关研究

很多人认为:前八十回为曹雪芹所著,后四十回为高鹗续写。其实这个观点出自胡适1921年《红楼梦考证》一文,其“自传说”在红学研究中也一直保持着主流地位。但随着对曹雪芹、高鹗的研究以及各种版本的红楼梦稿的发现,该观点不断受到挑战。“红楼梦作者是谁?”也一直是红学研究的热点。2015年,曹雪芹诞辰300周年时,中国红学会名誉会长李希凡先生就有过统计,红学界研究出的《红楼梦》作者已达到65人之多(如今据说已有133位)[1]。研究者将作品判给不同的作者自有理由,这里只简单介绍一些使用计算机辅助的研究者的观点,供大家参考。

1980年,美国威斯康星大学陈炳藻先生在首届国际《红楼梦》讨论会上发表了《从词汇统计论证红楼梦作者》[2]一文,他将《红楼梦》一百二十回本按顺序编成三组,每组四十回。并将《儿女英雄传》作为第四组进行比较研究。从每组中任取八万字,分别挑出名词、动词、形容词、副词、虚词这五种词,通过计算机程序对这些词进行编排、统计、比较和处理,进而找出各组相关程度。结果发现《红楼梦》前八十回与后四十回所用的词汇正相关程度达78.57%,而《红楼梦》与《儿女英雄传》所用词的正相关程度是32.14%。由此推断得出前八十回与后四十回的作者均为曹雪芹一人的结论

1987年,李贤平先生发表了《《红楼梦》成书新说》[3]一文,将全书一百二十回看作一个个对象,通过四十七个虚字的出现频率提取文本特征,并采用层次聚类方法对其进行分类,最终得出结论:《红楼梦》各部分是由不同的作者在不同的时期撰写而成的。其前八十回由曹雪芹据《石头记》增删而成。

此外,北京外国语大学施建军利用支持向量机(SVM)分析,认为根据支持向量机得出的结果, 作者认为《红楼梦》前80回和后40回作者是两个人,并且确信支持向量机利用文言虚字特征向量能够有效地区分不同作者的作品[4];清华大学刘颖、肖天久通过分析红楼梦前八十回与后四十回词长、词类、高频词、各部分独有词,系统运用了频率统计、数据归一化、数据标准化、层次聚类、k-means聚类等多种方法, 并且通过直方图、折线图、层次聚类图以及划分聚类图等多种形式将这些差异形象地描绘出来。认为这些差异, 充分说明了前80回与后40回并非一人所作。[5]

统计方法与红学研究相结合是社会科学与自然科学相互渗透、交叉应用的又一个新的尝试, 这也是当今世界科学研究的重大特征之一。从1952年到2017年间, 有几十篇论文及数部论著发表, 都是利用统计学的方法来研究红学问题。利用统计学的基本原理和方法研究红学问题, 具体的方法主要表现在对字、词、句、颜色等进行频率上的统计, 所使用具体统计方法和基本原理主要有:T检验、聚类分析法、ITC算法、KNN算法、二项总体等价性检验、区间估计、区间套定理、主成分分析、典型相关分析、多维尺度法、广义线性模型、类X2距离与相关系数、SVM方法、MAT-LAB方法、ICTCLAS汉语词法分析系统、图论等方法[6]。而本文仅探讨将机器学习运用于红学研究的合理性。

(二)机器学习用于红学研究的理论基础

机器学习致力于研究如何让机器通过计算的手段,模拟人类学习方式,将现有内容进行知识结构划分来提高学习效率。简单的说,可以理解为让机器通过分析已有的数据,获得“经验”,并利用“经验”实现“识别”、“分类”等功能。从学习方法上,可以分为有监督学习、无监督学习和强化学习。

通俗的说,有监督学习就是分析类型的数据,训练出一个模型,再用该模型对其他的data进行分类、识别或某种处理。例如,给定10条数据,每条数据包含了当天的天气情况data以及这一天小明是否出门的label。然后通过训练得到一个模型model。之后,只需要输入当天的天气数据data,该模型就可以预测这一天小明是否会出门,这就是典型的有监督学习。支持向量机SVM、决策树算法都是有监督学习的算法。在该实验中,有监督学习算法的使用思路为,将红楼梦的特征向量分为前80回和后40回,标记为不同类别(例如分别标记为0、1)进行训练,如果训练出来的模型准确率较高,则说明该分类是合适的。进一步说明前80回和后40回是不同作者所作(想象一下,如果数据集本身分类就是错误的,则不可能训练出有效的分类模型)。这个想法容易理解,但对于该方法是否有效,我会在实验规划中提出自己的想法。

无监督学习则是分析类型的无标签数据,并实现分类。比如给定100条某水果的重量、颜色、形状等数据,通过分析,将其分类,这就是典型的无监督学习。代表算法有Kmeans聚类算法、层次聚类算法等。在本实验中,我们可以用Kmeans聚类算法将120回的特征向量进行分类,分析其是否会被分为区别较大的某几类,以此判断这120回的作者是否为同一个人、哪几回的相似度比较大。

本实验将用到的就是有监督学习中的基于C4.5的决策树算法和无监督学习的Kmeans聚类、层次聚类算法。

二、实验规划

(一)有监督学习:基于C4.5的决策树算法的使用

主要算法:基于C4.5的决策树算法

使用工具:Weka

编程语言:Java、Python(其实完全用Java就可以完成,但用Python用习惯了,所以文件处理部分用的Python)

实验思路:将120回依次按不同划分节点(简称ncd)分为两类,进行决策树模型训练,用训练出的模型的预测准确率来估计分类的纯度。一般来说,分类越准确,训练成果越好,预测准确率越高。因此,如果某划分下预测准确率不高,则认为该划分导致分类样本不纯,即划分错误。

实验过程:

  1. 使用分词器(我用的Weka的NShortSegment)对红楼梦原始文本进行分析,统计每一回中“之、其、了、的、呀”等55个字的数量,将得到的55维向量作为该回的特征向量。最终得到的120条55维特征向量作为数据集。

  2. 将数据集中的向量依次按照15、20、25……105作为划分节点,将数据集拟分成两类,每一类分别随机取其中的1/4作为训练集,然后使用10-split cross validation处理训练集,并将其放入Weka的J48决策树模型进行训练。这里值得注意的是"使用10-split cross validation处理训练集"可能会看起来很奇怪,这里不是笔误也不是我不明白交叉验证的意义而造成的失误,而是故意为之。为了使结果客观,我只取了其中1/4的数据用于整个训练、验证过程,剩下的3/4仅仅用于测试,不参与训练。这样我们就区分出了“学习空间”和“未认知空间”。由于红楼梦只有120回,因此,如果将全部样本投入训练,很容易造成过拟合使得结果不客观,而若是仅仅将1/4作为训练集直接训练,又会担心数据的使用率不够。因此这里让模型充分学习1/4的部分,最终在剩余3/4中进行测试,在我看来是相对不错的选择。

  3. 用训练好的模型对全部样本,以及3/4的测试样本分别进行预测,统计其准确率。

期望的结果:一个以ncd = 80为顶点的钟形曲线,也就是说,当以80回为划分节点的时候,分类效果最好,样本划分纯度最高,进一步可以说明红楼梦前80回和后40回风格不同,可能是两位作者所写。

f9e5d8af9c0a53dd0056cfa1eeb4e44b.png

(这是最后的结果,我下篇文章再分析吧)

(二)无监督学习:Kmeans聚类、层次聚类算法的使用

主要算法:Kmeans聚类算法、层次聚类算法、TSNE算法

使用工具:sklearn的cluster包

编程语言:Python

实验思路:将120回的特征向量视为120个55维点,对其使用Kmeans聚类算法进行分类,看是否会将前80回和后40回刚好分成两个部分,至少可以看出哪些部分是相似的。然后用层次聚类算法,看这120回特征向量分为多少部分比较合适。

0324906862a4c9ffabd8a8e1fbbc4de0.png

三国演义和红楼梦的特征向量,用TSNE算法降到2维后的结果

左边是三国演义,右边是红楼梦

实验过程:

  1. 和有监督学习的第一条完全相同,得到120条55维特征向量作为数据集

  2. 使用Kmeans算法,将120条数据分别分为2、3、4、5、6类。

    8855b4f3da805ca839a31a696cc83412.png

    可以看出,聚类之间区分不是很明显

  3. 使用TSNE算法进行降维处理,降到2维后,作图观察结果

    39499cdd5e467b943ba0319beddba02d.png

    紫色是前80回,黄色是后四十回,可以看出二者并未明显区分

  4. 使用层次聚类算法分类,观察结果。

4d39e31ab3ffd0c644db879f4ee1cd86.png

期望的结果:看聚类情况,哪几回被分为一类,就说明哪几回的相似度大。而层次聚类可以直接观察出哪几回适合分到一起。

先写到这里吧,后面的分析等我下篇文章再说吧。其实这个结果上个月就做出来了,但我是那种做出来之后就懒得写报告的类型,所以就……拖到了现在。而且这些研究是有很大问题的,下篇文章我再剖析一下问题吧。

参考文献:

[1]《红楼梦》的作者真的是曹雪芹吗?- 国学之光的回答 - 知乎 https://www.zhihu.com/question/25708974/answer/281537259

[2]陈炳藻.从词汇上的统计论《红楼梦》的作者问题[C].首届国际《红楼梦》研讨会, 1980.

[3]李贤平.《红楼梦》成书新说[J].复旦学报(社会科学版),1987(05):3-16.

[4]施建军.基于支持向量机技术的《红楼梦》作者研究[J].红楼梦学刊,2011(05):35-52.

[5]刘颖,肖天久.《红楼梦》计量风格学研究[J].红楼梦学刊,2014(04):260-281.

[6]施政.《红楼梦》研究中的统计方法综述[J].吉林省教育学院学报,2019,35(01):151-156.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值