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

采用了K-means聚类和层次聚类。密度聚类效果不太好就舍弃了

用到的库

import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
import re

各章节虚词统计

统计的虚词用这些:

1.十三个文言虚词: 之 、 其、 或、 亦 、 方 、 于、 即 、 皆、 因 、 仍、 故、 尚、 乃。
2.九个句尾虚字: 呀 、 吗 、 咧、 罢咧、 啊 、 罢 、 罢了、 么 、 呢
2.十三个常用的白话虚字: 了、 的、 着、 一、 不 、 把、 让 、 向、 往、 是 、 在、 别、 好
4.十个表示转折、程度、比较等意的虚字: 可、 便、 就、 但 、 越 、 再、 更、 比、 很 、 偏。
参考文献:李贤平.《红楼梦》成书新说.复旦学报(社会科学版).1987年第5期.

def get_data():
    big_xuci=['之','其','或','亦','方','于','即','皆','因','仍','故','尚','乃',
              '呀','吗','咧','罢咧','啊','罢','罢了','么','呢',
              '了','的','着','一','不','把','让','向','往','是','在','别','好',
              '可','便','就','但','越','再','更','比','很','偏']
    #xuci:18个常用虚词
    #xuci=['而','何','乎','乃','其','且','若','所','为','焉','也','以','因','于','与','则','者','之']
    f = open('《红楼梦》完整版.txt',encoding='utf-8')
    s=f.read()
    #章节划分
    #建立章节名的正则表达式
    rule = re.compile('第[一二三四五六七八九十百]+回  ')
    zj=rule.split(s)
    zj=zj[1:]

    data=np.zeros([len(zj),len(big_xuci)])
    for i in range(len(zj)):
        for j in range(len(big_xuci)):
            data[i,j]=zj[i].count(big_xuci[j])
    
    
    #这里使用的是该章中,该虚词在该章出现次数占该章统计的全部虚词出现的次数
    sdata=np.zeros([len(data),len(big_xuci)])
    for i in range(len(data)):
        for j in range(len(big_xuci)):
            sdata[i,j]=data[i,j]/sum(data[i])
    #归一化
    scaler=MinMaxScaler().fit(sdata)
    ndata=scaler.transform(sdata)
    return ndata

聚类

data=get_data()
#1------kmeans聚类------
kmeans=KMeans(n_clusters=2).fit(data)
jg=kmeans.labels_
print('------------K-Means聚类------------')
print('全章回结果:\n',jg)
print('前80回结果:\n',jg[:80])
print('后40回结果:\n',jg[80:])
'''
效果不太好
#2------密度聚类------
from sklearn.cluster import DBSCAN
def dbscan(e,mins):
    dbs=DBSCAN(eps=e,min_samples=mins).fit(data)
    return dbs.labels_
dbs=dbscan(0.010,40)
print('------------密度聚类------------')
print('全章回结果:\n',dbs)
'''
#3------层次聚类------
from sklearn.cluster import AgglomerativeClustering
agg = AgglomerativeClustering(linkage='ward', n_clusters=2).fit(data)
print('------------层次聚类------------')
print('全章回结果:\n',agg.labels_)
print('前80回结果:\n',agg.labels_[:80])
print('后40回结果:\n',agg.labels_[80:])

运行结果

结果和大众认为的还是差不多的(高鹗续书说)
在这里插入图片描述

本文通过对文本人物关系、文本结构分层、作者行文风格的分析来分析中文文本。 针对问题一,我们运用聚类分析和层次分析建立模型从物理结构与逻辑结构两方面来分析文本,我们提取文本中和文本标题中的人名作为特征项,用matlab编程分别统计每个人名在各个段落中的频数。通过运用主成分分析法对文本进行的分析我们得出自变量与常数项几乎不相关,因此不需要采取主成分回归分析。通过系统聚类分析,我们得到了聚类图,从中得出了主演人物之间的关系。通过层次划分,我们将样本一划分为两层,样本二划分为两层,样本三划分为两层。最后通过matlab编程统计样本中虚词的频数,并且分别对样本中虚词总体和各个虚词进行统计,运用计算风格学理论,我们得出前八十回与后四十回作者的行文风格存在差异。 针对问题二,我们对聚类分析、层次划分、行文风格进行了检验。对于聚类分析的结果,我们与从对文本概述的文学概括分析得到的人物关系进行比较检验,验证了聚类分析结果是可靠性。对于层次分析,我们通过用Excel对数据做出折线图,对图形进行分析,得出与用层次分析算法得出的相同的人物关系结论。 针对问题三,我们计算了各个样本中主要人物的比重,做出了折线图,从图中我们得出了文本结构一致性的结论,体现了三个样本的相同性。通过计算同一个人物在不同样本中的频数(以黛玉为例),我们得出各个样本由于主题思想的不同主要人物也有差异。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值