python 3.X 使用jieba.wordcloud.pandas等库分析小说后生成云图和柱状图

本篇文章,主要是使用jieba分词,对文章分析后,将常用词去掉,进行图表的展示。

在写这个demo的过程中,踩到的坑。
1:读取txt文件的时候,文件编码和读取编码不同,导致读取报错
2:读取的数据会带有\n和空格,最好在读取停止词后,先打印出来,查看下是不是每个词都没有其他的制表符存在
3:停止词要生成list集合才可使用,最好不要直接list()转化,容易出错
4:生成云图的时候,在接受过经过jieba分词后的数据,必须给每个符号分隔开分词结果,否则不能绘制词云,‘ ’.join(),可以用空格和/进行分割

# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574

import numpy as np
import pandas as pd
import jieba
import wordcloud
from scipy.misc import imread
import matplotlib.pyplot as plt
from pylab import mpl
import seaborn as sns
from PIL import Image

stopwords_path='停止词地址'
novel_path = '小说地址'


mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus']

stop_list =[]
#读取停止词,注意源文件必须更改编码为UTF-8,否则会出现读取报错
stop_list1 = open(stopwords_path, encoding="utf-8").readlines()
for line in stop_list1:
    #源文件读取后,每个停止词后悔出现换行符和空格,在这里进行处理后,放入list列表
    stop_list.append(line.strip('\n').strip())


novel = open(novel_path,encoding="utf-8").read()

#分词方法,返回去除停止词后的小说数据
def txt_cut(novel):
    return [w for w in jieba.cut(novel) if w not in stop_list and len(w)>1]

#生成柱状图函数
def Statistics(txtcut):
    #Series是指pandas的一维,获取txtcut中按照降序排列后0~20的数据
    word_count = pd.Series(txtcut).value_counts().sort_values(ascending=False)[0:20]
    #print(word_count)
    #是以这种形式展现的数据,
    # 项羽
    # 2650
    # 包子
    # 2378
    #创建一个图形是咧 大小是15*8(长*宽)单位是英寸
    plt.figure(figsize=(15, 8))
    x = word_count.index.tolist() #获取的是index列,转换成list
    y = word_count.values.tolist()#获取的是values列,转换成list
    #barplot是作图方法,传入xy值,palette="BuPu_r" 设置的是柱状图的颜色样式
    #BuPu_r 从左到右,颜色由深到浅,BuPu与之相反
    sns.barplot(x, y, palette="BuPu_r")
    plt.title('词频Top20') #标题
    plt.ylabel('count') #Y轴标题
    #如果不加这局,那么出现的就是个四方的框,这个是用来溢出轴脊柱的,加上bottom=tur,意思就是连下方的轴脊柱也溢出
    sns.despine(bottom=True)
    #图片保存
    plt.savefig('./词频统计.png', dpi=400)
    plt.show()
#生成云图函数
def cloud(result):
    result = " ".join(result)  # 必须给每个符号分隔开分词结果,否则不能绘制词云
    # 1、初始化自定义背景图片
    image = Image.open(r'I:\WordClound\timg2.jpg')
    #导入的图片会直接导致最终形成的云图效果,需要一次次生成查看和调试
    graph = np.array(image)

    # 2、产生词云图
    # 有自定义背景图:生成词云图由自定义背景图像素大小决定
    wc = wordcloud.WordCloud(font_path=r"I:\word-ttf\XingKai.ttf",#字体地址
                             background_color='white',#背景色
                             max_font_size=100,#显示字体最大值
                             #max_words=100,  # 最大词数
                             mask=graph) #导入的图片
    wc.generate(result)

    # 3、绘制文字的颜色以背景图颜色为参考
    image_color = wordcloud.ImageColorGenerator(graph)  # 从背景图片生成颜色值
    wc.recolor(color_func=image_color)
    wc.to_file(r"I:\史上第一混乱\cloud.png")  # 按照背景图大小保存绘制好的词云图,比下面程序显示更清晰

    # 4、显示图片
    plt.title("史上第一混乱词云图")  # 指定所绘图名称
    plt.imshow(wc)  # 以图片的形式显示词云
    plt.axis("off")  # 关闭图像坐标系
    plt.show()

if __name__ == '__main__':
    txtcut = txt_cut(novel)

    #生成柱状图
    #Statistics(txtcut)

    #生成云图
    cloud(txtcut)

最后奉上最终的结果图:
柱状图:
这里写图片描述
词云:
这里写图片描述
原图:这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_38044574/article/details/82258024