您的位置:首页 > 大数据 > 人工智能

百度AI开放平台情感分类

2019-08-16 22:20 429 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zengbowengood/article/details/99674945

百度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,然后想skearn那样调用便是,返回的是某条微博情感方面的参数。

本文以探讨第二种方法,并在此基础上人工验证分类的准确率,共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) #执行情感分类函数

代码解析

本段代码主要实现的不断向百度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 获取上海市所有小区信息
通过关键词获取微博内容
孩子数学有问题,找三行科创呀!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: