基于ML的红楼梦作者分析
《红楼梦》,原名《石头记》,中国古代章回体长篇小说,中国古典四大名著之一。其通行本共120回,一般认为前80回是清代作家曹雪芹所著,后40回作者为无名氏,整理者为程伟元、高鹗。《红楼梦》百度百科
我们基于聚类方法(K-means)无监督学习和Naive Bayes监督学习方法进行有关章节作者的探索。
1 |
|
1. 数据处理
1 |
|
2. 聚类算法
1 |
|
(120, 45)
2.1 k-means聚类
1 |
|
------------K-Means聚类------------
全章回结果:
[1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1
1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0]
前80回结果:
[1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1
1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1
1 1 1 1 1 1]
后40回结果:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0]
2.2 层次聚类
1 |
|
效果不太好(´,,•ω•,,‘),我们选择淘汰此方法。
3. 朴素贝叶斯方法
用于多项式模型的朴素贝叶斯分类器
多项式朴素贝叶斯分类器适用于具有离散特征的分类(例如,用于文本分类的字数统计)。多项式分布通常需要整数特征计数。但是,实际上,小数计数(例如tf-idf)也可能起作用。
在使用贝叶斯分类之前,为了便于处理问题,我们进行如下的假设。首先,我们将问题定义为二分类问题,即假设前面某部分由曹雪芹所写,后面某部分由另一个人所写(如高鹗)。朴素贝叶斯方法为有监督的方法,需要先进行标注。我们基于前面的假设同时尽量可能充分地训练模型,将最前面(前40章)标注为作者0;将最后面(后20章)标注为作者1。因此第41-100章为待分类数据,从而划分训练数据和预测数据。
3.1 添加标签
1 |
|
C:\Users\admin\AppData\Local\Temp/ipykernel_25524/1077375511.py:6: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
traindata0['label']=0;
C:\Users\admin\AppData\Local\Temp/ipykernel_25524/1077375511.py:7: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
traindata1['label']=1;
3.2 数据集划分
1 |
|
3.3 训练与分类
1 |
|
结果展示
1 |
|
------------Naive Bayes model------------
41-80章节的贝叶斯分类结果为:
array([0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int64)
1 |
|
81-100章节的贝叶斯分类结果为:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1],
dtype=int64)
虽然模型建立的依赖于我们的假设,且训练数据较少,但是分类的结果还是很理想的。:.゚ヽ(。◕‿◕。)ノ゚.:。+゚
基于ML的红楼梦作者分析
https://e-alan.github.io/2023/02/04/基于ML的红楼梦作者分析/