使用Python进行舆情分析:以李小璐出轨事件为例绘制云词图
[id_2433[id_13550032]598]

李小璐出轨云词图
Python 是一门编程语言。它的编写较为简单。它的支持库很强大。它的应用场景众多。因此,越来越多的人开始把它当作自己的编程入门语言。
Python 有一个较为重要的应用场景是进行舆情分析。例如,可以分析社交网络上群众对于某一特定话题的态度,还能分析股民的情绪,将其作为投资的参考等。近期,笔者也开展了一些与舆情分析(八卦)相关的工作,一个完整的分析流程包含以下内容:
呈现数据:从多个维度对数据进行呈现与解读,例如进行计算、制作表格以及绘制图形等。
今天,作为系列分享的一部分。笔者以李小璐出轨事件当作例子,运用从知乎热门回答中爬取的中文文本数据,来绘制云词图。
中文分词
分词就是把文本序列按照完整的意思切分成一个一个的词,这样便于进行下一步的分析,比如词频统计和情感分析等。
英文词自带空格作为分隔符,所以英文词的分词比中文要简单得多。我们做中文分词时,需要从一整段话中筛选出词语,而困难在于汉语表达博大精深,一段话通常有不同的切分方法。
幸好这并非是我们需要去忧虑的事情,在 Python 当中的 Jieba 库为我们提供了已经准备好的解决办法:
import jieba
text="李小璐给王思聪买了微博热搜"
result=jieba.cut(text)
print("切分结果: "+",".join(result))
jiaba 调用了它的分词算法,把切分好的文本依据逗号分隔符进行了分开操作,从而得到了下面的结果。
切分结果: 李小璐,给,王思聪,买,了,微博热,搜,。
可见切分结果不太好。比较明显的是,“微博”和“热搜”未被识别出来。其次,像“了”“买”以及标点符号等一些词,我们显然不想让它们出现在云词图里,因为它们本身意义不大。
特殊名词
对于某些特定的名词,为避免其切分时被分开,我们可在切分前对这些名词加以强调,例如:
text="李小璐给王思聪买了微博热搜"
#强调特殊名词
jieba.suggest_freq(('微博'), True)
jieba.suggest_freq(('热搜'), True)
result=jieba.cut(text)
print("切分结果: "+",".join(result))
切分结果: 李小璐,给,王思聪,买,了,微博,热搜,。
还可以将特殊用词加入用户自定义词典,实现相同的效果:
jieba.load_userdict("./utils/jieba_user_dict.txt")
语言清洗切分后,一些特殊符号会单独成词,这些词会对后续分析产生影响。在此,我们可利用标点符号库 stopwords.txt(点击下载),把切分出来的特殊符号去除掉。对于“了”“的”这类长度为一的词,显然对分析文本毫无帮助。处理方式是将长度为 1 的词全部剔除掉。
import jieba
#读取标点符号库
f=open("utils/stopwords.txt","r")
创建一个空字典 stopwords,通过读取文件 f 的内容并以空格分割成列表,然后使用这个列表作为键,将这些键添加到 stopwords 字典中,每个键对应的值为空。具体来说,就是先读取文件 f 的内容,再将其以空格为分隔符分割成一个列表,接着使用这个列表作为参数调用 fromkeys 方法,创建一个新的字典 stopwords,其中列表中的每个元素都是字典的键,而对应的值默认为 None。"\n"))
f.close()
#加载用户自定义词典
jieba.load_userdict("./utils/jieba_user_dict.txt")
segs=jieba.cut(text)
mytext_list=[]
#文本清洗
for seg in segs:
if seg not in stopwords and seg!=" " and len(seg)!=1:
mytext_list 会添加 seg 经过替换后的内容。" ",""))
cloud_text=",".join(mytext_list)
绘制云词图
中文分词做好之后,下一步就是绘制云词图了。在这个过程中,我们使用了另一个较为强大的库,那就是 WordCloud。
from wordcloud import WordCloud
wc = WordCloud(
background_color="white", #背景颜色
max_words=200, #显示最大词数
font_path="./font/wb.ttf", #使用字体
min_font_size=15,
max_font_size=50,
width=400 #图幅宽度
)
wc.generate(cloud_text)
wc.to_file("pic.png")
运行以上代码就可以直接出图了:
参数说明
WordCloud在生成对象时,提供了多个参数:
Parameters
| ----------
| font_path : string
| 使用的字体库
| width : int (default=400)
| 图片宽度
| height : int (default=200)
| 图片高度
mask 是一个 nd-array 或者为 None(默认值为 None)
| 图片背景参考形状
| scale : float (default=1)
| 图幅放大、缩小系数
| min_font_size 表示一个整数(默认值为 4)。
| 最小的字符
| min_font_size : int (default=4)
| 最大的字符
max_words 是一个数字,其默认值为 200。
| 最多显示的词数
stopwords 是一组字符串或者为 None 。
| 不需要显示的词
背景颜色:颜色值(默认值为“)black")
| 背景颜色
| ......
绘制指定形状的云词图
在绘制云词图时,能够借助 WordCloud 的 mask 参数,来指定词图的轮廓,进而绘制成各种形状的图片。例如我们希望使用以上这张图片,WordCloud 就会将除纯白部分识别为轮廓。具体的实现情况如下:
#加载需要使用的类库
from PIL import Image
import numpy as np
from wordcloud importWordCloud 以及 ImageColorGenerator
from matplotlib import pyplot as plt
#加载背景图片
cloud_mask 等于通过打开指定路径的图像而得到的数组。"./bc_img/heart.jpeg"))
#忽略显示的词
st=set(["东西","这是"])
#生成wordcloud对象
wc 等于 WordCloud,其背景颜色为"white",
mask=cloud_mask,
max_words=200,
font_path="./font/wb.ttf",
min_font_size=15,
max_font_size=50,
width=400,
stopwords=st)
wc.generate(cloud_text)
wc.to_file("pic.png")
调用以上代码就得到了一张心形状的云词图:
使用PS稍加处理,就得到了下面这张图~
李小璐出轨云词图
关注“果果数据”这个公众号,你能够获取全部的代码,并且还可以看到更多的教程呢。