2021-03-11 15:09
所属部位: > Python > Python数据信息剖析小实例——红楼梦文字剖析(三) KMeans聚类算法
from nltk.cluster.kmeans import KMeansClusterer
from nltk.cluster.util import cosine_distance
import pandas as pd
import matplotlib.pyplot as plt
# import seaborn as sns
df = pd.read_csv("./hlm_hui_with_cutwords.csv")
cutwords = df['cutwords'].apply(lambda x:x.replace(","," ")) #将每回的词性标注取下,每回的每一个词性标注间用空格符分隔,回到一个series
# print(cutwords)
#转化成tf-idf引流矩阵
transformer=TfidfVectorizer()
tfidf = transformer.fit_transform(cutwords)
tfidf_arr = tfidf.toarray() #变为数字能量数组方式
print(tfidf)
print(tfidf_arr.shape) # 样子为120行,41371列;即120回和4137一个词
#根据KMeans聚类算法剖析
kmeans = KMeansClusterer(num_means=3,distance=cosine_distance) #分为三类,应用余弦类似剖析
kmeans.cluster(tfidf_arr)
#获得归类
kinds = pd.Series([kmeans.classify(i) for i in tfidf_arr])
print(kinds)
kinds_df = df[["chapterNum","fullName"]]
kinds_df['label'] = kinds.values #给每回标明上归类标识
# print(kinds_df)
#绘制归类的条形图和散点图
kinds_df_group = kinds_df.groupby(by=["label"])['label'].size() #回到的是一个series
print(type(kinds_df_group))
print(kinds_df_group.index)
print(kinds_df_group.values)
plt.rcParams['font.sans-serif']=['SimHei'] #一切正常显示信息汉语
plt.rcParams['axes.unicode_minus'] = False #一切正常显示信息负号
plt.bar(x=kinds_df_group.index,height=kinds_df_group.values)
#此条形图加上y轴的数据信息标明
print(kinds_df_group)
for x,y in zip(kinds_df_group.index,kinds_df_group.values):
plt.text(x,y,"%s" % y)
plt.xlabel("归类类型")
plt.ylabel("章节目录数")
plt.title("章节目录归类总数")
# plt.xticks(labels=kinds_df_group.index)
plt.show()


上边将红楼梦的全部回数分成3个类型,下边是获得的每一个类型下的章节目录总数:

红楼梦章节目录归类总数
张柏沛IT技术性blog > Python数据信息剖析小实例 红楼梦文字剖析(三) KMeans聚类算法
点一下拷贝转截该一篇文章