关于红楼梦Python文本分析

article/2025/11/10 1:17:45

1.  获取小说文本  读取文件

# 获取小说文本
# 读取文件
fn = open("prepare\\红楼梦_曹雪芹.txt", encoding="utf-8")
string_data = fn.read()  # 读出整个文件
fn.close()  # 关闭文件

2.对文本进行处理 

# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')  # 定义正则表达式匹配模式
txt = re.sub(pattern, '', string_data)  # 将符合模式的字符去除
print('预处理完毕')# 停词文档
def stopwordslist(filepath):stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]return stopwords
stopwords = stopwordslist('D:\\Python studybag\\prepare\\tingyong.txt')
excludes = {'之','其','方','即','因','仍','故','尚','乃','呀','吗','咧','罢','咧','啊','罢','了','么','或', ' 亦', '于', ' 皆', '的', '着', '一' , '不', '把', '让','向', '往', '是' , '在', '别','好', '可', '便', '就',' 但','越','再','更', '比','很','偏','那里','如今','一个','我们','你们','起来','姑娘','这里','二人','说道','知道','如何','今日','什么','于是','还有','出来','他们','众人','奶奶','自己','一面','太太','只见','怎么','两个','没有','不是','不知','这个','听见','这样','进来','告诉','东西','咱们','就是','如此','回来','大家','只是','老爷','只得','丫头','这些','不敢','出去','所以','不过','姐姐','的话','不好','鸳鸯','一时','过来','不能','心里','银子','答应','几个'} # 排除的词汇

3. 词频

