Skip to content

Latest commit

 

History

History
96 lines (71 loc) · 2.97 KB

4.md

File metadata and controls

96 lines (71 loc) · 2.97 KB

微博评论分析

我们当然可以获取爬取到的所有评论,但还是那某一微博下面的评论举个例子。

数据获取

前面说过获取评论的时候要用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)会出现一张评论情感分布的柱形图,用来观察评论的总体情况。