为什么80%的码农都做不了架构师?>>>   

在学界一般认为,《红楼梦》后 40 回并非曹雪芹所著。本文尝试应用机器学习的方法来分析原著文本中作者的用词习惯,从技术角度去说明《红楼梦》前 80 回和后 40 回的写作风格差别,继而可以确认后 40 回非原作者所写。

整个项目存放在 Git@OSC 和 reality-of-Dream-of-Red-Mansions。

主要原理

每个作者写作都有自己的用词习惯和风格,即使是故意模仿也会留下很多痕迹。

在文言文中,文言虚词分布均匀,书中每个回目都会出现很多文言虚词,差别在于出现频率不同,我们把文言虚词的出现频率作为特征。

不只文言虚词,还有其他的词在所有回目中出现频率很多。比如对第 80 回进行词频统计,得到

了   172
的   142
我   70
宝玉  65
你   61
道   54
他   51
也   50
着   48
是   40
说   38

这些高频词汇也可以作为特征向量。

本文将 20~29 回(诗词曲比较均衡)作为类别 1 的学习样本,将 110~119 回作为类别 2 的学习样本。

将两个类别的特征向量输入到 SVM(支持向量机) 进行训练得出一个分类模型。再对剩余回目进行分类,看它们分别偏向于哪个类别。

SVM 相关原理参见 NG 的公开课 Machine Learning 和 scikit-learn 库

相关学术论文参见

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

李贤平. (1978).《红楼梦》成书新说. 复旦学报(社会科学版).

特征选取

['之', '其', '或', '亦', '方', '于', '即', '皆', '因', '仍', '故', '尚', '呢', '了', '的', '着', '一', '不', '乃', '呀', '吗', '咧', '啊', '把', '让', '向', '往', '是', '在', '越', '再', '更', '比', '很', '偏', '别', '好', '可', '便', '就','但', '儿',                  # 42 个文言虚词'又', '也', '都', '要',       # 高频副词 '这', '那', '你', '我', '他'  # 高频代词'来', '去', '道', '笑', '说'  #高频动词
]

选取常用的 42 个文言虚词和通过词频统计得到的高频使用的词作为特征,分别计算它们在各个回目中出现的频率作为特征向量。

在源码中由 modelBuilder.py 中的 build_feature_vector 函数实现。

目录结构

.
├── README.md
├── textProcesser.py  # 文本处理
├── modelBuilder.py   # 模型建立
├── decisionMaker.py  # 作出判断
├── neg_trainset.npy  # 正例训练集
├── pos_trainset.npy  # 负例训练集
├── trainset.npy      # 训练集
├── testset.npy       # 测试集
├── text
│   ├── redmansions.txt # 原著文本
│   ├── chapter-1       # 按章分开,第一章
│   ├── chapter-n
│   ├── chapter-words-1 # 第一章分词结果
│   ├── chapter-words-n
│   ├── chapter-wordcount-1 # 第一章词频统计结果
│   └── chapter-wordcount-n

使用步骤

  • 运行 textProcesser.py,将原著文本分为章节,分词,词频统计
  • 运行 modelBuilder.py,对文本章节提取特征向量,建立分类模型
  • 运行 decisionMaker.py,对文本进行分类

结论

1~80
[ 1.  1.  1.  1.  1.  2.  2.  1.  1.  2.  2.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  2.  2.  2.  1.  1.  1.  1.  1.  2.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]81~120
[ 1.  1.  2.  1.  1.  2.  2.  1.  1.  2.  1.  2.  2.  2.  2.  2.  2.  1.  2.  2.  1.  2.  2.  2.  2.  2.  2.  1.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.]

1 指该回目属于类别 1,2 指该回目属于类别 2。

可以得出结论

  • 前 80 回属于一类,后 40 回属于一类
  • 80 回左右是分界点
  • 后 40 回风格不同于前 80 回

81~120 回中有一些被分成了 1 类,这与特征选取有关,还与使用的原著版本有关。这里的版本是网上下的电子版,版本不明,建议使用人民文学出版社 1982 年出版的《红楼梦》作为研究对象。

1~80 回有一些被分成了 2 类,可能是后 40 回作者在续写过程中对部分章节进行了修改。

参考

https://github.com/Huangtuzhi/reality-of-Dream-of-Red-Mansions

http://fuzhii.com/2016/01/16/redmansions/

http://scikit-learn.org/stable/modules/svm.html#svm

转载于:https://my.oschina.net/lvyi/blog/603952

