python实验12_中文文本分析

news2025/2/26 23:26:50

实验12:中文文本分析

1.实验目标及要求

(1)掌握jieba库的常用方法。
(2)掌握使用WordCloud库绘制词云的方法。
(3)掌握使用networkx库绘制关系图的方法。

2. 实验主要内容

(1)分析文本“水浒.txt”,分词并统计有实质意义的词频(跟内容息息相关)。
(2)将《水浒》中的高频词制作词云。
(3)分析每一章节的“喜怒哀乐”走向。
(4)使用networkx库绘制《水浒传》中的人物关系图。对小说中关键人物的称呼进行必要的统一,计算人物之间的共现关系(假设出现在同一个段落中的人物之间具有共现关系),根据人物的共现关系绘制人物关系图。

代码部分:(1)

import jieba
s=open('水浒传.txt','r',encoding='utf-8',errors='ignore').read()   #读取文件·
jieba.load_userdict('水浒传.txt')
words=jieba.lcut(s)   # 进行分词操作

stopwords_list=[]     # 创建中文停用词列表
with open('stopword.txt','r',encoding='utf-8') as f:
    for line in f:
        line = line[:-1]
        stopwords_list.append(line)

words_dict={}
for word in words:
    if len(word)==1:
        continue
    if word=='宋江道':
        word='宋江'
    if word =='智深' or word =='和尚':
        word='鲁智深'
    if word =='太尉':
        word='高太尉'
    # 长度大于1和不在停用词中的词 保存到字典并记录词频
    if word not in stopwords_list:
        words_dict[word]=words_dict.get(word,0)+1
words_list=list(words_dict.items())
words_list.sort(key=lambda x:x[1],reverse=True)  #按词频大小排序

# 将词和词频保存在文件中
f=open('input水浒传.txt','w',encoding='utf-8')
for i in range(len(words_list)):
    k,v=words_list[i]
    f.write('{:<8}{:>2}\n'.format(k,v))
f.close()
print('输出成功')

输出结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码部分:(2)


# 生成词云图
from imageio.v2 import imread
import wordcloud
text=open('input水浒传.txt','r',encoding='utf-8').read()
wordmap=wordcloud.WordCloud(background_color='white',width=1000,height=800,font_path=r'C:\Windows\Fonts\simkai.ttf',mask=imread('1.jpg'))
wordmap.generate(text)
wordmap.to_file('词云图.jpg')

在这里插入图片描述

代码部分:(3)

import re
import matplotlib.pyplot as plt
f=open('水浒传.txt','r',encoding='utf8').read()
lst_chapter=[]
chapter=re.findall("第[\u4E00-\u9FA5]+回",f)
for x in chapter:
    if x=='第三卷上有回' or x=='第方回' or x=='第一百零五回宋公明避暑疗军兵乔道清回':
        continue
    if x not in lst_chapter:
        lst_chapter.append(x)

lst_start_chapter=[]
for x in lst_chapter:
    lst_start_chapter.append(f.index(x))
lst_end_chapter=lst_start_chapter[1:]+[len(f)]
lst_chapter=list(zip(lst_start_chapter,lst_end_chapter))

cnt_enjoy=[]
cnt_cry=[]
cnt_pity=[]
cnt_laugh=[]
for i in range(120):
    start=lst_chapter[i][0]
    end=lst_chapter[i][1]
    cnt_enjoy.append(f[start:end].count('喜'))
    cnt_laugh.append(f[start:end].count('乐'))
    cnt_cry.append(f[start:end].count('怒'))
    cnt_pity.append(f[start:end].count('哀'))

plt.subplot(2,2,1)
plt.plot(range(120),cnt_enjoy,label='喜')
plt.legend()
plt.subplot(2,2,2)
plt.plot(range(120),cnt_cry,label='怒')
plt.legend()
plt.subplot(2,2,3)
plt.plot(range(120),cnt_pity,label='哀')
plt.legend()
plt.subplot(2,2,4)
plt.plot(range(120),cnt_laugh,label='乐')
plt.legend()
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.show()

在这里插入图片描述

代码部分:(4)
from matplotlib import pyplot as plt
import networkx as nx

Names=['宋江','林冲','武松','吴用','卢俊义','鲁智深','柴进','公孙胜','戴宗','晁盖','朱仝','燕青','高太尉','杨志','史进','西门庆','阮小七']
relations={}
lst_para=open('水浒传.txt','r',encoding='utf-8').read().split('\n')#lst_para是每一段
for text in lst_para:
    for name_0 in Names:
        if name_0 in text:
            for name_1 in Names:
                if name_1 in text and name_0!=name_1 and (name_1,name_0) not in relations:
                    relations[(name_0,name_1)]=relations.get((name_0,name_1),0)+1
