昨天尝试了鹅厂的AI开放平台中的文本情感分析功能。
今天进行了封装,并且设计了针对鹅厂AI开放平台的接口。
以后使用其他的功能扩展起来也能方便一些。
首先简单画了一个UML类图:
接下来是实现:
'''
data:2019.7.7
copyright:buaalzm
'''
import time
import random
import string
from abc import ABCMeta, abstractmethod
class QQAIBase():
__metaclass__ = ABCMeta
param_dict = {}
def __init__(self, app_id, app_key):
self.param_dict['app_id'] = app_id
self.param_dict['app_key'] = app_key
def basic_param_init(self):
'''请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效)'''
t = time.time()
self.param_dict['time_stamp'] = str(int(t))
'''请求随机字符串,用于保证签名不可预测'''
self.param_dict['nonce_str'] = ''.join(random.sample(string.ascii_letters + string.digits, 10))
@abstractmethod
def get_url(self):
pass
@abstractmethod
def get_content(self):
pass
'''
data:2019.7.7
copyright:buaalzm
'''
from qqaibase import QQAIBase
import urllib
import hashlib
import requests
from bs4 import BeautifulSoup
import json
class NLPTextPolar(QQAIBase):
base_url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textpolar" # API地址
def get_url(self, content):
self.basic_param_init()
'''值使用URL编码,URL编码算法用大写字母'''
self.param_dict['text'] = urllib.request.quote(content.encode('utf-8')).upper()
sign_before = ''
for key in sorted(self.param_dict):
if key is 'app_key':
continue
sign_before += key + '=' + self.param_dict[key] + '&'
sign_before += 'app_key=' + self.param_dict['app_key']
'''计算MD5摘要,得到签名字符串'''
sign = hashlib.md5(sign_before.encode('utf-8')).hexdigest()
sign = sign.upper()
params = 'app_id=' + self.param_dict['app_id'] + '&time_stamp=' + self.param_dict['time_stamp']\
+ '&nonce_str=' + self.param_dict['nonce_str'] + '&sign=' + sign + '&text=' + self.param_dict['text']
url = self.base_url + '?' + params # 请求地址拼接
return url
def get_content(self, content):
url = self.get_url(content)
try:
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
allcontents = soup.select('body')[0].text.strip()
allcontents_json = json.loads(allcontents) # str转成dict
return allcontents_json["data"]["polar"], allcontents_json["data"]["confd"], allcontents_json["data"]["text"]
except:
print('exception occur')
return 0, 0, 0
if __name__ == '__main__':
text_polar = NLPTextPolar('2118080088', '0tAooeqvvQeVx0hZ')
polar, confd, text = text_polar.get_content('有意思')
print('情感倾向:'+str(polar)+'\n'+'程度:'+str(confd)+'\n'+'文本:'+str(text))
输出结果: