python 可以用excel做词云图嘛_python绘制中文词云图

1. 明确任务

最近学习过程中看到很多分析报告中都有运用到可视化的词云,也有看到五花八门的工具教程,刚好有一份《都挺好》电视剧的弹幕源数据。便决定用这份数据尝试使用python绘制词云。

任务内容1. 在python中读取excel文件(《都挺好》弹幕源数据.xlsx)提取出弹幕内容

2. 对弹幕内容文本进行结巴分词,设置并过滤掉停用词

3. 使用wordcloud 将分词得到的词汇统计绘制词云图

涉及难点1. 读写excel文件

2. jieba 中文分词

3. wordcloud 词云展示库

2. 具体操作

2.1 安装相应的第三方库

本次练习需要使用到的库包括读取excel文件的openpyxl(xlwt、xlrd、pandas),进行分词的jieba,以及进行词云图绘制的numpy、matplotlib、wordcloud。

因为不确定在此前安装过哪些库,因此先使用pip list查看已经安装好的库文件。查询之后发现只有wordcloud和openpyxl没有安装,分别使用pip install openpyxl和pip install wordcloud 即可安装。

2.2 读写文件

读写文件在之前了解过 with open 的方法,用于读写txt,csv文件。但是若要读写excel文件则需要使用特定的库。例如 openpyxl、xlwt/wlrd 以及pandas这几种第三方库来读写。本次使用的是openpyxl来进行的文件读写。

相关部分代码:import openpyxl #此处使用的是openpyxl读取文件,此外还有 xlrd,pandas 读取文件的方式(有待补充)

filename=r'F:\数据分析练手\都挺好-弹幕源数据.xlsx' #打开excel文件

workbook=openpyxl.load_workbook(filename) #读取excel文件

sheet = workbook.active

rows = sheet.max_row #当前表格最大的行数

columns = sheet.max_column #当前表格最大的列数

selectrow = sheet['1'] #读取表格第一行的内容

selectcol = sheet['E'] #读取表格指定'E'列(即弹幕内容列)的内容

2.3 使用结巴分词模块对内容分词结巴分词支持三种分词模式:全模式,精确模式和搜索引擎模式,普遍使用的是精准模式,此次亦是使用的精准模式。其分词结果是一个可迭代的 generator,可使用for循环得到分词后的每一个词汇。这里定义一个函数来进行结巴分词。

相关部分代码: import jieba #引入jieba

stopwords={}.fromkeys(['的','得','地','吗','哈哈哈哈','啦','呢','吧','了','啊','这','是','我',':','?','!',' ','。','','\xa0', '']) #定义停用词字典

selectcol=sheet['E']

def jieba_fc(column): #定义一个分词函数进行结巴分词

words=[] #创建一个空列表存放分词结果

for col in column:

word = str(col.value) #因为弹幕中有数字,为避免识别问题,将所有的内容格式都转换为字符串

words_fc = jieba.cut (word,cut_all=False) #使用jieba精准模式进行分词

for j in words_fc: #对分词结果进行停用词筛选

if j not in stopwords: #如果不在停用词字典中

words.append(j) #将它存放到words列表中

return ' '.join(words) #将结果返回成一个以空格为间隔的字符串

text=jieba_fc(selectcol) #调用此函数,并将结果字符串存入text中

2.4 用wordcloud绘制词云

相关部分代码:from wordcloud import WordCloud #词云展示模块

from wordcloud import ImageColorGenerator #

import PIL.Image as image #图像处理模块

import matplotlib.pyplot as plt #图像展示模块

import matplotlib.font_manager as fm #中文处理模块

import numpy as np

mask=np.array(image.open('148.jpg')) #图片背景参考形状

wc=WordCloud(

background_color="white", #背景颜色

max_words=150, #最多显示的词数

mask=mask, #设置图片的背景

max_font_size=60, #最大的字符

random_state=42, #

font_path='C:/Windows/Fonts/simkai.ttf' #中文处理,用系统自带的字体

).generate(text) #generate 只能处理str文本不能处理list文本

#对词云图各项参数进行调整,使词云图更美观

my_font=fm.FontProperties(fname='C:/Windows/Fonts/simkai.ttf') #词云字体设置

image_colors=ImageColorGenerator(mask) #基于彩色图像的颜色生成器 提取背景图片颜色

wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图的颜色

plt.axis("off") #为云图去掉坐标轴

plt.show() #画云图,显示

plt.imshow(wc,interpolation="bilinear") #开始画图

wc.to_file("dth.png") #输出一个png文件保存云图

2.5效果图参数调整之前的词云图

python 可以用excel做词云图嘛_python绘制中文词云图_第1张图片

初始词云图背景图片

python 可以用excel做词云图嘛_python绘制中文词云图_第2张图片

背景图设置了背景图,字体颜色等参数的词云图

python 可以用excel做词云图嘛_python绘制中文词云图_第3张图片

都挺好弹幕词云图

3. 遇到的问题在进行结巴分词的时候,运行代码导致格式错误

“AttributeError: ‘int’ object has no attribute ‘decode’”

经过检查发现是因为弹幕中有包含’666’等数字的内容,在结巴分词之后被计算机定义为’int’类型,导致在进行后续的计算时无法被识别而报错。初次尝试wordcloud词云绘制时,在wc=WordCloud(…).generate(str(words)) 代码中,因generate 只能处理str文本不能处理list文本,将words列表直接使用str转换成字符串,导致词云图出现以下情况:

python 可以用excel做词云图嘛_python绘制中文词云图_第4张图片

出现问题的词云图.jpg

在使用wordcloud时,其内置分词程序会对传入的字符串进行再次分词,而直接使用str的方式转换的字符串中词与词之间包含了大量的” ‘ ‘ “,使得wordcloud再次分词时产生混乱。因此列表转字符串时可以使用 ‘空格’.join(列表)的方式去转换,减少词汇之间的符号,使wordcloud能够正确分词。

4. 优化改进

读取文件方面本次使用的是openpyxl库进行文件读取,此外还有xlrd模块和pandas库均可进行excel文件的读取。可以对几种方式进行尝试比较,比较三者之间的优劣差异。

结巴分词方面结巴分词可以进行自定义词典,本次分词之后可以看出有一些有特定含义的词汇并没有被jieba识别,因此可以进一步添加新词使其达到更高的正确率。此外,结巴分词还可以进行词频,词性分析标注,可以去深入学习使用。

词云绘制方面本次词云绘制只是简单的使用了wordcloud进行绘制,该模块还有很多其他的参数设置未进行尝试,比如统计词频进行词云绘制,根据词频高低调节字体大小,在wordcloud中设置屏蔽词汇,给现有词云重新上色等等。

https://www.jianshu.com/p/027c493ab779

你可能感兴趣的:(python,可以用excel做词云图嘛)