maxRela=max([v for k,v in relations.items()])
relations={k:v /  maxRela for k,v in relations.items()}

plt.figure(figsize=(15,15))
G=nx.Graph()
for k,v in relations.items():
    G.add_edge(k[0],k[1],weight=v)
    #筛选权重大于0.6的边
elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight']>0.6]
#筛选权重大于0.3小于0.6的边
emidle=[(u,v) for (u,v,d) in G.edges(data=True) if (d['weight']>0.3) & (d['weight']<=0.6)]
#筛选权重小于0.3的边
esmall=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight']<=0.3]
#设置图形布局
pos=nx.spring_layout(G)
#设置节点样式
nx.draw_networkx_nodes(G,pos,alpha=0.8, node_size=1200)
#设置大于0.6的边的样式
nx.draw_networkx_edges(G,pos,edgelist=elarge, width=2.5,alpha=0.9,edge_color='g')
#0.3~0.6
nx.draw_networkx_edges(G,pos,edgelist=emidle, width=1.5,alpha=0.6,edge_color='y')
#<0.3
nx.draw_networkx_edges(G,pos,edgelist=esmall, width=1,alpha=0.4,edge_color='b',style='dashed')
nx.draw_networkx_labels(G,pos,font_size=12)
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.axis('off')
plt.title("水浒传人物关系图")
plt.show()

在这里插入图片描述

3. 心得体会

经过本次实验,感觉到了难度的升高,也是到目前为止感觉难度最高的一次实验里。因为对这三个模块不是很熟悉,所以需要从基础开始入手来进行学习这三个模块的知识点。对于jieba库的学习还算是轻松,因为实验内容就是知识点的基础内容,也是使用最多的,所以根据视频讲解也是很快的就完成了对文章的分词操作,关键是引入停用词文件,将不需要的高频词去掉,就能得到跟文章相关性比较大的词频了。对于WordCloud库绘制词云的学习也是轻松,因为所用到的代码也就是几行而已,感叹到这个模块的功能强大,只要简单的一行代码,调用模块内部函数,将传入的参数生成一张词云图,可见python的模块确实给使用者提供了相当大的帮助。唯一遇到头疼的就是networkx库了,看完PPT也算是茅塞顿开,将这一块的知识点成功的填补完成,将剩下的人际关系图结合matplotlib库做出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答&#xff1a; ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构&#xff0c;它是由数组、单向链表、红黑树组成. 当我们初始…

谈谈你对Spring的理解

谈谈你对Spring的理解 一&#xff0c;什么是Spring 1.介绍 Spring是一个用于开发Java应用程序的工具集合&#xff0c;它提供了许多方便的组件和工具&#xff0c;可以帮助开发者更轻松地构建企业级应用程序。 Spring Framework是Spring的核心部分&#xff0c;它可以帮助开发者…

windows的adb环境安装

需要配置androidhome和一些path

基于情感分析的网络舆情热点分析系统 计算机竞赛

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

2023年信息科学与工程学院学生科协第二次软件培训

2023年信息科学与工程学院学生科协第二次软件培训 文章目录 2023年信息科学与工程学院学生科协第二次软件培训一维数组数组的概念定义格式一维数组的访问例题&#xff1a;练习题&#xff1a; 数组元素数量一维数组的初始化 二维数组定义格式二维数组的访问二维数组的存储结构二…

实现多余内容变成省略号

实现效果 代码 <p class"item-content">{{ item.content }}</p>样式 .item-content {white-space: nowrap;/* 禁止换行 */overflow: hidden;/* 隐藏溢出部分 */text-overflow: ellipsis;/* 使用省略号表示溢出部分 */ }

21.4 Python 使用GeoIP2地图定位

GeoIP2是一种IP地址定位库&#xff0c;它允许开发人员根据IP地址查找有关位置和地理位置的信息。它使用MaxMind公司的IP地址数据库&#xff0c;并提供一个方便的Python API。GeoIP2可以用于许多不同的应用程序&#xff0c;例如网站分析、广告定位和身份验证。GeoIP2提供了许多不…

达梦管理工具报错“结果集不可更新,请确认查询列是否出自同一张表,并且包含值唯一的列。”

在使用达梦数据库管理工具时&#xff0c;我们测试过程中时常需要更新表数据&#xff0c;有时为了便捷&#xff0c;会直接使用管理工具修改表数据的值&#xff0c;但偶尔会遇到“结果集不可更新&#xff0c;请确认查询列是否出自同一张表&#xff0c;并且包含值唯一的列。”的报…

