Python学习日记20180413
Python环境:
系统:Windows 10 专业版 64位
Python版本:Python 3.6.4
使用Visual Studio Code 1.22.1 进行调试
在网易云课堂(http://study.163.com/)中看到一个《机器学习工程师》微专业体验课。由于是免费的,就报名学习一下,其中有一个制作词云的实例看起来挺有意思,于是就学习了一下。
大致过程如下:
以下步骤和大部分代码来自《机器学习工程师》微专业体验课
前期准备:
实现词云功能之前,我们需要一个 python 的编写和运行环境,同时安装好相关的依赖包。 对于python环境,我们推荐使用 ipython notebook。 在本地电脑环境,anaconda 提供了非常便利的安装和部署,他会自动帮你把 ipython notebook 环境部署好。
词云功能所需的依赖包如下: jieba(分词包)、numpy(计算包)、codecs(语言代码处理包)、pandas(数据分析包)、matplotlib(绘图功能包)、WordCloud(词云包)
第一步:
首先,需要引入词云功能的所有依赖包,具体代码如下:
- #coding:utf-8
- __author__ = 'Hanxiaoyang'
- import jieba #分词包
- import numpy #numpy计算包
- import codecs #codecs提供的open方法来指定打开的文件的语言编码,它会在读取的时候自动转换为内部unicode
- import pandas
- import matplotlib.pyplot as plt
- from wordcloud import WordCloud#词云包
在这一步骤中,发现如果没有安装过词云包(wordcloud)而直接使用pip install wordcloud安装是会报错的。这一点在热锅上的刺猬《Windows环境下Python中wordcloud的使用——自己踩过的坑 2017.08.08》(https://blog.****.net/heyuexianzi/article/details/76851377)中提到了解决方案:
感谢热锅上的刺猬!帮我问问蚂蚁怎么样了
第二步:
然后读取你和你的另一半一切充满甜言蜜语的聊天记录。
本次演示,寒老师选取的是《大话西游月光宝盒》中至尊宝和女神紫霞仙子的对话文本(提前准备好文件:大话西游.txt),对文本进行分词处理,形成分词后的词集。
具体代码:
- file=codecs.open(u"大话西游.txt",'r')
- content=file.read()
- file.close()
- segment=[]
- segs=jieba.cut(content)
- for seg in segs:
- if len(seg)>1 and seg!='\r\n':
- segment.append(seg)
第三步:
想要生成一个较为理想的词云,分词的内容质量很重要,那么必须要做的一步就是要去除文本中的“噪音”,通常的实现方法是:先定义一个停用词集,然后利用停用词集对上面的文本分词全集进行过滤,最后形成一个有效词集。
这里要给大家一句非常重要的温馨提醒,我们希望每一位同学在处理相关数据时都能秉持公正客观真实的原则。
但如果你最终导出的结果与你预期的“甜蜜”记录并不符合,比如出现了“多喝热水”等尴尬的词语,那么在去停用词中,适当地抹去这样的小细节来避免明年一个人过节,也是可以理解的。
具体代码:
- words_df=pandas.DataFrame({'segment':segment})
- words_df.head()
- stopwords=pandas.read_csv("stopwords.txt",index_col=False,quoting=3,sep="\t",names=['stopword'],encoding="utf8")
- words_df=words_df[~words_df.segment.isin(stopwords.stopword)]
此部分需存在一个名为 stopwords.txt 的文件,否则会报错
第四步:
下面进入到词云的关键一步了:词频统计。我们需要统计有效词集中每个词的出现次数,然后按照次数从多到少进行排序。
其中统计使用 groupby 函数,排序使用 sort 函数。
代码如下:
- words_stat=words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
- words_stat=words_stat.reset_index().sort(columns="计数",ascending=False)
- words_stat
本人在进行到此步骤时,会报错:AttributeError: 'DataFrame' object has no attribute 'sort'
解决方法:
将 sort(columns="计数",ascending=False) 改为 sort_values(by="计数",ascending=False)
第五步:
最后是词云的点睛之笔了:数据图形化显示。有了强有力的工具包,这些工作都是分分钟就可以搞定。我们使用matplotlib和wordcloud工具来图形化显示上述的词频统计结果。
话不多说,上代码:
- wordcloud=WordCloud(font_path="simhei.ttf",background_color="black")
- wordcloud=wordcloud.fit_words(words_stat.head(1000).itertuples(index=False))
- plt.imshow(wordcloud)
- plt.show()
本人在执行到此处时会报错AttributeError: 'map' object has no attribute 'items'
未找到解决办法
第六步:
情人节,又是大话西游这样的经典对白,我们当然还可以把图形呈现玩得再酷炫一些,自定义一个心形图像背景并将词云图形化输出。
实现代码如下:
- from scipy.misc import imread
- import matplotlib.pyplot as plt
- from wordcloud import WordCloud,ImageColorGenerator
- bimg=imread('heart.jpeg')
- wordcloud=WordCloud(background_color="white",mask=bimg,font_path='simhei.ttf')
- wordcloud=wordcloud.fit_words(words_stat.head(4000).itertuples(index=False))
- bimgColors=ImageColorGenerator(bimg)
- plt.axis("off")
- plt.imshow(wordcloud.recolor(color_func=bimgColors))
- plt.show()