Python 三国演义文本可视化(词云,人物关系图,主要人物出场次数,章回字数) 您所在的位置:网站首页 python关联性分析的库 Python 三国演义文本可视化(词云,人物关系图,主要人物出场次数,章回字数)

Python 三国演义文本可视化(词云,人物关系图,主要人物出场次数,章回字数)

2023-11-07 01:49| 来源: 网络整理| 查看: 265

文章目录 效果展示介绍软件架构使用说明导入需要的库执行main.py 这里以三国演义为例

三国演义.txt alice_mask.png 词云形状

效果展示

在这里插入图片描述在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

介绍

Python读取小说文本,绘制词云图,主要人物出场次序,社交网络关系图,章回字数

软件架构

环境准备:Python3 主要模块:networkx wordcloud matplotlib pyecharts imageio jieba

使用说明 导入需要的库

先进行 pip install

#导入networkx,matplotlib包 import networkx as nx import matplotlib.pyplot as plt import jieba.posseg as pseg #引入词性标注接口 #导入random包 import random import codecs # 导入pyecharts from pyecharts import options as opts # pyecharts 柱状图 from pyecharts.charts import Bar # pyecharts 词云图 from pyecharts.charts import WordCloud # pyecharts 折线/面积图 from pyecharts.charts import Line # 词云 import wordcloud import imageio 执行main.py

有详细注释

# -*- coding: utf-8 -*- """ Created on Wed Jun 23 11:41:01 2021 @author: 陈建兵 """ #导入networkx,matplotlib包 import networkx as nx import matplotlib.pyplot as plt import jieba.posseg as pseg #引入词性标注接口 #导入random包 import random import codecs # 导入pyecharts from pyecharts import options as opts # pyecharts 柱状图 from pyecharts.charts import Bar # pyecharts 词云图 from pyecharts.charts import WordCloud # pyecharts 折线/面积图 from pyecharts.charts import Line # 词云 import wordcloud import imageio # 定义主要人物的个数(用于人物关系图,人物出场次数可视化图) mainTop = 15 #读取文本 def read_txt(filepath): file=open(filepath,'r+',encoding='utf-8') txt=file.read() file.close() return txt #获取小说文本 txt = read_txt('三国演义.txt') #停词文档 def stopwordslist(filepath): stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()] return stopwords #stopwords = stopwordslist('中文停用词库.txt') excludes = {'将军', '却说', '令人', '赶来', '徐州', '不见', '下马', '喊声', '因此', '未知', '大败', '百姓', '大事', '一军', '之后', '接应', '起兵', '成都', '原来', '江东', '正是', '忽然', '原来', '大叫', '上马', '天子', '一面', '太守', '不如', '忽报', '后人', '背后', '先主', '此人', '城中', '然后', '大军', '何不', '先生', '何故', '夫人', '不如', '先锋', '二人', '不可', '如何', '荆州', '不能', '如此', '主公', '军士', '商议', '引兵', '次日', '大喜', '魏兵', '军马', '于是', '东吴', '今日', '左右', '天下', '不敢', '陛下', '人马', '不知', '都督', '汉中', '一人', '众将', '后主', '只见', '蜀兵','马军','黄巾','立功','白发','大吉','红旗','士卒','钱粮','于汉','郎舅', '龙凤', '古之', '白虎', '古人云', '尔乃', '马飞报', '轩昂', '史官', '侍臣', '列阵','玉玺','车驾','老夫','伏兵','都尉','侍中','西凉','安民','张曰','文武','白旗', '祖宗','寻思'} # 排除的词汇 #使用精确模式对文本进行分词 #words = jieba.lcut(txt) counts = {} # 通过键值对的形式存储词语及其出现的次数 #得到 分词和出现次数 def getWordTimes(): # 分词,返回词性 poss = pseg.cut(txt) for w in poss: if w.flag != 'nr' or len(w.word) "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("三国演义人物出场次数可视化图.html") # 生成词云 def creat_wordcloud(): bg_pic=imageio.imread('alice_mask.png') wc=wordcloud.WordCloud(font_path='c:\Windows\Fonts\simhei.ttf', background_color='white', width=1000,height=800, #stopwords=excludes,# 设置停用词 max_words=500, mask=bg_pic # mask参数设置词云形状 ) # 从单词和频率创建词云 wc.generate_from_frequencies(counts) # generate(text) 根据文本生成词云 #wc.generate(txt) # 保存图片 wc.to_file('三国演义词云_人名.png') # 显示词云图片 plt.imshow(wc) plt.axis('off') plt.show() # 使用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("三国演义词云_人名.html") ) # 使用pyecharts 的方法生成章回字数 def chapter_word(): # 进行章回切片 list2 = txt.split("------------") chapter_list = [i for i in range((len(list2)))] word_list = [len(i) for i in list2] ( Line(init_opts=opts.InitOpts(width="1400px", height="700px")) .add_xaxis(xaxis_data=chapter_list) .add_yaxis( series_name="章回字数", y_axis=word_list, markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ] ), markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average", name="平均值")] ), ) .set_global_opts( title_opts=opts.TitleOpts(title="三国演义章回字数", subtitle=""), tooltip_opts=opts.TooltipOpts(trigger="axis"), toolbox_opts=opts.ToolboxOpts(is_show=True), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), ) .render("三国演义章回字数.html") ) #颜色生成 colorNum = len(list_name[0:mainTop]) #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 "#"+color def color_list(): colorList = [] for i in range(colorNum): colorList.append(randomcolor()) return colorList # 解决中文乱码 plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 #生成人物关系图 def creat_relationship(): # 人物节点颜色 colors = color_list() Names=list_name[0:mainTop] relations={} #按段落划分,假设在同一段落中出现的人物具有共现关系 lst_para=(txt).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()} #return relations 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']


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有