python倚天屠龙记人物关系、词云、柱状图、-词频

# -*- coding = utf-8 -*-
# @Time : 2022/3/17 15:45
# @Author : luxiaoguo
# @File : Chinese.py
# @Software : PyCharm# 导入networkx,matplotlib包
import re
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
# 词云
import wordcloud
import imageio# 定义主要人物的个数
keshihuaTop=10  # 可视化人物图人数
mainTop = 100  # 人物词云图人物数
peopleTop=10  # 人物关系图# 获取小说文本
# 读取文件
fn = open('prepare/yitiantulongji.txt', encoding="utf-8")
string_data = fn.read()  # 读出整个文件
fn.close()  # 关闭文件# 文本预处理
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 stopwordsstopwords = stopwordslist('prepare/tingyong.txt')# 通过键值对的形式存储词语及其出现的次数
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")# 得到 分词和出现次数
def getWordTimes2():# 分词,返回词性poss = pseg.cut(txt)for w in poss:if w.flag != 'nr' or len(w.word) < 2 :continue  # 当分词长度小于2或该词词性不为nr(人名)时认为该词不为人名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("output/倚天屠龙记词频_人名.txt", 300)# 将txt文本里的数据转换为字典形式
fr = open('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("output/倚天屠龙记人物出场次数可视化图.html")# 生成词云
def creat_wordcloud():bg_pic = imageio.imread('prepare/setting.png')wc = wordcloud.WordCloud(font_path='c:\Windows\Fonts\simhei.ttf',background_color=None,width=480, height=853,contour_color="red", contour_width=8,max_words=500,max_font_size=100,mask=bg_pic            # mask参数设置词云形状,)# 从单词和频率创建词云wc.generate_from_frequencies(counts2)# generate(text)  根据文本生成词云# wc.generate(txt)# 保存图片wc.to_file('output/倚天屠龙记词云_人名.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("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# 解决中文乱码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签# 生成人物关系图
def creat_relationship():# 人物节点颜色colors = color_list()Names = list_name[0:peopleTop]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) + 1maxRela = max([v for k, v in relations.items()])relations = {k: v / maxRela for k, v in relations.items()}# return relationsplt.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)  # 用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)# 设置节点样式nx.draw_networkx_nodes(G, pos, alpha=0.8, node_size=1300, node_color=colors)# 设置大于0.6的边的样式nx.draw_networkx_edges(G, pos, edgelist=elarge, width=2.5, alpha=0.9, edge_color='g')# 0.3~0.6nx.draw_networkx_edges(G, pos, edgelist=emidle, width=1.5, alpha=0.6, edge_color='y')# <0.3nx.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=14)plt.title("《倚天屠龙记》主要人物社交关系网络图")# 关闭坐标轴plt.axis('off')# 保存图表plt.savefig('output/《倚天屠龙记》主要人物社交关系网络图.png', bbox_inches='tight')plt.show()def main():#生成词频词性文件create_wordproperties()# 人物出场次数可视化图creat_people_view()# 词云图creat_wordcloud()creat_wordcloud_pyecharts()# 人物关系图creat_relationship()if __name__ == '__main__':main()

python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频相关推荐

  1. 【python数据挖掘课程】十三.WordCloud词云配置过程及词频分析

    这篇文章是学习了老曹的微信直播,感觉WordCloud对我的<Python数据挖掘课程>非常有帮助,作者学习后准备下次上课分享给我的学生,让他们结合词频分析来体会下词云.希望这篇基础文章对 ...

  2. python十角星_使用 Python 绘制《星战》词云

    作者介绍 Rafael Schultze-Kraft "前神经科学家,数据挖掘及机器学习的狂热爱好者,Python 的狂热粉丝" 使用 Python 绘制<星战>词云 ...

  3. python爬取微博数据词云_用Python爬取微博数据生成词云图片

    原标题:用Python爬取微博数据生成词云图片 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数 ...

  4. 使用Python做中文分词和绘制词云

    使用Python做中文分词和绘制词云 李小璐出轨云词图 作为一门编程语言,Python的编写简单,支持库强大,应用场景多,越来越多的人开始将它作为自己的编程入门语言. Python一个比较重要的场景是 ...

  5. python制作词云时出现figure1 figure2_「中文版」如何在Python中生成任何形状的词云...

    有机会介绍一些有趣的项目,向更多人甚至是非技术人员推广Python和人工智能的东西还是蛮有意义的.话不多说,本文将介绍如何将你喜欢的文章或者歌词做一个炫丽的词云图片. 什么是词云呢?简单来说就是,将提 ...

  6. python实现对小说的文本分析(人物关系图,人物词云等)

    文本分析 0.效果图 这里有些"二人"."不会"等词语没用筛选掉,手动筛选即可. 1.整体思路: 调用的库:jieba,matplotlib,networkx, ...

  7. python人物关系抽取小说_用python分析小说人物关系(一)——理论篇

    1.工具介绍 jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里,我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网 ...

  8. python词云分析难吗_Python 词云分析周杰伦《晴天》

    听说,Python是可以这样跳动着前 面 满天星辰的夜晚,他们相遇了... 夏天的时候,她慢慢的接近他,关心他,为他付出一切: 秋天的时候,两个人终於如愿的在一起,分享一切快乐的时光但终究是快乐时光短 ...

  9. python词云需要导入什么包_[python] 词云:wordcloud包的安装、使用、原理(源码分析)、中文词云生成、代码重写...

    词云,又称文字云.标签云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客. ...

最新文章

  1. 2022-2028年中国PET薄膜行业市场深度分析及未来趋势预测报告
  2. APUE(第七章)进程环境
  3. 程序员常用网址,必须收藏
  4. Android热修复之 阿里开源的热补丁
  5. tem在c语言中的作用,Temtem状态有什么效果 Temtem各状态效果介绍_游侠网
  6. C#调用存储过程的通用类
  7. java切片_ java中一个极其强悍的新特性Stream详解(非常实用)
  8. BZOJ 1304: [CQOI2009]叶子的染色
  9. 学习进度 - 011
  10. OPC Expert 最新版Crack
  11. 微信小程序接收后台返回的文件流并打开
  12. 四叉树 Quadtrees
  13. 禅道mysql怎么在本地配置_本地安装部署禅道
  14. matlab存取面shp
  15. FineBI 的多系列折线图
  16. oracle的dba_ segment,Dba_segments详解
  17. 题外话之怎么脱离旱鸭子
  18. ImageColorizer:在线黑白照片免费上色
  19. Springboot jar包外置教程
  20. 【文献阅读】Expanding the mutation and phenotype spectrum of MYH3-associated skeletal disorders

热门文章

  1. 乐视笔试算法题美团算法笔试题
  2. linux使用指定网卡ping,LINUX ping 指定网卡
  3. Webpack的基本使用
  4. Oracle查看ogg延时,OGG复制进程延迟不断增长
  5. 在ECS中安装Docker在内部访问RDS数据库
  6. 怎么制作鸿蒙系统启动盘,开物成务,鸿蒙操作系统全景解构
  7. 计算机报名照片不能小于20kb,公务员考试:上传20KB电子照片难倒不少考生
  8. Unity UGUI 代码改变遮挡层级
  9. vs code常用的插件
  10. python3和5_Python3算法之五:最大子序和