用机器学习的方法鉴别红楼梦作者相关推荐

  1. 统计虚词使用不同聚类方法判别红楼梦作者

    采用了K-means聚类和层次聚类.密度聚类效果不太好就舍弃了 用到的库 import numpy as np from sklearn.cluster import KMeans from skle ...

  2. 机器学习日常练习——红楼梦作者分析(聚类)

    红楼梦作者分析(聚类) 实验要求 实验题目:<红楼梦>作者分析 实验目的 实验内容 资料下载 实验过程: 问题分析: 解决思路: 代码: 代码一: 出现的问题 文件编码问题 将红楼梦数据, ...

  3. 机器学习之红楼梦作者判断(贝叶斯分类)

    上篇文章不带假设的使用聚类算法去判断红楼梦的作者,这一篇打算使用监督学习方法的贝叶斯分类,假设后四十回不是曹雪芹所写, 去做个验证. 关于我读过比较好的贝叶斯讲解:A simple explanati ...

  4. 数学建模训练 — 红楼梦作者解析

    摘要 <红楼梦>不同章回之间作者的异同,历来被学术界争论不休.当新的计算工具出现之后,我们就可以用数学的知识统计分析<红楼梦>不同章回作者异同的问题. 针对问题一,问题一要求根 ...

  5. 代码实现 | LDA方法分析红楼梦各回主题

    文章目录 1 数据预处理 1.1 准备工作 1.2 读入文本 1.3 分词.去停词 2 基本情况 2.1 全文词频及词云图 2.2 人物出场情况 2.3 宝玉的cp 3 LDA分析红楼梦各回的主题 3 ...

  6. 【数学建模论文】数学模型分析红楼梦作者

    1.摘要 <红楼梦>不同章回之间作者的异同,历来被学术界争论不休.当新的计算工具出现之后,我们就可以用数学的知识统计分析<红楼梦>不同章回作者异同的问题. 针对问题一,问题一要 ...

  7. python红楼梦作者_用 Python 分析《红楼梦》,后四十回是曹雪芹所写吗?(开源)...

    原标题:用 Python 分析<红楼梦>,后四十回是曹雪芹所写吗?(开源)

  8. 用人工智能判断红楼梦后40回是否是曹雪芹写的

    本博文主要是用机器学习的方法判断红楼梦后四十回是不是曹雪芹写的 开发语言: Python3.6 开发工具: numpy,matplatlib,sklearn 相关算法: SVM 先放上预测结果,再慢慢 ...

  9. 用Python分析《红楼梦》:见证了贾府的兴衰,你是否还能“笑道”世事无常

    没读过<红楼梦>也能知道前后四十回是不是一个作者写的?很久以前,数据侠黎晨,用机器学习的算法分析了<红楼梦>,认为后四十回和前八十回内容上有明显差距.不过,数据侠楼宇却不这么认 ...

最新文章

  1. thinkPHP 模板的使用技巧(十三)
  2. [汇编] 001基础知识-什么是汇编
  3. make_heap(),push_heap(),pop_heap(),sort_heap()用法。
  4. 【转】2010全球最值得模仿的230个网站
  5. php 实时监测网站是否异常_网站监控劫持问题,怎么通过网站监控解决劫持问题...
  6. [精品]CSAPP Bomb Lab 解题报告(五)
  7. Python 生成器 和 yield 关键字
  8. 有一门课不及格的学生(信息学奥赛一本通-T1048)
  9. java右移位_Java移位运算符详解实例
  10. Linux公网渗透抓鸡实验
  11. 百度文库免费下载(附:分享一些有趣的网站,最后一个可以免飞下载百度文库)
  12. 【无标题】互联网广告投放优势和前景
  13. 如何利用Xshell远程登陆主机后使用代理服务器上网
  14. A4988与42步进电机
  15. 【将门创投】如何让飘在半空的计算机视觉技术与需求落地?
  16. 【源码】SIMULINK中的Logitech X-56 H.O.T.A.S飞行控制器
  17. 小数化分数(C++)
  18. 重装mysql 重启服务service mysqld restart一直卡着怎么解决Redirecting to /bin/systemctl restart mysqld.service
  19. mac 安装homebrew 报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refu
  20. 职场七年之痒,如何抉择

热门文章

  1. kerberos 巨坑
  2. php默认ssl版本号,centos 6.5系统PHP环境下的CURL库的SSL Version默认为NSS,怎么变更为OpenSSL?...
  3. 简阅客户端应用Android源码
  4. uniapp判断浏览器
  5. C语言qsort的用法
  6. JDK8详细图文安装教程
  7. 菜鸟先飞之初识Hive、安装教程及常见问题
  8. python学习(二)常用运算符
  9. c++ 入门(自学过程)
  10. C++(三十六)之电视机和遥控器友元类