采用了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:])
运行结果
结果和大众认为的还是差不多的(高鹗续书说)