百度AI开放平台情感分类


上次获取了top10集中式公寓品牌约1600条 微博内容,每条微博内容都代表了发博者的情感,其中不乏赞美之词,也不乏抱怨的,还有只做个路人甲的,如何从这些内容提炼发博者的观点态度呢?这有点像英语阅读理解里面的 What`s the author’s opinion or attitude? 我们知道一篇微博里面,往往会出现表露情感的词语比如“大爱“,”怎么还不倒闭“等等,人类总是有7情6欲,其中7情是指 “喜、怒、哀、惧、爱、恶、欲”,这7种情感中 喜和爱 可以表示正性的,而 怒,哀,惧和恶 则表示负性的,唯独 既可为正性又可以为负性,暂定为中性。于是乎,情感又可分为3大类——正性,负性和中性。

问题及思路

如果规定一条微博只表达一种情感的话,那么抽象来看,这个情感判别这就是一个多分类问题,对于文本情感挖掘一般会有下面3个解决办法

  1. jieba模块+LSTM神经网络训练
    首先可以利用jieba模块可以将微博内容分词,并标注词的情感,关键是若干个表达情感的词语组合起来综合态度,到底是正性的,负性的还是中性的?这需要一个好的算法。在给每一条微博打上情感标签后,然后利用神经网络LSTM进行有监督学习分类。

  2. 调用百度AI开放平台情感倾向分析
    在百度AI开发平台的情感倾向分析返回结果里面,0表示负性,1表示中性,2表示正性,可以调用百度AI开放平台的情感分析接口向服务器发出请求,然后获取返回结果,利用返回结果给每条微博内容打上标签。

  3. PaddleHub Senta模块
    这是一个简单的API接口,直接pip install paddlepaddle,然后像sklearn那样调用便是,返回的是某条微博情感方面的参数。

本文以探讨第二种方法,并在此基础上人工验证分类的准确率,共1596条微博内容,人工验证发现有175条分类错误,准确率为89.1%。下面是调用百度AI开放平台的情感倾向分析完整代码

完整代码
# -*- coding: utf-8 -*-
"""
project_name:利用百度接口情感分析
@author: 帅帅de三叔
Created on Thu Aug 15 15:36:10 2019
"""
import pymysql #导入数据库api模块
import requests #导入请求模块
import json #导入json模块
import urllib #导入url操作模块
import time #导入时间模块
from tqdm import tqdm #导入进度条模块

db=pymysql.connect(host="localhost",user="root",password="123456",database="weibo",charset="utf8mb4") #链接数据库weibo
cursor=db.cursor() #获取游标
boyu_sql="select * from weibo_zongbiao" #mysql脚本
cursor.execute(boyu_sql) #执行mysql脚本
result=cursor.fetchall() #获取所有数据tuple类型
data=pd.DataFrame(list(result),columns=["user","content","time"]) #自定义表头
contents=data['content'] #提取微博内容
cursor.execute("DROP TABLE IF EXISTS weibo_qinggan") #重头再来
c_sql="""create table weibo_qinggan(
         content varchar(300),
         sentiment_lable varchar(2),
         positive_prob varchar(10),
         negative_prob varchar(10),
         confidence varchar(10)
            )Engine=InnoDB AUTO_INCREMENT=1 Default charset=utf8mb4""" #创建表采用utf8mb4可以把emoji插入数据库
cursor.execute(c_sql) #执行创建表

def get_access_token(): #定义获取access_token函数
    host="https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【您的API Key】&client_secret=【您的Secret Key】"
    resp=requests.post(host)
    reply=resp.json()
    access_token=reply['access_token']
    #print(access_token)
    return access_token

def sentiment_classify(sentence): #定义获取情感分析函数
    material = {"text":"内容"} #以字典形式存放物料
    material['text'] = sentence #通过键值传递实参
    data = json.dumps(material).encode('utf-8') #利用dump把python数据格式转json格式
    host = "https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token="+get_access_token() #请求服务器
    time.sleep(1) #挂起进程1秒
    request = urllib.request.Request(url=host,data=data) #发出请求
    request.add_header('Content-Type', 'application/json') #追加请求头
    response = urllib.request.urlopen(request) #获取响应
    content = response.read().decode('utf-8') #读取响应内容
    answer = json.loads(content) #字典类型 
    #print(answer)     
    ls=answer['items'] #解析内容以字典构成的列表
    print(ls) #测试解析内容
    comment=answer['text'] #原微博内容
    positive_prob=[item[key] for item in ls for key in item][0] #属于消极类别的概率
    confidence=[item[key] for item in ls for key in item][1] #置信度
    negative_prob=[item[key] for item in ls for key in item][2] #属于消极类别的概率
    sentiment=[item[key] for item in ls for key in item][3] #情感极性分类结果,0:负向,1:中性,2:正向情感极性分类结果,0:负向,1:中性,2:正向
    print(comment,sentiment,positive_prob,negative_prob,confidence) #测试返回值
    insert_data=("insert into weibo_qinggan(content,sentiment_lable,positive_prob,negative_prob,confidence)""values(%s,%s,%s,%s,%s)") #控制插入格式
    weibo_data=([comment,sentiment,positive_prob,negative_prob,confidence]) #待插入数据
    cursor.execute(insert_data,weibo_data) #执行数据
    db.commit()#主动提交数据库
    
if __name__=="__main__":
    for index in tqdm(contents): #对微博内容循环(带进度条)
        sentiment_classify(index) #执行情感分类函数
代码解析

由于微博内容存在mysql数据库里面,先要链接数据库把数据取出来,然后不断向百度AI开放平台发出请求,第一个函数 get_access_token 是用来获取您的access_token以便在第二个函数的时候构造请求url,而第二个函数 sentiment_classify是以微博内容作为请求实体向百度AI开放平台发起请求,返回微博内容一些情感方面的参数,返回结构是json格式如下,其中sentiment是我们主要关心的情感列别表情。

{
    "text":"苹果是一家伟大的公司",
    "items":[
        {
            "sentiment":2,    //表示情感极性分类结果
            "confidence":0.40, //表示分类的置信度
            "positive_prob":0.73, //表示属于积极类别的概率
            "negative_prob":0.27  //表示属于消极类别的概率
        }
    ]
}

接着提取返回结果存入数据库里面,注意程序挂起时间,因为百度服务器每秒查询率QPS不能超过2,然后在提取由字典构成的列表items的时候可以像下面这样样提取一个个value值

positive_prob=[item[key] for item in ls for key in item][0] 
confidence=[item[key] for item in ls for key in item][1] 
negative_prob=[item[key] for item in ls for key in item][2] 
sentiment=[item[key] for item in ls for key in item][3] 

整个过程流畅并无赘余,有很好的参考价值,下一次准备试一下PaddleHub Senta模块,并打算自己写一个深度神经网络训练情感分类。

延申阅读
百度地图开放平台web api 获取上海市所有小区信息
通过关键词获取微博内容

百度AI开放平台情感分类_AI