xiaocao0 2019-06-26
想知道你可以的女朋友或者你的gay友整天在聊些什么东西吗?是学习,学习,还是学习吗?那就一起动手做一个这样的云图来看一下吧。
前提准备:
pycharm + python3.5
1、安装wordcloud和jieba
pip install wordcloud pip install jieba
wordcloud是用于生成词云图的模块,jieba是一个强大的分词库,并且完美支持中文分词。
在通过pip安装wordcloud的时候,可能会出错,这时候可以去网上下载个轮子进行本地安装。地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
2、从QQ中导出一份聊天记录
不会的可以参考百度:https://jingyan.baidu.com/article/2a138328541fcb074a134f81.html
导出格式选择txt就可以了,这样就有了用于制作云图的文本文件,同理,如果是制作其他内容的云图,这里的聊天记录文件也可以用其他的文本文件来替代。
3、在pycharm创建项目架构
其中data里面存放的ignore_words.txt填写几个需要忽略的词语,如姓名、一些助词或者一些比较隐私的东西,否则一些其他的文字会由于出现频率较高而显示在云图中。
record.txt存放的是聊天记录。
IMG.JPG是准备的一张图片,最终的云图将会按照这个图片的形状生成。
Yuan.otf是字体文件,防止出现无法识别中文的问题。
代码编写:
1、导入模块
# coding:utf-8 from scipy.misc import imread from wordcloud import WordCloud import jieba.posseg as pseg import matplotlib.pyplot as plt from scipy.misc import imread import re
2、筛选词汇
下面这个函数的作用就是读取聊天记录和忽略词汇的文件,然后遍历整个聊天记录文件,遇到空格或者正则匹配到时间戳就跳过;然后将预处理之后的所有行数据进行分词处理,只选择名词词性的词汇。
def createText(): record_file = open('./data/record.txt', 'r', encoding='utf-8') ignore_file = open('./data/ignore_words.txt','r', encoding='utf-8') # strip()去除字符前面的空格 line_list = [] for line in record_file: if line.isspace(): continue if re.match(r'(\d{4}-\d{1,2}-\d{1,2})',line[:10]) is not None: continue line_list.append(line.strip()) stop_words = set(line.strip() for line in ignore_file) word_list = [] for line in line_list: word_map = pseg.cut(line) for word, type in word_map: if word not in stop_words and type == 'n': word_list.append(word) record_file.close() ignore_file.close() return ' '.join(word_list)
3、生成云图
通过将上面生成的文件传递到下面这个函数中,就可以根据词汇出现的频率来生成云图了。
def createCloud(text): mask_img = imread('./IMG.JPG') wordCloud = WordCloud(font_path='./Yuan.otf', background_color='#fff', mask=mask_img).generate(text) plt.imshow(wordCloud) plt.axis('off') plt.show()
其中关于WordCloud的参数有很多,可以根据需要来设置:
font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf' width : int (default=400) //输出的画布宽度,默认为400像素 height : int (default=200) //输出的画布高度,默认为200像素 prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 ) mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。 scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。 min_font_size : int (default=4) //显示的最小的字体大小 font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。 max_words : number (default=200) //要显示的词的最大个数 stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS background_color : color value (default=”black”) //背景颜色,如background_color='white',背景颜色为白色。 max_font_size : int or None (default=None) //显示的最大的字体大小 mode : string (default=”RGB”) //当参数为“RGBA”并且background_color不为空时,背景为透明。 relative_scaling : float (default=.5) //词频和字体大小的关联性 color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_func regexp : string or None (optional) //使用正则表达式分隔输入的文本 collocations : bool, default=True //是否包括两个词的搭配 colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。
4、完整代码
# coding:utf-8 from scipy.misc import imread from wordcloud import WordCloud import jieba.posseg as pseg import matplotlib.pyplot as plt from scipy.misc import imread import re def createText(): record_file = open('./data/record.txt', 'r', encoding='utf-8') ignore_file = open('./data/ignore_words.txt','r', encoding='utf-8') # strip()去除字符前面的空格 line_list = [] for line in record_file: if line.isspace(): continue if re.match(r'(\d{4}-\d{1,2}-\d{1,2})',line[:10]) is not None: continue line_list.append(line.strip()) stop_words = set(line.strip() for line in ignore_file) word_list = [] for line in line_list: word_map = pseg.cut(line) for word, type in word_map: if word not in stop_words and (type == 'n' or type == 'v'): word_list.append(word) ignore_file.close() record_file.close() return ' '.join(word_list) def createCloud(text): mask_img = imread('./IMG.JPG') wordCloud = WordCloud(font_path='./Yuan.otf', background_color='#fff', mask=mask_img).generate(text) plt.imshow(wordCloud) plt.axis('off') plt.show() if __name__ == '__main__': txt = createText() createCloud(txt)
关于云图的应用有很多,用于ppt展示、写博客、可视化文字等等,可以根据自身需要来修改代码。
最后小编准备了一份Python学习资料,给那些正在学习Python的同学,或者准备学习Python的同学,关注,转发,私信小编“01”即可免费获取!