本博文主要是用机器学习的方法判断红楼梦后四十回是不是曹雪芹写的

开发语言: Python3.6

开发工具: numpy,matplatlib,sklearn

相关算法: SVM

先放上预测结果,再慢慢分析设计步骤:

一. 设计思路

1. 整体设计思路

在已知了红楼梦前80回是曹雪芹写的基础下,为了验证后40回还是他写的,需通过学习前80章节的写作风格特色,从而根据对比前后风格的差别去判断。鉴于每一个作者的写作习惯和风格在一篇文章中基本不容易改变的特点,本次设计选前80回和后40回中的一些章节作为数据让机器去训练学习,然后通过训练之后的机器去预测每个章节的风格是属于前80回还是后40回,从而判定后40回的结果。

2. 设计步骤

<1> 为了使本次验证更具严谨性,我先把红楼梦分成三个部分,每部分各40章。然后利用jieba分词库拆分每一个部分,用算法提取每个部分出现词频最多的词,保存文档,手动去掉因为文章内容而造成前后出现次数差别大的人名,地名,专有名词等。

<2> 把<1>中的关键字整合在一起,按词频对它进行排序,筛选出现次数靠前的一部分作为特征向量。

<3> 对红楼梦的每一章节进行特征向量的提取,总共产生120个向量样本,每一个样本代表每一章的特征。

<4> 对数据进行PCA降维处理,得到的数据进行3D matplotlib绘图,对数据可视化处理。

<5> 选取前80回的15个样本和后40回的15个样本作为数据让机器训练。

<6> 最后把整个120章样本让训练好的机器进行预测,预测的结果如果后40回的风格和前80回风格截然不同,那么就推测的两部分是不同的人写的。

二. 分部设计

1. 三个部分生成的词频表进行整合后(截取了部分):

词频提取算法代码(Python)部分代码:

import jieba
import jieba.analyse
from collections import Counter  def word_split(TextPath, KeyWords_Num, KeyWords_Path, encoding = 'utf-8'):#text = open(TextPath, encoding = 'gb18030').read() #文本出现gbk错误时用encoding='gb18030'with open(TextPath, encoding = encoding) as fr:   #使用with open 自动会调用close,以防止出错text = fr.read()seg_list = jieba.cut(text, cut_all = False)  keywords = Counter()   #计值出现的次数,有key和valfor words in seg_list: if len(words) > 1 and words != '\r\n':keywords[words] += 1   #统计词频with open(KeyWords_Path, 'w') as fr_keywords:    for (key,val) in keywords.most_common(KeyWords_Num):fr_keywords.write(key + '  '*(6-len(key)) + str(val) + '\n' ) #保存关键词文本return keywords.most_common(KeyWords_Num)

2. 进行特征值处理后的样本(截取一部分)

整个样本是一个120*118的matrix , 每一行代表每一章样本,列向量是该样本的特征向量,这里只截取了一部分作为参考

这里展示下只展示部分关键代码:

def sample_build(FeaturesPath, ChapterLib, SavePath):Sample = {}Features = {}with open(FeaturesPath) as fr:     #把特征值文本存放在Features字典中featuresline = fr.readlines()for line in featuresline:line = line.strip()Features[line] = 0    for (num,val_chp) in ChapterLib.items(): #遍历每一个章节FeaturesVector = []Features_Tmp = Features.copy()    seg_list = jieba.cut(val_chp, cut_all = False)    for words in seg_list:  index = Features_Tmp.get(words,-1)   if index != -1:Features_Tmp[words] = Features_Tmp.get(words,-1) + 1 #每出现一次加1for (key,val) in Features_Tmp.items():  FeaturesVector.append(val)Sample[num] = FeaturesVectorwith open(SavePath, 'w') as fr:       #新建文本保存for (key,val) in Sample.items():fr.write(str(val) + '\n')return Sample    

3. 降维处理后,对数据进行3D matplotlib绘制,进行数据可视化,把抽样的样本放在空间中直观的展示出来。


图中红色的点代表前80回,绿色的点代表后40回。

明显可以观察到前80回和后40章写作风格用词的区别。

4. 用SVM(Support Vector Machines)进行机器学习

支持向量机将向量映射到一个更高维度的空间,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个超平行的距离最大化,从而减少预测误差。

5. 预测结果

用上面训练好的机器进行数据预测,得到如下结果:

结果表明机器能够预测后40回不是曹雪芹写的,且准确度高达95%

代码下载:https://download.csdn.net/download/flyoung1994/10345010

写在最后: 虽然此方法已经有很多人研究过了,本人在设计严谨性和可靠性做了更详细的分析,能够使机器更加准确的学习,进而提高了机器的泛化能力,能够更加准确的预测结果。

