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

[id_2433[id_13550032]598]

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

李小璐出轨云词图

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稍加处理,就得到了下面这张图~

李小璐出轨云词图

关注“果果数据”这个公众号,你能够获取全部的代码,并且还可以看到更多的教程呢。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

32阅读

外国教程python,python编程教学视频

2026年09月02日

27阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

27阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

23阅读