重做红楼梦的数据分析-判断前80回后40回是否一个人写的
红楼梦的数据分析已经有许多人做过,结论也各不相同。
我在知乎上看到两篇帖子:
1. 通过数据挖掘能分析《红楼梦》各回的真伪吗?
2. 用机器学习判定红楼梦后40回是否曹雪芹所写
觉得很有意思,于是用自己的方法重做了一次
环境配置:
我主要使用的编程环境是Jupyter Notebook 4.2.1,因为可以调整每一个代码块,方便
纠错什么的。
然后我们得用到一个中文分词工具 - Jieba, 是由百度工程师Sun Junyi开发的
之后我们还得用到一些做机器学习/数据挖掘的标准包:numpy, matplotlib 和 sklearn
数据准备:
用爬虫思想,我去这个网站扒下来红楼梦全集,然后剪掉中间所有的换行符,使得每一回只
占文档中的一行。这样的话,方便接下来读取。
直接上代码:
一、导入各种需要的包
# -*-coding:utf-8 -*-
import urllib
import urllib2
import re
from bs4 import BeautifulSoup as bs
book = []
for i in range(120):
print("处理第{}回...".format(i+1))
if i+1<10:
url = "http://www.purepen.com/hlm/00{}.htm".format(i+1)
elif i+1 < 100:
url = "http://www.purepen.com/hlm/0{}.htm".format(i+1)
else:
url = "http://www.purepen.com/hlm/{}.htm".format(i+1)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
bsObj = bs(response.read().decode('gb18030')) #注意原网页的codec是哪一种
chapter = bsObj.table.font.contents[0]
book.append(chapter)
下面是结果:
之后把全文存进一个txt文件:
with open('红楼梦.txt', 'w') as f:
f.write(codecs.BOM_UTF8)
for chap in book:
s = chap.encode('utf-8').strip()
f.write("".join(s.split()))
f.write('\n')
数据ready,可以开始进行处理了
处理:
直接上代码:
一、导入各种需要的包
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D