# 通过键值对的形式存储词语及其出现的次数
counts1 = {}  # 存放词性词频
counts2 = {}  # 存放人物词频
# # 生成词频词性文件
def getWordTimes1():cutFinal = pseg.cut(txt)for w in cutFinal:if w.word in stopwords or w.word == None:continueelse:real_word = w.word + '_' + w.flagcounts1[real_word] = counts1.get(real_word, 0) + 1getWordTimes1()items1 = list(counts1.items())
# 进行降序排列 根据词语出现的次数进行从大到小排序
items1.sort(key=lambda x: x[1], reverse=True)# 导出数据
# 分词生成人物词频(写入文档)
def wordFreq1(filepath, topn1):with codecs.open(filepath, "w", "utf-8") as f:for i in range(topn1):word, count = items1[i]f.write("{}:{}\n".format(word, count))# 生成词频文件
wordFreq1("output\\红楼梦词频词性.txt", 300)# 将txt文本里的数据转换为字典形式
fr1 = open('output\\红楼梦词频词性.txt', 'r', encoding='utf-8')
dic1 = {}
keys1 = []  # 用来存储读取的顺序
for line in fr1:# 去空白,并用split()方法返回列表v1 = line.strip().split(':')dic1[v1[0]] = v1[1]keys1.append(v1[0])
fr1.close()list_name1 = list(dic1.keys())  # 人名
list_name_times1 = list(dic1.values())  # 提取字典里的数据作为绘图数据
def create_wordproperties():bar1 = Bar()bar1.add_xaxis(list_name1[0:keshihuaTop])bar1.add_yaxis("词语出现次数", list_name_times1)bar1.set_global_opts(title_opts=opts.TitleOpts(title="词频词性可视化图", subtitle="词频词性top10"),xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate": 45}))bar1.set_series_opts(label_opts=opts.LabelOpts(position="top"))# 生成 html 文件bar1.render("\\output\\红楼梦词频词性可视化图.html")

 

4. 对人名进行分析

# 得到 分词和出现次数
def getWordTimes2():# 分词,返回词性poss = pseg.cut(txt)for w in poss:if w.flag != 'nr' or len(w.word) < 2 or w.word in excludes:continue  # 当分词长度小于2或该词词性不为nr(人名)时认为该词不为人名elif w.word == '宝哥哥' or w.word == '宝玉曰' or w.word == '宝二爷' or w.word == '绛洞花主' \or w.word == '怡红公子' or w.word == '宝兄弟' or w.word == '混世魔王' or w.word == '宝玉':real_word = '贾宝玉'elif w.word == '黛玉' or w.word == '颦儿' or w.word == '潇湘妃子' or w.word == '林姑娘' or \w.word == '林妹妹' or w.word == '黛玉曰' or w.word == '颦颦':real_word = '林黛玉'elif w.word == '宝钗' or w.word == '宝钗曰' or w.word == '宝丫头' or w.word == '宝姐姐' or w.word == '薛大姑娘':real_word = '林宝钗'elif w.word == '熙凤' or w.word == '熙凤曰' or w.word == '琏二奶奶' or w.word == '凤辣子' or w.word == '凤哥儿' \or w.word == '凤丫头' or w.word == '凤姐' or w.word == '凤姐儿' or w.word == '琏二嫂子':real_word = '王熙凤'elif w.word == '贾母' or w.word == '贾母曰' or w.word == '史太君' or w.word == '老祖宗' or w.word == '老太太' \or w.word == '老神仙':real_word = '贾母'elif w.word == '湘云' or w.word == '湘云曰' or w.word == '枕霞旧友' or w.word == '史大姑娘' or w.word == '云妹妹':real_word = '史湘云'elif w.word == '姨妈' or w.word == '姨妈曰' or w.word == '薛夫人' or w.word == '薛王氏' or w.word == '姨太太':real_word = '贾迎春'elif w.word == '探春' or w.word == '探春曰' or w.word == '玫瑰花' or w.word == '蕉下客':real_word = '贾探春'elif w.word == '贾珍' or w.word == '贾珍曰' or w.word == '珍老爷' or w.word == '大爷' or w.word == '大哥哥' :real_word = '贾珍'elif w.word == '贾琏' or w.word == '贾琏曰' or w.word == '琏二爷' or w.word == '二爷':real_word = '贾琏'elif w.word == '袭人' or w.word == '袭人曰' or w.word == '蕊珠' or w.word == '花珍珠':real_word = '袭人'elif w.word == '平儿' or w.word == '平儿曰' or w.word == '小平' or w.word == '平姑娘' or w.word == '平姐姐':real_word = '平儿'  # 把相同意思的名字归为一个人else:real_word = w.wordcounts2[real_word] = counts2.get(real_word, 0) + 1getWordTimes2()
items2 = list(counts2.items())
# 进行降序排列 根据词语出现的次数进行从大到小排序
items2.sort(key=lambda x: x[1], reverse=True)# 导出数据
# 分词生成人物词频(写入文档)
def wordFreq2(filepath, topn):with codecs.open(filepath, "w", "utf-8") as f:for i in range(topn):word, count = items2[i]f.write("{}:{}\n".format(word, count))# 生成词频文件
wordFreq2("D:\\Python studybag\\output\\红楼梦词频_人名.txt", 300)# 将txt文本里的数据转换为字典形式
fr = open('D:\\Python studybag\\output\\红楼梦词频_人名.txt', 'r', encoding='utf-8')
dic = {}
keys = []  # 用来存储读取的顺序
for line in fr:# 去空白,并用split()方法返回列表v = line.strip().split(':')dic[v[0]] = v[1]keys.append(v[0])
fr.close()
# 输出前几个的键值对
print("人物出现次数TOP", mainTop)
print(list(dic.items())[:mainTop])#  绘图
# 人名列表 (用于人物关系图,pyecharts人物出场次数图)
list_name = list(dic.keys())  # 人名
list_name_times = list(dic.values())  # 提取字典里的数据作为绘图数据# 可视化人物出场次数
def creat_people_view():bar = Bar()bar.add_xaxis(list_name[0:keshihuaTop])bar.add_yaxis("人物出场次数", list_name_times)bar.set_global_opts(title_opts=opts.TitleOpts(title="人物出场次数可视化图", subtitle="红楼梦TOP10"),xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate": 45}))bar.set_series_opts(label_opts=opts.LabelOpts(position="top"))# bar.render_notebook()  # 在 notebook 中展示# make_snapshot(snapshot, bar.render(), "bar.png")# 生成 html 文件bar.render("D:\\Python studybag\\output\\红楼梦人物出场次数可视化图.html")

 5.词云

 

# 使用pyecharts 的方法生成词云
def creat_wordcloud_pyecharts():wordsAndTimes = list(dic.items())(WordCloud().add(series_name="人物次数", data_pair=wordsAndTimes,word_size_range=[20, 100], textstyle_opts=opts.TextStyleOpts(font_family="cursive"), ).set_global_opts(title_opts=opts.TitleOpts(title="红楼梦词云")).render("D:\\Python studybag\\output\\红楼梦词云_人名.html"))# 颜色生成
colorNum = len(list_name[0:peopleTop])# print('颜色数',colorNum)
def randomcolor():colorArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']color = ""for i in range(6):color += colorArr[random.randint(0, 14)]return "#" + colordef color_list():colorList = []for i in range(colorNum):colorList.append(randomcolor())return colorList

 


http://chatgpt.dhexx.cn/article/2yjpL862.shtml

相关文章

Google BERT 中文应用之《红楼梦》中对话人物提取

​点击上方“迈微AI研习社”&#xff0c;选择“星标★”公众号 转载自&#xff1a;PaperWeekly 庞龙刚 之前看到过一篇文章&#xff0c;通过提取文章中对话的人物&#xff0c;分析人物之间的关系&#xff0c;很好奇如何通过编程的方式知道一句话是谁说的。但是遍搜网络没有发现…

【知识图谱】构建红楼梦知识图谱

在b站看到有人用知识图谱构建红楼梦的人物关系的知识图谱&#xff0c;跟着做了一遍&#xff0c;在这里记录。 1、安装neo4j 具体见&#xff1a;https://blog.csdn.net/Zhouzi_heng/article/details/110948997 2、为python安装py2neo4j py2neo是一个社区第三方库&#xff0c…

花了20分钟,给女朋友们写了一个web版群聊程序

WebSocket详解 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在 WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&#x…

外国人最习惯用的社交软件有哪些?

说到国外的社交软件&#xff0c;你的认知是否还只停留在Facebook上&#xff1f;今天带大家来看一看不同国家都用哪些社交软件。方便外贸人和各国客户沟通时&#xff0c;选择正确的社交软件&#xff0c;并掌握外贸必备的社媒营销技能。 相信现在每个人与世界的联系很大都是靠手机…

使用Python制作学习英语软件

前言&#xff1a; 由于Python考试临近&#xff0c;加上平时要学习英语&#xff0c;突发奇想制作一款和手机上app那样的记单词的简单软件&#xff0c;顺便复习一下Python。 步骤&#xff1a; 编辑一个保存单词的txt文档读取txt文件&#xff0c;制作成字典使用tkinter制作界面使…

外贸沟通中,老外最喜欢的聊天工具你了解?各国客户最常用的即时聊天APP整理及配套8个英语类工具推荐

作为外贸人&#xff0c;不要一味的跟客人谈生意&#xff0c;当然目的是这个。私下的问候&#xff0c;关心&#xff0c;沟通也是不可或缺的。很多老外不喜欢来回发邮件&#xff0c;那样速度慢&#xff0c;还得来回查看&#xff0c;因此很多在线的聊天工具就备受欢迎。 下面给大家…

计算机专业3分钟演讲能讲什么,面试三分钟演讲稿范文

面试三分钟演讲稿范文 20XX年4月26日至28日&#xff0c;我在华南师范大学网络学院参加了全国高校教师网络培训——同济大学龚沛曾教授团队主持的《大学计算机基础》全国精品课程网络培训&#xff0c;受益匪浅。龚沛曾教授讲授的《大学计算机基础》之计算机基础课程体系、计算机…

记一次技术分享演讲

**丨**版权说明 : 《记一次技术分享演讲》于当前CSDN博客和乘月网属同一原创&#xff0c;转载请说明出处&#xff0c;谢谢。 本文仅谈心得&#xff0c;不谈技术 谈谈为什么写心得 笔者自入学到现在工作已有20余载&#xff0c;虽然沉淀的文笔贫平&#xff0c;可也写过数篇作文&…

俞敏洪一分钟励志演讲稿

俞敏洪一分钟励志演讲稿 人的生活方式有两种&#xff0c; 第一种方式是像草一样活着&#xff0c; 你尽管活着&#xff0c;每年还在成长&#xff0c; 但是你毕竟是一棵草&#xff0c; 你吸收雨露阳光&#xff0c; 但是长不大&#xff0c; 人们可以踩过你&#xff0c; 但是人们不…

计算机基本知识3分钟演讲稿,3分钟演讲稿范文(精选3篇)

3分钟演讲稿范文(精选3篇) 演讲稿要求内容充实&#xff0c;条理清楚&#xff0c;重点突出。在社会一步步向前发展的今天&#xff0c;能够利用到演讲稿的场合越来越多&#xff0c;那么你有了解过演讲稿吗&#xff1f;下面是小编精心整理的3分钟演讲稿范文(精选3篇)&#xff0c;希…

Android4.3 Google Pinyin输入法UI定制

Android4.3 Google Pinyin输入法UI定制 先来看原版输入法的效果如下&#xff1a; 定制后的效果如下&#xff1a; SystemServer会启动InputMethodManagerService&#xff0c;在InputMethodManagerService中会启动action为"android.view.InputMethod"的Service&#x…

学习双拼必看:双拼输入法的心得以及快速入门办法

1.简单介绍一下双拼 2.总共18种双拼方案 3.15种双拼方案的具体映射 4.顺便提一下双拼口诀的事情 5.总结不同平台选择的方案 双拼&#xff08;也称双打&#xff09;是一种建立在拼音输入法基础上的输入方法&#xff0c;可视为全拼的一种改进&#xff0c;它通过将汉语拼音中每…

Qt编写可换肤的中文双拼汉字输入法

新版本&#xff1a; https://qtchina.blog.csdn.net/article/details/103945421 时间过得真快&#xff0c;不知不觉已到2015年&#xff0c;农历春节一眨眼就过去了&#xff0c;端正状态收拾心情整装待发出发。 曾经有段时间&#xff0c;我有一个很执着的梦想&#xff0c;我要…

Android仿微信聊天UI之处理软键盘抬升问题

前言&#xff0c;效果图 本文介绍如何解决软键盘遮挡问题&#xff0c;以下是仿微信聊天界面所制作的效果图&#xff1a; 一、ViewTreeObserver ViewTreeObserver&#xff0c;很明显通过名字就可以了解到它是View树的观察者。该类不能被实例化&#xff0c;但可以通过视图获取&…

解决手机端微信公众号内input输入框获取焦点后,底部导航栏显示在输入法软键盘上面的问题

今天遇到在微信公众号中打开网站,input 输入框和textarea输入框获取焦点后&#xff0c;弹出输入法键盘&#xff0c;将底部的导航栏”顶到“输入法键盘上面的问题&#xff0c;看着非常shit&#xff01; 直接上代码看效果 var clientHeight document.documentElement.clientHei…

教你在Windows自带的微软拼音输入法中用上小鹤双拼方案

微软拼音输入法是Windows 10操作系统中自带的输入法&#xff0c;虽然很多人在拿到一个新系统之后就安装一个新的输入法&#xff0c;比如搜狗输入法、手心输入法。但是很多人不知道最新版本的windows操作系统自带的微软拼音输入法&#xff0c;已经不像是以前windows 7操作系统的…

不甘心只做输入工具,搜狗输入法上线AI助手,提供智能服务

8月19日搜狗输入法上线了新功能——智能汪仔&#xff0c;在输入法中引入了AI助手&#xff0c;这是搜狗输入法继今年5月推出“语音变声功能”后又一个AI落地产品。 有了智能汪仔AI助手的加持后&#xff0c;搜狗输入法能够在不同的聊天场景&#xff0c;提供丰富多样的表达方式从…

524MB的微信输入法:没广告 你会用吗

&#x1f447;&#x1f447;关注后回复 “进群” &#xff0c;拉你进程序员交流群&#x1f447;&#x1f447; 来源丨 扩展迷EXTFANS https://mp.weixin.qq.com/s/asRqVjbn0lf8BmDnGY9Zig 相信很多小伙伴都有过这样的经历&#xff1a;和朋友聊天讨论某件东西&#xff0c;打开其…

Android之仿微信QQ聊天顶起输入法不顶起标题栏

在这记录一下输入法弹出的一系列问题&#xff0c;有的输入法弹出就把整个布局弹上去&#xff0c;有的输入法弹出布局不会有变化&#xff0c;有的输入法弹出遮盖输入框等等问题&#xff0c;网上也有很多说加着加那的&#xff0c;但是看一下都不是很完整&#xff0c;解决不了所有…

刚才发现微软拼音-简洁2010是目前比较适合程序员的输入法

微软拼音-简洁2010&#xff0c;在中文状态下&#xff0c;按 //&#xff0c;打出来就是 // 可是 百度输入法&#xff0c;QQ输入法、搜狗输入法 在中文状态下&#xff0c;按 //&#xff0c;打出来的都是 、、 这样写注释就麻烦了&#xff0c;还得切换成英文状态。 微软拼音-新体…