1 准备工作
1.1 导入必要的库
import jieba
import numpy as np
from PIL import Image
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import re
import collections
缺什么 pip install 什么,比如 jieba
和 wordcloud
1.2 jieba 的介绍
jieba
是一个非常好用的中文工具,是以分词起家的,但是功能比分词要强大很多。
jieba.cut
返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)。
jieba.cut
方法接受三个输入参数:
- 需要分词的字符串
- cut_all 参数用来控制是否采用全模式,一般情况下,cut_all为False
- HMM 参数用来控制是否使用 HMM 模型
list0 = jieba.cut('我原来是一名建筑工人,后来喜欢上了 Python 语言', cut_all=True)
print(list0)
print(type(list0))
print("全模式:",list(list0))
list1 = jieba.cut('我原来是一名建筑工人,后来喜欢上了 Python 语言', cut_all=False)
print("精准模式:",list(list1))
output
<generator object Tokenizer.cut at 0x000002083CE81F10>
<class 'generator'>
全模式: ['我', '原来', '是', '一名', '建筑', '建筑工人', '工人', '', '', '后来', '喜欢', '上', '了', '', 'Python', '', '语言']
精准模式: ['我', '原来', '是', '一名', '建筑工人', ',', '后来', '喜欢', '上', '了', ' ', 'Python', ' ', '语言']
可以看到全模式有点咬文嚼字,婆婆妈妈,把 建筑工人
解读为建筑
、建筑工人
、工人
,哈哈哈!
1.3 材料的准备
1)文本准备
准备好一份自己需要分析的文本材料,我这里节选的是卡夫卡的变形记!
然后复制保存在 2.txt
中
2)图片的准备
选择的是《火影忍者》日漫中人气较高的角色,宇智波鼬!哈哈,小时候喜欢“好人阵营”,长大了慢慢会欣赏所谓的 “反派”!
2 词频统计
获得到文本时,需要对文本进行文本预处理、文本分词以及词频统计!
参考 python读取中文txt文本的方法
#coding:utf-8
data_txt = open(r"C:\Users\13663\Desktop\2.txt",encoding='gbk').read()
#文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
data_txt = re.sub(pattern, '', data_txt)
#文本分词
cut_txt = jieba.cut(data_txt)
object_list=[]
remove_words = [u"的",u'对',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',u',',u'“',u'”',u'一个',u'是']
#词频统计
for word in cut_txt:
if word not in remove_words:
object_list.append(word)
word_counts = collections.Counter(object_list)
这里 remove_words
我没有修改参考文章中的,就是排除一些高频的无关的词,比如 的
3 Word Cloud
wordcloud 把词云当作一个对象,它可以将文本中词语出现的频率作为一个参数绘制词云,而词云的大小、颜色、形状等都是可以设定的。
WordCloud方法的参数如下:
- width:指定词云对象生成的图片的宽度(默认为200px)
- height:指定词云对象生成的图片的高度(默认为400px)
- min_font_size:指定词云中字体最小字号,默认为4
- max_font_size:指定词云中字体最大字号
- font_step:指定词云中字体之间的间隔,默认为1
- font_path:指定字体文件路径
- max_words:指定词云中能显示的最多单词数,默认为200
- stop_words:指定在词云中不显示的单词列表
- background_color:指定词云图片的背景颜色,默认为黑色
- mask:定义词频背景
说明一下:如果设置了mask参数,那么width、height参数将无效
word_cloud 生成词云有两个方法。from text 和 from frequencies 。即文本生成和频率生成,每一个都有对应的函数可以使用,如下:
- wd.generate(txt) 向WordCloud 对象w中加载文本txt
- wd.generate_from_frequencies(word_counts) 向WordCloud 对象wd中加载词语频率
#定义词频背景
background_image = np.array(Image.open(r'C:\Users\13663\Desktop\1.png'))
font_path=r"C:\Users\13663\Desktop\simkai.ttf"#这里我用的是华文行楷,去控制面板字体里面找你想要的字体即可
wd = WordCloud(
font_path=font_path, #设置字体格式,不然会乱码
background_color="white", #设置背景颜色
mask=background_image #设置背景图
).generate_from_frequencies(word_counts)
#保存词云图
wd.to_file(r'C:\Users\13663\Desktop\2.png')
#显示词云图
plt.imshow(wd,interpolation="bilinear")
plt.axis("off")
plt.show()
哈哈,当然,你也可以把一些你觉得无关紧要的词去掉,统计更为有意义的信息!从这个图中,我们至少可以看出,文章以第三人称描述的,哈哈哈哈哈哈!
当然英文也完全OK!