Python 基于jieba的三国演义词频分析与可视化
总览
前言
本项目主要利用python的jieba库对三国演义进行词频分析,并通过WordCloud、networkx,matplotlib等库进行可视化分析.
功能函数与展示
获取本地txt文件内容
def getText(filepath):f = open(filepath, 'r', encoding = 'utf-8')text = f.read()f.close()retu text #返回文本内容
将停用词文件的词读入到列表stopwords中
def stopwordslist(filepath):stopwords = [line.strip() for line in open(filepath, 'r', encoding = 'utf-8').readlines()]retu stopwords
分词并统计词频
def wordFreq(filepath, text, topn):#使用lcut()方法对文本分词words = jieba.lcut(text.strip())#出现频率存放在字典countcount = {}stopwords = stopwordslist(r'C:\Users\Hasee\Desktop/my_stop_words.txt')#词频排序items = list(count.items())items.sort(key = lambda x:x[1], reverse = True)
分词结果
filepath = r'C:\Users\Hasee\Desktop/三国演义.txt'wordFreq(filepath, getText(filepath), 200)
可以看出,曹操是妥妥的主角(狗头)
词云
f1 = open(r'C:\Users\Hasee\Desktop/三国演义_词频统计.txt')text = f1.read()wcloud = wordcloud.WordCloud(background_color = 'white', width = 1000, max_words =500, height = 400, margin =2, font_path = r'C:\Windows\Fonts/SIMHEI.TTF').generate(text)
更换词云形状
#制作词云,更换形状f1 = open(r'C:\Users\Hasee\Desktop/三国演义_词频统计.txt')text = f1.read()bg_pic = imread(r'C:\Users\Hasee\Desktop/star.png')wcloud = wordcloud.WordCloud(mask = bg_pic, background_color = 'white', width = 800, max_words =800, height = 400, margin =2, font_path = r'C:\Windows\Fonts/SIMHEI.TTF').generate(text)
章回统计
#章回处理f= open(r'C:\Users\Hasee\Desktop/三国演义.txt', 'r', encoding='utf-8')s = f.read()#获取章节标题lst_chapter = []chapter = re.findall("第[\u4E00-\u9FA5]+回", s)#遍历chapter ,存储到lst_chapterfor x in chapter:if x not in lst_chapter:lst_chapter.append(x)
统计每一回中玄德出现的次数
cnt_xuande1 = []cnt_xuande2 = []for ii in range(120):start = lst_chapterindex[ii][0]end = lst_chapterindex[ii][1]cnt_xuande1.append(s[start:end].count('玄德'))cnt_xuande2.append(s[start:end].count('刘备'))#绘图plt.figure(figsize = (20,10))plt.plot(list(range(len(cnt_xuande1))), np.array(cnt_xuande1)+np.array(cnt_xuande2),'r')plt.xticks(list(range(len(cnt_xuande1))), rotation=-90)plt.xlabel('章节数')plt.ylabel('出现次数')plt.title('刘备出现次数')
看来托孤白帝城之后就少被后人提及了,果然滚滚长江东逝水
统计“曹贼”“大耳贼”“美髯公”“汉贼”
for ii in range(120):start = lst_chapterindex[ii][0]end = lst_chapterindex[ii][1]cnt_cz.append(s[start:end].count('曹贼'))cnt_dez.append(s[start:end].count('大耳贼'))cnt_sb.append(s[start:end].count('美髯公'))cnt_hz.append(s[start:end].count('汉贼'))
曹贼和汉贼还是多的
三国兴衰
for ii in range(120):start = lst_chapterindex[ii][0]end = lst_chapterindex[ii][1]cnt_cz.append(s[start:end].count('蜀'))cnt_dez.append(s[start:end].count('魏'))cnt_sb.append(s[start:end].count('东吴'))cnt_hz.append(s[start:end].count('汉'))
曹老板的基业还是强大
平均段落数与字数
社交网络
在这里统计前30个出现次数最多的人物
relations = {}lst_para = s.split('\n') #按段落划分,假设出现在统一段落中人物具有共现关系for text in lst_para:for name1 in Names:# for name1 in text:for name2 in Names:if name1 in text and name2 in text and name1 !=name2 and (name2,name1) not in relations:relations[(name1, name2)] = relations.get((name1,name2), 0) +1
换一种布局
pos = nx.circular_layout(G)#设置结点样式nx.draw_networkx_nodes(G, pos, alpha = 0.8, node_size=800)nx.draw_networkx_edges(G, pos, edgelist = elarge, width=2.5, alpha = 0.9, edge_color = 'g')nx.draw_networkx_edges(G, pos, edgelist = emidle, width=1.5, alpha = 0.6, edge_color = 'y')nx.draw_networkx_edges(G, pos, edgelist = esmall, width=1, alpha = 0.4, edge_color = 'b', style ='dashed')
代码获取
赞赏100,备注jieba三国,评论留下个人邮箱,收到即回复
作者:不会长胖的斜杠
来源链接:https://blog.csdn.net/Dummy_/article/details/125671987
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。