python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频
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自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频相关推荐
- 【python数据挖掘课程】十三.WordCloud词云配置过程及词频分析
这篇文章是学习了老曹的微信直播,感觉WordCloud对我的<Python数据挖掘课程>非常有帮助,作者学习后准备下次上课分享给我的学生,让他们结合词频分析来体会下词云.希望这篇基础文章对 ...
- python十角星_使用 Python 绘制《星战》词云
作者介绍 Rafael Schultze-Kraft "前神经科学家,数据挖掘及机器学习的狂热爱好者,Python 的狂热粉丝" 使用 Python 绘制<星战>词云 ...
- python爬取微博数据词云_用Python爬取微博数据生成词云图片
原标题:用Python爬取微博数据生成词云图片 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求职,一站式搞定! 对商业智能BI.大数 ...
- 使用Python做中文分词和绘制词云
使用Python做中文分词和绘制词云 李小璐出轨云词图 作为一门编程语言,Python的编写简单,支持库强大,应用场景多,越来越多的人开始将它作为自己的编程入门语言. Python一个比较重要的场景是 ...
- python制作词云时出现figure1 figure2_「中文版」如何在Python中生成任何形状的词云...
有机会介绍一些有趣的项目,向更多人甚至是非技术人员推广Python和人工智能的东西还是蛮有意义的.话不多说,本文将介绍如何将你喜欢的文章或者歌词做一个炫丽的词云图片. 什么是词云呢?简单来说就是,将提 ...
- python实现对小说的文本分析(人物关系图,人物词云等)
文本分析 0.效果图 这里有些"二人"."不会"等词语没用筛选掉,手动筛选即可. 1.整体思路: 调用的库:jieba,matplotlib,networkx, ...
- python人物关系抽取小说_用python分析小说人物关系(一)——理论篇
1.工具介绍 jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里,我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网 ...
- python词云分析难吗_Python 词云分析周杰伦《晴天》
听说,Python是可以这样跳动着前 面 满天星辰的夜晚,他们相遇了... 夏天的时候,她慢慢的接近他,关心他,为他付出一切: 秋天的时候,两个人终於如愿的在一起,分享一切快乐的时光但终究是快乐时光短 ...
- python词云需要导入什么包_[python] 词云:wordcloud包的安装、使用、原理(源码分析)、中文词云生成、代码重写...
词云,又称文字云.标签云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客. ...
最新文章
- 2022-2028年中国PET薄膜行业市场深度分析及未来趋势预测报告
- APUE(第七章)进程环境
- 程序员常用网址,必须收藏
- Android热修复之 阿里开源的热补丁
- tem在c语言中的作用,Temtem状态有什么效果 Temtem各状态效果介绍_游侠网
- C#调用存储过程的通用类
- java切片_ java中一个极其强悍的新特性Stream详解(非常实用)
- BZOJ 1304: [CQOI2009]叶子的染色
- 学习进度 - 011
- OPC Expert 最新版Crack
- 微信小程序接收后台返回的文件流并打开
- 四叉树 Quadtrees
- 禅道mysql怎么在本地配置_本地安装部署禅道
- matlab存取面shp
- FineBI 的多系列折线图
- oracle的dba_ segment,Dba_segments详解
- 题外话之怎么脱离旱鸭子
- ImageColorizer:在线黑白照片免费上色
- Springboot jar包外置教程
- 【文献阅读】Expanding the mutation and phenotype spectrum of MYH3-associated skeletal disorders