天津五家受欢迎的python培训机构 python凭什么这么火?

在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;非常容易上手&#xff0c;许多想学编程的小伙伴都从python入手&#xff0c;今天我们就来聊聊关于大家非常困惑的一些点&#xff0c;下面就一起来看看吧。 python火的原因 …

Java的反射(reflection)机制的简单使用

目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义 Java的反射机制是运行时的状态&#xff0c;可以通过反射来调用类里面的属性和方法&#xff0c;私有的属性和方法也可以调用&#xff0c;也可以对它们进行修改。 二…

React 核心与实战2023版

课程亮点: 完整的前后台项目(PC+移动;完成业务;)React 最新企业标准技术栈(React 18 + Redux + ReactRouter + AntD)React + TypeScript (为大型项目奠定了基础)课程内容安排: React 介绍 React 是什么? React 是由Meta公司研发,是一个用于 构建Web和原生交互界面…

升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败

升级 IDE Xcode 15 后本地模拟器 Simulator 全被清空,反复重新尝试 Get 下载频频因网络异常断开而导致失败 ... 注:通过 Get 方式下载一定要保证当前网络环境足够平稳,网络环境不好的情况下该方法几乎成不了 解决办法 Get 方式行不通可以尝试通过 官网 途径先下载 模拟器安装包…

电脑待办事项提醒工具用哪个?

在一个繁忙的办公楼里&#xff0c;人们匆匆忙忙地穿梭着&#xff0c;电脑屏幕前的每个人都有着繁重的工作任务。为了应对这些任务&#xff0c;有人喜欢在纸上列出清单&#xff0c;有人则更愿意在电脑上记录&#xff0c;日常记录待办事项建议大家可以使用提醒工具敬业签。 敬业…

ubuntu 22.04 截图工具 shutter

sudo apt install shutter 快捷键F1 注意不支持wayland&#xff0c;登录时不要选择ubuntu wayland

Java并发编程第10讲——CAS相关知识点详解

前面介绍锁的时候顺便也提到了CAS&#xff0c;但作为JUC的“基石”和面试中的高频考点&#xff0c;还是不够。所以&#xff0c;本篇文章将从CAS的概念入手&#xff0c;逐步深入介绍12个Atomic原子操作类、CAS的实现原理&#xff08;源码解析&#xff09;、Unsafe类、CAS存在的问…

Oracle通过透明网关查询SQL Server 报错ORA-00904

Oracle通过透明网关查询SQL Server 报错ORA-00904 问题描述&#xff1a; 只有全表扫描SELECT * 时SQL语句可以正常执行 添加WHERE条件或指定列名查询&#xff0c;查询语句就报错 问题原因&#xff1a; 字段大小写和SQLSERVER中定义的不一致导致查询异常 解决办法&#xff1a; 给…

JVM——堆内存调优(Jprofiler使用)Jprofile下载和安装很容易,故没有记录,如有需要,在评论区留言)

堆内存调优 当遇到OOM时&#xff0c;可以进行调参 1、尝试扩大堆内存看结果 2、分析内存&#xff0c;看哪个地方出现了问题&#xff08;专业工具&#xff09; 调整初始分配内存为1024M&#xff0c;调整最大分配内存为1024M&#xff0c;打印GC细节&#xff08;如何添加JVM操…

「快学Docker」Docker镜像和容器的创建与管理

「快学Docker」Docker镜像和容器的创建与管理 引言什么是Docker镜像&#xff1f;镜像获取和使用镜像获取镜像使用 什么是Docker容器&#xff1f;Docker容器与主机之间的交互基于Dockerfile创建镜像基于镜像创建容器总结 引言 Docker镜像和容器是当今云计算领域中最受欢迎的技术…

【Buildroot】记一次编译出错gzip: popt-1.16.tar.gz: not in gzip format--更改br里面的默认下载地址

文章目录 我在一次正常的编译过程中遇到了&#xff0c;如下的错误&#xff1a; rootubuntu:/home/liefyuan/Linux/rk356x_linux/buildroot# make -j16 make: Circular /home/liefyuan/Linux/rk356x_linux/buildroot/output/build/iproute2-4.14.1/.stamp_configured <- bus…

Trie树/字典树的原理及实现[C/C++]

文章目录 前言引例&#xff1a;Google经典面试题字典树的原理与实现定义字典树的结构字典树的操作字符串插入字符串查询 字典树的实现字符集数组法节点类结构设计节点的接口字符映射节点类的代码实现 字典树类结构设计字典树接口实现 字符集映射法&#xff08;适用性广&#xf…