上次获取了top10集中式公寓品牌约1600条 微博内容,每条微博内容都代表了发博者的情感,其中不乏赞美之词,也不乏抱怨的,还有只做个路人甲的,如何从这些内容提炼发博者的观点态度呢?这有点像英语阅读理解里面的 What`s the author’s opinion or attitude? 我们知道一篇微博里面,往往会出现表露情感的词语比如“大爱“,”怎么还不倒闭“等等,人类总是有7情6欲,其中7情是指 “喜、怒、哀、惧、爱、恶、欲”,这7种情感中 喜和爱 可以表示正性的,而 怒,哀,惧和恶 则表示负性的,唯独 欲 既可为正性又可以为负性,暂定为中性。于是乎,情感又可分为3大类——正性,负性和中性。 问题及思路
如果规定一条微博只表达一种情感的话,那么抽象来看,这个情感判别这就是一个多分类问题,对于文本情感挖掘一般会有下面3个解决办法
-
jieba模块+LSTM神经网络训练
首先可以利用jieba模块可以将微博内容分词,并标注词的情感,关键是若干个表达情感的词语组合起来综合态度,到底是正性的,负性的还是中性的?这需要一个好的算法。在给每一条微博打上情感标签后,然后利用神经网络LSTM进行有监督学习分类。 -
调用百度AI开放平台情感倾向分析
在百度AI开发平台的情感倾向分析返回结果里面,0表示负性,1表示中性,2表示正性,可以调用百度AI开放平台的情感分析接口向服务器发出请求,然后获取返回结果,利用返回结果给每条微博内容打上标签。 -
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模块,并打算自己写一个深度神经网络训练情感分类。