前言
之前练习Scrapy爬取网页文本,爬完后发现有2W多个TXT文档,如果一个个去看内容的话肯定不现实,这时突然想起了快速了解文本信息的‘词云’,因此萌生了用这2W多TXT文档制作一个词云图片快速了解核心内容的想法,顺便熟悉一下Python词云制作的方法。
WorlCloud
百度一下Python词云制作,发现了WorlClound这个鼎鼎有名的库,它通过三个步骤即可生成词云:
生成实例对象,可以添加参数改变最终输出的图片样式
import wordclound wc=wordclound.WordCloud( width=1000, height=1000, font_path="msyh.ttc", background_color='white', )
支持的参数具体功能如下表:
参数 描述 width 指定词云对象生成图片的宽度,默认400像素 w=wordcloud.WordCloud(width=600)
height 指定词云对象生成图片的高度,默认200像素 w=wordcloud.WordCloud(height=400)
min_font_size 指定词云中字体的最小字号,默认4号 w=wordcloud.WordCloud(min_font_size=10)
max_font_size 指定词云中字体的最大字号,根据高度自动调节 w=wordcloud.WordCloud(max_font_size=20)
font_step 指定词云中字体字号的步进间隔,默认为1 w=wordcloud.WordCloud(font_step=2)
font_path 指定文体文件的路径,默认None w=wordcloud.WordCloud(font_path="msyh.ttc")
max_words 指定词云显示的最大单词数量,默认200 w=wordcloud.WordCloud(max_words=20)
stop_words 指定词云的排除词列表,即不显示的单词列表 w=wordcloud.WordCloud(stop_words="Python")
mask 指定词云形状,默认为长方形,需要引用imread()函数 from scipy.msc import imread
mk=imread("pic.png")
w=wordcloud.WordCloud(mask=mk)
background_color 指定词云图片的背景颜色,默认为黑色 w=wordcloud.WordCloud(background_color="white")
解析文本,generate()函数会按照空格将文本识别成不同的词语
import wordclound wc=wordclound.WordCloud( width=1000, height=1000, font_path="msyh.ttc",w background_color='white', ) wc.generate('you are a superman!')
然而在中文句子中,并不是每一个词语都有空格隔开,所以generate()函数对中文的支持并不好,这时我们需要用到另外一个辅助帮忙把中文词用空格隔开的库jieba:
import wordclound import jieba #使用jieba.lcut(text)将文本中词语切割开形成一个列表 jb = jieba.lcut('你是一个超人!') #使用空格将列表内容连起来 t = " ".join(jb) #再把有空格分隔词语的文本给generate()函数处理 wc.generate(t)
输出词云
import wordclound
import jieba
#使用jieba.lcut(text)将文本中词语切割开形成一个列表
jb = jieba.lcut('你是一个超人!')
#使用空格将列表内容连起来
t = " ".join(jb)
#再把有空格分隔词语的文本给generate()函数处理
wc.generate(t)
#输出词云到指定图片
wc.to_file('lzy.png')
处理大量文本文件生成词云
上面实现了词云制作的过程,接下来按需求拼接2W多个文本(友情提示:我2W多个文件大小总共只有200M左右,消耗内存大概2G,如果文件太大需谨慎,避免内存爆掉……),然后传递给jieba分词,再给wordclound生成词云。
先写遍历文件拼接并返回文本内容的函数:
#遍历文件夹获取文件名的函数
def get_filename(s_path):
#遍历文件夹,获取文件夹下所有文件名和文件夹
list=os.listdir(s_path)
#初始化一个空列表
text_list=[]
for data in list:
#拼接目录和目录下的对象,形成全路径
data_fullname=os.path.join(s_path,data)
#isfile判断是否为文件
if os.path.isfile(data_fullname):
#将文件中每一行读出
with open(data_fullname, "r",encoding='UTF-8') as f:
lines=f.readlines()
#循环每一行加入到初始化的列表中
for line in lines:
text_list.append(line)
#将每一行连起来形成一个完整的文本
a=''.join(text_list)
return a
然后在jieba分词的文本改成调用函数即可:
jb = jieba.lcut('get_filename(s_path)')
知晓方法后,调整以下代码,将各部分整合成函数,jieba分词放到读取文件一起,完整代码如下:
import wordcloud
import jieba
import os
#遍历文件夹获取文件名的函数
def get_filename(s_path):
#遍历文件夹,获取文件夹下所有文件名和文件夹
list=os.listdir(s_path)
#初始化一个空列表
text_list=[]
for data in list:
#拼接目录和目录下的对象,形成全路径
data_fullname=os.path.join(s_path,data)
#isfile判断是否为文件
if os.path.isfile(data_fullname):
with open(data_fullname, "r",encoding='UTF-8') as f:
lines=f.read()
#直接将文本用jieba分词
jb = jieba.lcut(lines)
#循环每个词加入到初始化的列表中
for line in jb:
text_list.append(line)
#将每个词用空格连起来形成一个完整的文本
a=' '.join(text_list)
return a
def to_wordclound(s_path):
c=wordcloud.WordCloud(
width=1000,
height=1000,
font_path="msyh.ttc",
background_color='white',
#max_font_size=100,
min_font_size=50
)
c.generate(get_filename(s_path))
c.to_file('lzy.png')
if __name__ == "__main__":
s_path = r'C:\06Python\Scrapy\get_ais\get_ais\filedata\xs'
to_wordclound(s_path)
结果如图:
词云还可以定制背景图和颜色等,后续再研究。