用人工智能判断红楼梦后40回是否是曹雪芹写的相关推荐

  1. [机器学习]---如何用机器学习来判定红楼梦后40回是否曹雪芹所写

    前言 看到用机器学习方法分析红楼梦的文章不少,也有好几种方法,大观是因为纯文字的分析成本低吧,比较适合初学者练手,先转载一两篇文章过来学习.所谓机器学习也是一些数学统计的方法,通过习惯用词来做判断, ...

  2. [机器学习]如何用机器学习来判定红楼梦后40回是否曹雪芹所写

    前言 今天在涉机器学习相关知识时,看到黎晨这篇文章,觉得蛮有意思的,拿来这里介绍大家.这里判定的维度越多越精准,下面判定仅供参考,仅供娱乐学习! #判定整体思路 主要从以下几个方面可以进行粗略进行判定 ...

  3. 重做红楼梦的数据分析-判断前80回后40回是否一个人写的

    重做红楼梦的数据分析-判断前80回后40回是否一个人写的 红楼梦的数据分析已经有许多人做过,结论也各不相同. 我在知乎上看到两篇帖子: 1. 通过数据挖掘能分析<红楼梦>各回的真伪吗? 2 ...

  4. 谈谈红楼梦(第1-5回)

    曹雪芹留给世人一部经典的小说,让人说不尽,道不完.因为有了红楼梦,产生了红学.而红楼梦原版的迷失又留给了世人多少遗憾,但是却给红楼梦带来了一种不可名状的残缺美.要说的实在是太多了.我想以红楼梦的一首好 ...

  5. python红楼梦人物词频统计_通过数据挖掘能分析《红楼梦》各回的真伪吗?

    可以的.小智最近就尝试通过用机器学习的方法,分析了一下红楼梦后四十回的真伪. 以下内容引自小智的微信公众号,转载需申请授权. ------------------------------------- ...

  6. [转载]论红楼“慧纹”即“回文锦”的隐写

    璎珞真是优雅 原文地址:论红楼"慧纹"即"回文锦"的隐写作者: 土默热红学 论红楼"慧纹"即"回文锦"的隐写 土默热 & ...

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

    流传到今天的<红楼梦>共有120回,很多人认为是曹雪芹写了前八十回,后四十回是高鹗续写.后来随着新材料的发现,红学界经过慎重考察,认为后四十回并不是高鹗所写,高鹗和程伟元只是整理出版了&l ...

  8. 谈谈红楼梦(第6-10回)

    这次说说红楼梦的第6到第10回.         第6回中写到贾宝玉初试云雨情,刘姥姥一进荣国府.贾宝玉初试云雨情后,宝玉视袭人更比别个不同,袭人待宝玉更为尽心.并不能因为这样的描写而否定红楼梦的伟大 ...

  9. 谈谈红楼梦(第11-15回)

    本次说说红楼梦第11至15回.第十一回是<<庆寿辰宁府排家宴 见熙凤贾瑞起淫心>>.本回以贾敬的寿辰做引,叙述王熙凤探望秦可卿的事情.此时的秦可卿已经有病在身.请看红楼梦中的叙 ...

最新文章

  1. 集成服务入门(实验9)日志记录和邮件通知
  2. 浏览器复制粘贴以及手机端webview复制粘贴
  3. IE 下 href 的 BUG
  4. spring boot实现软删除
  5. 01.elasticsearch-security_es鉴权机制
  6. wxPython实现在浏览器中打开链接
  7. 计算机网络课设题目java_java课程设计参考题目
  8. python输入流和输出流_Python 初体验之 输入输出流
  9. setTimeout/setInterval伪异步
  10. 小程序和android毕设,微信小程序毕设论文(完整)
  11. c语言程序设计网课作业答案,知到C语言程序设计基础网课答案
  12. 入门训练圆的面积_入门
  13. 防火墙Deny记录实时检测
  14. FTD2XX_NET.dll学习笔记
  15. 云计算笔记10day、11day
  16. C#练习题答案: TO DE-RY-PO-陆琪暗号【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  17. ILOG CPLEX OPL 编程手册,使用心得与简单例子
  18. 时代发展科技进步支付行业在不断的创新
  19. ChemDraw Std 14如何标记同位素
  20. 设定pic单片机端口为输入_如何设置PIC单片机的端口

热门文章

  1. 如何关闭139端口、445端口等
  2. 三维重建 - 摄像机标定和立体匹配中极线约束方法
  3. Cisco 3750 三层交换机配置
  4. 关于csim软件中的一些错误整理
  5. 自创小说《彩虹雨》 连载(一)
  6. 07.从密码学看进制转化
  7. python矩阵的切片操作
  8. ios375对应Android,iOS开发之尺寸(一):各种机型尺寸
  9. SpringBoot2.x 自动化生成代码整合Mybatis
  10. 6分钟彻底掌握存储和备份的区别