代码实现 | LDA方法分析红楼梦各回主题

本文通过LDA方法对《红楼梦》各回进行主题分析,首先进行数据预处理,包括分词、去停词,接着展示全文词频、词云图和人物出场情况,重点分析宝玉的CP。在LDA模型中,揭示了各回主题,并完成课程任务,对回目进行分类和对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


点击此处下载数据

1 数据预处理

1.1 准备工作

引入需要的模块,设置显示方式,修改工作路径,如未安装jieba包需要在命令行中输入pip install jieba安装

import os
import re
import jieba
import json
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
import numpy as np
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.image as mpimg
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
from sklearn.decomposition import LatentDirichletAllocation
from scipy.interpolate import spline
import random
from scipy.cluster import hierarchy
from sklearn import decomposition as skldec

# 设置字体
font = mpl.font_manager.FontProperties(fname='C:\Windows\Fonts\STXINWEI.TTF')
# 设置pandas显示方式
pd.set_option("display.max_rows",10)
pd.options.mode.chained_assignment = None  # default='warn'

# 设置显示图像的方式
%matplotlib inline
%config InlineBackend.figure_format = "retina"
%config InlineBackend.figure_format = "retina"

os.chdir("C:\Aruc\learning\大四上\贝叶斯\LDA")
print(os.getcwd())
C:\Aruc\learning\大四上\贝叶斯\LDA
1.2 读入文本

首先读入红楼梦文本,并按照章节处理为列表,再读入停用词表(合并了红楼梦停用词表、哈工大停用词表、四川大学停用词表、中文停用词表等)

# 读入红楼梦文本
f = open('红楼梦.txt',encoding='utf-8')
quanwen = f.read()
quanwen.replace('\n','')
# 出现“第xx回 ”则断开
quanwen_list = re.split('第[\u4e00-\u9fa5]{1,3}回 ',quanwen)[1:121]

# 读入停用词表
f = open('stopword1.txt')
stop_words = f.readlines()
for i in range(len(stop_words)):
    stop_words[i] = stop_words[i].replace('\n','')
    
print('红楼梦共有{}章,{}个停用词'.format(len(quanwen_list),len(stop_words)))
红楼梦共有120章,1604个停用词
1.3 分词、去停词

每章分别分词、去停词,同时将长度为1的字符删掉,将结果分章节保存

# 分词、去停词
jieba.load_userdict('红楼梦分词词典.txt')
quanwen_fenci = []
for i in range(len(quanwen_list)):
    temps = list(jieba.cut(quanwen_list[i]))
    quanwen_fenci.append([])
    for temp in temps:
        # 将长度为1的字符删掉
        if len(temp) > 1 and temp not in stop_words:
            quanwen_fenci[i].append(temp)

# 将结果分章节保存
for i in range(len(quanwen_fenci)):
    with open('红楼梦分章节分词/{}.json'.format(i),'w',encoding='utf-8') as f:
        json.dump(quanwen_fenci[i],f)

# 查看第一章前100分分词结果
print(quanwen_fenci[0][0:100])
['甄士隐', '梦幻', '识通灵', '贾雨村', '风尘', '闺秀', '开卷', '第一回', '作者', '自云', '因曾', '历过', '梦幻', '之后', '真事', '隐去', '通灵', '撰此', '石头记', '一书', '故曰', '甄士隐', '但书中', '所记', '何事', '何人', '自又云', '风尘碌碌', '一事无成', '念及', '当日', '女子', '细考', '觉其', '行止', '见识', '之上', '堂堂', '须眉', '诚不若', '裙钗', '实愧', '有余', '无益', '之大', '无可如何', '之日', '自欲', '已往', '所赖', '天恩祖', '锦衣', '纨绔', '饫甘餍肥', '父兄', '教育', '之恩', '师友', '规谈', '之德', '今日', '一技无成', '半生', '潦倒', '之罪', '编述', '一集', '以告', '天下人', '罪固', '闺阁', '中本', '历历', '有人', '不可', '不肖', '自护己', '一并', '泯灭', '今日', '之茅', '椽蓬', '瓦灶', '绳床', '晨夕', '风露', '阶柳庭花', '未有', '襟怀', '笔墨', '未学', '下笔', '无文', '假语', '村言', '演出', '一段', '故事', '亦可', '闺阁']
# 绘制各章节分词后词数
chapter_lens = [len(fenci) for fenci in quanwen_fenci]
p1 = plt.bar(range(len(chapter_lens)),chapter_lens)
plt.title("各章节分词后词数", fontproperties=font,size = 15)
plt.show()

在这里插入图片描述

每个章节的词数在1500上下波动

2 基本情况

2.1 全文词频及词云图

统计全文的词频并展示结果,绘制全文及部分章节的词云图

# 统计全文的词频
word_df = pd.DataFrame({
   
   'word':np.concatenate(quanwen_fenci)})
word_stat = word_df.groupby(by = 'word')['word'].agg({
   
   'number':np.size})
# 调整为按词频由高到低展示
word_stat = word_stat.reset_index().sort_values(by='number',ascending=False)
word_stat
word number
14253 宝玉 3653
34618 贾母 1233
7490 凤姐 1184
33165 袭人 1108
39821 黛玉 1007
... ... ...
16876 得备 1
16875 得善缘 1
16874 得十来 1
16872 得力 1
39910 龟大 1

39911 rows × 2 columns

全文共有39882个词语,宝玉、贾母、凤姐、袭人、黛玉等主角人物出现次数最多

# 将词频数据框转化为字典
word_dict = {
   
   }
for key,value in zip(word_stat.word,word_stat.number):
    word_dict[key] = value
    
# 绘制词云
back_coloring = mpimg.imread('词云图片.jpg')
wc = WordCloud(font_path='C:\Windows\Fonts\STXINWEI.TTF',
               margin=5, width=2000, height=2000,
               background_color="white",
               max_words=800,
               mask=back_coloring,
               max_font_size=400,
               random_state=42,
               ).generate
注:请在所有本程序时先到后台栏目管理里面设定会员在线时间,否者会员登陆时要出错 安装使用说明: 1、修改index/articleconn.asp、admin/articleconn.asp、lanserver/conn.asp和 user/conn.asp 文件里的数据库连接参数 2、将所有文件上传至你的主机上,然后运行index.html即可(里面带2个插件)! 3、后台登录地址:你的域名/admin/login.asp 登录名admin和密码均admin888 4、要使用邮件发送功能请修改sendmail.asp文件,修改的地方有: __________________________________________________________ 找到以下代码,改相应的参数即可:(此功能需服务器支持:JMAIL系统) smtpserver ="邮局服务器地址(IP)" smtpuser ="你的EMAIL登录帐号(如:[email protected])" smtppwd ="你的EMAIL登录密码" __________________________________________________________ 5、要改首页的模板找到admin/index_mb.asp,用网页编辑器编辑就行,最新电影JS 请找到admin/js_news.asp,把里面我的地址改成你的地址。 6、如果有会员在会员期没到时又想升级另下订单的话,请直接修改会员个人资料里的“付款状态”   将里面的数字清空即可再次提交订单了,这里的数字说明如下:  付款状态=" "(空)  即未提交订单  付款状态=0   提交了订单,但未得到确认(不能再提交了)  付款状态=1       提交了订单,并已得到确认(不能再提交了) 8、网站广告请修改ad/js目录下的1.js,2.js,3.js,4.js。 ***********************************
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值