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

重做红楼梦的数据分析-判断前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 # 因为后面会用到3d作图
确定《红楼梦80与后40是否同一作者所写通常涉及文本风格分析自然语言处理技术。种常见方法是对比两部分的语言模型、词汇分布、句法结构以及主题致性等方面。这里提供一个简化版的概念性的Python代码示例,使用nltk库来进行基本的文本特征提取: ```python import nltk from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity # 假设你已经有了两个文本文件,分别代表8040的内容 with open('prequel.txt', 'r') as prequel_file, open('sequel.txt', 'r') as sequel_file: prequel_text = prequel_file.read().lower() sequel_text = sequel_file.read().lower() # 文本预处理(分词,去除停用词等) stop_words = set(nltk.corpus.stopwords.words('chinese')) # 如果需要针对中文 prequel_tokens = [word for word in nltk.word_tokenize(prequel_text) if word not in stop_words] sequel_tokens = [word for word in nltk.word_tokenize(sequel_text) if word not in stop_words] # 将文本转换成向量表示 vectorizer = CountVectorizer(decode_error='ignore') prequel_vec = vectorizer.fit_transform([prequel_tokens]) sequel_vec = vectorizer.transform([sequel_tokens]) # 计算相似度矩阵 similarity_matrix = cosine_similarity(prelim_vec.todense(), sequel_vec.todense()) # 对角线元素代表自身相似度,其余元素代表两部分之间的相似度 if similarity_matrix[0][0] > similarity_matrix[0][1]: print("可能存在同一作者") else: print("两部分风格差异较大,可能是不同作者")
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值