我们当然可以获取爬取到的所有评论,但还是那某一微博下面的评论举个例子。
前面说过获取评论的时候要用bid
来识别是哪篇微博下的。
import pymongo
myclient = pymongo.MongoClient("mongodb://XXX:[email protected]:27017/")
mydb = myclient["weibo_DB"]
mycol = mydb["weibo_comments"]
def get_comment_list(bid):
result_list = []
result = mycol.find({'bid':bid,'content':{'$ne':''}},{'_id':0})
for x in result:
result_list.append(x)
return result_list
comment_list = get_comment_list('GgdfidjFm')
# print(comment_list)
对于评论数据,我们就来直接分析一下它们的情感积极性。其中会遇到中文和符号无法显示的问题,在下面进行了解决。
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
# 解决中文无法显示的问题
plt.rc('font', family='SimHei', size='12')
# 解决负号无法显示的问题
matplotlib.rcParams['axes.unicode_minus'] =False
def comment_analyze(comment_list):
df = pd.DataFrame(comment_list)
df['comments_score']=df['content'].apply(get_sentiment_score) # 添加一列得分,用content字段执行get_sentiment_score函数获得
plt.hist(df['comments_score'], bins = 20, facecolor = 'g')
plt.xlabel(u'正负性')
plt.ylabel(u'评论数')
plt.title(u'评论情感倾向分析')
plt.show()
comment_analyze(comment_list)
这里引入了一个名为get_sentiment_score
的打分函数,具体是通过snownlp
自带的sentiments
实现的。
from snownlp import SnowNLP
# 定义情感得分评分函数
def get_sentiment_score(text):
temp_score = SnowNLP(text)
# 保留5位小数,采用四舍五入,还把原来从0到1的取值范围变成了从-0.5到0.5
return float(format(temp_score.sentiments-0.5, '.5f'))
print(get_sentiment_score("棒极了"))
# 0.4505
但是自带的这个不太准,需要用好的数据训练一下,或者改用百度情感倾向分析的API,原理是一样的,就凑活一下当成例子。
我发现百度的好用多了,在这里封装成get_baidu_score
,替换get_sentiment_score
就可以了。
from aip import AipNlp
import time
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipNlp(APP_ID, API_KEY, SECRET_KEY)
def get_baidu_score(text):
time.sleep(0.6) # API限制QPS为2 sleep应大于1/2
try:
r = client.sentimentClassify(text)
score = r['items'][0]['positive_prob']
except UnicodeEncodeError: # 这里百度只接受gbk编码的,Unicode不行,给它打成1分,到时排除
score = 1.5
return float(format(score-0.5, '.5f')) # 也把取值调到了-0.5到0.5
print(get_baidu_score("棒极了"))
# 0.49993
最后运行comment_analyze(comment_list)
会出现一张评论情感分布的柱形图,用来观察评论的总体情况。