【Python】微博热评情感分析
想要光明正⼤⼜不⽤冒着被封号的危险拿到微博数据么?想要获悉热门微博下⽹友评论的情感倾向么?想要知道⼤家都在使⽤什么表情么?如果你想,恭喜你,你可以在这个教程⾥到你想要的⼀切元素。
你将会通过微博开放平台获取微博数据,并通过 Python 中的情感分析库对热门微博评论进⾏情感分析进⽽进⾏可视化展⽰,同时你也能统计⽹友常⽤表情并进⾏词云化的展⽰。快来学习吧!
什么是 API,以及为什么要使⽤它
如果你体验过我们的爬⾍教程,你⼀定知道,如果程序要从⽹页上获取数据(⽐如微博的评论列表),可以把页⾯下载下来,再使⽤选择器和正则表达式⼀条⼀条提取数据。
但很多⼤型⽹站提供了另外⼀种更便捷的⽅式,如果你想要获得评论列表,那就使⽤程序,直接调⽤⽹站提供的get_weibo_comments 函数,函数就会以固定的格式,把所有评论信息返回给你。
⽹站提供的 get_weibo_comments 这⼀类函数,就叫做 API。为了⽅便使⽤,通常会将这些函数打包库的形式提供给开发者直接使⽤。
注册微博开放平台
为了使⽤新浪微博提供的 API,我们要先注册成为微博开发者:
登录微博开放平台并注册⼀个帐号。
在页⾯顶部「我的应⽤」中完成开发者认证。
在页⾯顶部「微连接->其它」中创建⼀个 应⽤。
前往「我的应⽤->应⽤信息->基本信息」页⾯,到 App Key 和 App Secret。App Key 和 App Secret 可以⽐作开发者的帐号和密码,不要将它发布到任何公开平台中。
OAuth 2 是⼀种平台向第三⽅应⽤提供服务时的授权⽅式。
和我们使⽤⽹站功能需要先登录⼀样,程序调⽤⽹站 API 前也需要先登录。
获取微博访问权限
在终端中输⼊ pip install weibopy 安装 weibopy 库,weibopy 能够帮助我们⽅便的调⽤⽹站提供的 API。
利⽤获取到的 App Key 和 App Secret,获取访问 API 的 access_token。
from weibopy import WeiboOauth2, WeiboClient
import webbrowser
client_key = 'xxxxxxxxx' # 你的 app key
client_secret = 'xxxxxxxx' # 你的 app secret
redirect_url = 'api.weibo/oauth2/default.html'
auth = WeiboOauth2(client_key, client_secret, redirect_url)
# 获取认证 code
webbrowser.open_new(auth.authorize_url)
# 在打开的浏览器中完成操作
# 最终会跳转到⼀个显⽰「微博 OAuth2.0」字样的页⾯
# 从这个页⾯的 URL 中复制 code= 后的字符串
# URL 类似这样 api.weibo/oauth2/default.html?code=9c88ff5051d273522700a6b0261f21e6
code = input('输⼊ code:')
# 使⽤ code 获取 token
token = auth.auth_access(code)
print(token)
Access Token 是为了避免多次调⽤ API 时需要重复输⼊⽤户名和密码的⼀种设计。
微博关闭评论程序登录后获得 Access Token,使⽤ Access Token 就能在⼀定时间内免密码使⽤平台的功能。
调⽤ API 接⼝获取数据
微博 API ⽂档 中描述了所有新浪微博提供的数据接⼝。
下⾯是获取某条微博下的评论的过程:
⾸先在 API ⽂档页⾯到「获取某条微博的评论列表」这个 API,名称为 comments/show。
接下来就可以使⽤这样的⽅式调⽤ API:
# token 是刚刚获得的 token,可以⼀直使⽤
client = WeiboClient(token['access_token'])
# suffix 指定 API 的名称,parmas 是参数,在⽂档中有详细描述
result = (suffix='comments/show.json', params={'id': 4318237070487349, 'count': 200, 'page': 1})
print(result)
必须的参数只有 id,即需要查询的微博 id。
如果没有发⽣意外,上⾯的代码将获取到 id 为 4318237070487349 的微博的前 200 条评论内容,并且已经存储为字典形式。
整理所需数据
阅读 API ⽂档中可以发现,comments/show 除了返回评论本⾝外,还返回了许多额外的数据。有了这
些数据,你能够创造更多玩法。评论信息:
创建时间、内容、来源
评论者信息:
⽤户昵称、性别、注册时间
⽤户的省市信息
⽤户个⼈描述、博客地址、头像、域名
⽤户的粉丝数、关注数、微博数、收藏数
下⾯我们将结合 评论的内容的情感倾向 和 评论者的地理位置 这两个维度数据,进⾏整理和可视化展⽰。
评论内容预处理
⾸先,评论包含⼀些对情感分析⽆⽤的⼲扰内容,⽐如:
回复@某某某:
利⽤正则表达式去除上述的⼲扰内容:
# 替换为空字符串
text = re.sub('回复.*?:', '', str(comment['text']))
接下来,按地域划分评论内容。
使⽤ collections 中的 defaultdict 模块⽣成字典列表。将各省份的评论列表存⼊字典中。(字典的键为省份的 id,值为各省评论的列表)
from collections import defaultdict
import time
province_list = defaultdict(list) # 保存按省划分的评论正⽂
comment_text_list = [] # 保存所有评论正⽂
# 获取「⾃杀式单⾝」评论列表
# 共获取 10 页 * 每页最多 200 条评论
for i in range(1, 11):
result = (suffix='comments/show.json', params={'id': 4322140368509204, 'count': 200, 'page': i})
comments = result['comments']
if not len(comments):
break
for comment in comments:
text = re.sub('回复.*?:', '', str(comment['text']))
province = comment['user']['province']
province_list[province].append(text)
comment_text_list.append(text)
print('已抓取评论 {} 条'.format(len(comment_text_list)))
time.sleep(1)
⽂本情感分析
在控制台安装 snownlp:pip install snownlp
使⽤ snownlp 库可以对⽂本进⾏情感分析,它会对每个⽂本⽣成⼀个 0-1 的得分,数值越⼤,是积极情绪的概率越⾼。
情感分析的原理其实很简单:提取⼀句话中的⼀些关键词,判断每个关键词对应情感为积极的概率,最后取最⼤值。
对各省的评论进⾏情感分析,并统计积极情绪所占的⽐例,以便绘制地图。
由于我们获取的为省份 id 。需要将其转换为对应名称以便绘图。需访问 相应 API 获取 id 和 名称的映射:
# 获取省份列表
provinces = {}
results = (suffix='common/get_province.json', params={'country': '001'})
for prov in results:
for code, name in prov.items():
provinces[code] = name
print(provinces)
接下来就可以开始做情感分析了:
# 评论情感分析
positives = {}
for province_code, comments in province_list.items():
sentiment_list = []
for text in comments:
s = SnowNLP(text)
sentiment_list.append(s.sentiments)
# 统计平均情感
positive_number = sum(sentiment_list)
positive = positive_number / len(sentiment_list) * 100
# 按省保存数据, 0010 为国家前缀
province_code = '0010' + str(province_code)
if province_code in provinces:
provice_name = provinces[province_code]
positives[provice_name] = int(positive)
绘制情感分布图
在控制台安装 pyecharts 以及中国地图组件:
pip install pyecharts
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
# 可选
pip install pyecharts-snapshot
绘制地图也⾮常简单:
# 绘制情感分布图
keys = list(positives.keys())
values = list(positives.values())
map = Map("⾃杀式单⾝情感分析地域图", width=1200, height=600)
map.add("积极情感", keys, values, visual_range=[0, 100], maptype='china', is_visualmap=True, is_label_show=True, visual_text_color='#000') der(path="单⾝热评分布.html")
表情统计
观察表情格式,进⾏正则匹配。同时使⽤ collections 中的 Counter 进⾏统计。代码如下:
from collection import Counter
# 获取评论中出现的表情
emoji_list = []
for comment in comment_text_list:
emojis = re.findall(repile(u'(\[.*?\])', re.S), comment)
if emojis:
for emoji in emojis:
emoji_list.append(emoji)
emoji_dict = Counter(emoji_list)
print(emoji_dict)
期待你的反馈
将你遇到的问题、建议和评价发送给我们,帮助我们做得更好。