通过wordcloud库、matplotlib库、networkx 库实现四大名著人物词云、出场次数统计图、人物社交关系网络图

您所在的位置:网站首页 社交关系网络图networkx有哪些主要函数 通过wordcloud库、matplotlib库、networkx 库实现四大名著人物词云、出场次数统计图、人物社交关系网络图

通过wordcloud库、matplotlib库、networkx 库实现四大名著人物词云、出场次数统计图、人物社交关系网络图

2024-07-12 09:35| 来源: 网络整理| 查看: 265

通过wordcloud库、matplotlib库、networkx 库实现四大名著人物词云、出场次数统计图、人物社交关系网络图

你需要掌握的知识: 1.三大库 2.正则表达式 3.tkinter库 4.jieba库 5.python基本知识

效果如下:

在这里插入图片描述 源代码:

import re import jieba import wordcloud import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2Tk from imageio import imread import networkx as nx import matplotlib import tkinter as tk from tkinter import ttk from tkinter import * class Graph_make: def __init__(self): self.root=Tk() self.root.title('tk') self.root.geometry('1000x800') self.root.iconbitmap('0.gif') self.Image_info=LabelFrame(self.root) self.Image_info.place(x=100,y=320) self.Image_info1=LabelFrame(self.root) self.Image_info1.place(x=550,y=320) self.first=True self.Deal() self.root.mainloop() def Deal(self): self.List() self.Menu() number=tk.StringVar() self.Listchoose=ttk.Combobox(self.root,width=12,textvariable=number,state='readonly') self.Listchoose['values']=book self.Listchoose.bind("",self.show_msg) self.Listchoose.pack() self.Listchoose.set('四大名著') self.root.mainloop() def show_msg(self,*arg): self.Displayall(self.Listchoose.get()+'.txt') def Menu(self): self.v=StringVar(self.root) self.v.set('四大名著') om=OptionMenu(self.root,self.v,*book) om.bind('',self.submenu) om.focus_set() om.pack(side='left') def submenu(self,event): if self.v.get()=='四大名著': return self.Deal_data(self.v.get()+'.txt') self.draw(self.v.get()+'.txt') return def draw(self,filepath): print('键盘操作') self.root2=Tk() self.root2.geometry('1000x800') self.menubar=tk.Menu(self.root2) self.filemenu=tk.Menu(self.menubar,tearoff=0) self.menubar.add_cascade(label='exit',menu=self.filemenu) self.filemenu.add_command(label='exit',command=self.Exit) self.root2.config(menu=self.menubar) v=tk.IntVar() self.labelframe=LabelFrame(self.root2,text=self.v.get()) self.labelframe.pack(side='left') self.labelframe1=LabelFrame(self.root2,text=self.v.get(),padx=20,pady=10) self.labelframe1.pack(fill="both", expand=True) r1=tk.Radiobutton(self.labelframe,text='《'+filepath[:-4]+'》'+'词云',variable=v,value=1,command=self.wordcloud) r1.pack(anchor="w") r2=tk.Radiobutton(self.labelframe,text='《'+filepath[:-4]+'》主要人物社交关系网络图',variable=v,value=2,command=self.networks) r2.pack(anchor="w") r3=tk.Radiobutton(self.labelframe,text=filepath[:-4]+'主要人物统计图',variable=v,value=3,command=self.chart) r3.pack(anchor="w") self.root2.mainloop() def Exit(self): self.root2.destroy() def wordcloud(self): self.labelframe1.destroy() self.labelframe1=LabelFrame(self.root2,text='《'+self.v.get()+'》'+'词云',padx=20,pady=10) self.labelframe1.pack(fill="both", expand=True) self.Wordcloud(self.v.get()+'.txt',self.labelframe1) self.root2.update() def networks(self): self.labelframe1.destroy() self.labelframe1=LabelFrame(self.root2,text='《'+self.v.get()+'》主要人物社交关系网络图',padx=20,pady=10) self.labelframe1.pack(fill="both", expand=True) self.Networks(self.v.get()+'.txt',self.labelframe1) self.root2.update() def chart(self): self.labelframe1.destroy() self.labelframe1=LabelFrame(self.root2,text=self.v.get()+'主要人物统计图',padx=20,pady=10) self.labelframe1.pack(fill="both", expand=True) self.Chart(self.v.get()+'.txt',self.labelframe1) self.root2.update() def Deal_data(self,filepath): global relation,cnt relation.clear() cnt.clear() plt.rcParams['font.sans-serif']=['SimHei'] with open(filepath,encoding='utf-8') as file: text=file.read() file.close() words=jieba.lcut(text.strip()) stopwords=[line.strip() for line in open('停用表.txt','r',encoding='utf-8').readlines()] counts={} for word in words: if len(word)==1: continue elif word not in stopwords: counts[word]=counts.get(word,0)+1 items=list(counts.items()) items.sort(key=lambda x:x[1],reverse=True) for i in range(24): word,count=items[i] cnt[word]=count name=[] for i in range(24): name.append(items[i][0]) relation={} lst_para=text.split('\n') for txt in lst_para: for name1 in name: if name1 in txt: for name2 in name: if name2 in txt and name1!=name2 and (name2,name1) not in relation: relation[(name1,name2)]=relation.get((name1,name2),0)+1 maxRela=max([v for k,v in relation.items()]) relation={k:v/maxRela for k,v in relation.items()} def Displayall(self,filepath): print('鼠标操作') if self.first: self.button=Button(self.root,width=8,height=2,text="Back",bg="orange",font=("楷", 12),command=self.Back) self.button.place(x=0,y=550) self.first=False self.Deal_data(filepath) self.Chart(filepath,self.root) self.Wordcloud(filepath,self.Image_info) self.Networks(filepath,self.Image_info1) def Back(self): self.Image_info.place_forget() self.Image_info1.place_forget() self.root1.destroy() self.button.destroy() self.first=True self.root.update() def Convert(self,para1,para2): self.canvas1=FigureCanvasTkAgg(para1,para2) self.canvas1.draw() cv1=self.canvas1.get_tk_widget() cv1.pack(side=tk.TOP, fill=tk.X, expand=1) toolbar=NavigationToolbar2Tk(self.canvas1,para2) toolbar.update() self.canvas1._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH,expand=1) def Wordcloud(self,filepath,pos): if pos==self.Image_info: self.Image_info.destroy() self.Image_info=LabelFrame(self.root) self.Image_info.place(x=100,y=320) pos=self.Image_info self.root.update() Figure=plt.figure(num='词云') plt.title('《'+filepath[:-4]+'》'+'词云',color='white',fontweight='heavy',bbox=dict(facecolor='blue',edgecolor='r',alpha=0.65)) bg_pic=imread('词云背景图.jpg') wcloud=wordcloud.WordCloud(mask=bg_pic,font_path=r'C:\Windows\Fonts\simhei.ttf',background_color='white',max_words=100,margin=1).fit_words(cnt) plt.imshow(wcloud) plt.axis('off') self.Convert(Figure,pos) def Networks(self,filepath,pos): if pos==self.Image_info1: self.Image_info1.destroy() self.Image_info1=LabelFrame(self.root) self.Image_info1.place(x=550,y=320) pos=self.Image_info1 self.root.update() self.figure=plt.figure() G=nx.Graph() plt.title(filepath[:-4],fontsize='large',color='white',fontweight='heavy',bbox=dict(facecolor='y',edgecolor='r',alpha=0.65)) for k,v in relation.items(): G.add_edge(k[0],k[1],weight=v) elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight']>0.6] emidle=[(u,v) for (u,v,d) in G.edges(data=True) if (d['weight']>0.3) & (d['weight']


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3