为什么要构建舆情分析体系
舆情分析就是根据特定问题的需要,对针对这个问题的舆情进行深层次的思维加工和分析研究,得到相关结论的过程。(来自百度百科) 我认为舆情分析的主要作用有如下几点:
- 去除数据冗余,直至核心;
信息时代是一个信息爆炸的时代,我们每天都会接触各类信息,虽然方便我们去获取信息,但是也造成了信息冗余,对某一个事物的认知往往会不得要领。舆情监控可以帮助我们过滤一些垃圾信息、重复信息,并且获得正反多类信息。 - 宏观把控趋势;
建立舆情监控体系,有利于我们在宏观上把控市场趋势,根据行业评论、市场讨论等了解大众对事物的观点倾向。 - 带入定量分析,预测拐点;
建立的舆情体系,可以基于新闻等,利用深度学习、机器学习等算法获得一个相对合理的舆情值,对市场情绪进行定量化,舆情值还可以带入我们建立的预测模型里面,优化我们的模型,及时的发现市场拐点。
舆情分析构建框架
- 数据采集
结构化的数据采集可以爬取百度搜索指数、新闻指数等获取大众对某一特定行业的关注程度,非结构化的数据采集源可以是行业报告、行业评论、国家相关政策及其分析、上市公司商业评论、疫情/灾情等,渠道一般有证券公司行业分析网站、国家公开政策新闻发布网站、研报、论坛等。 - 数据标注&情感分析
利用深度学习或者机器学习,必须做好数据集的标注,商用的数据集标注可以外包或者自建;或者直接调用各大平台已经开发好的模型,如百度、腾讯、阿里、华为等智能平台。 - 舆情值构建
舆情值的构建可以有以下几种方式:加权平均值、机器学习回归模型、多源信息融合算法等。 - 文本分类及观点抽取
我们设计的舆情分析框架包含正负两个观点集合,文本分类可以借助公开平台的训练模型(文本相似度、文本情感分析等)进行分类,观点抽取也可以以类似的方式(文本摘要)对全篇进行抽取摘要。 - 舆情报告
最终我们获取的舆情报告有以下几大部分组成:舆情值及其趋势、正负观点抽取及罗列、分析师填写的结论。
舆情分析构建实例
本例意在对A股大盘进行舆情分析,只是一个案例研究,不存在好坏。
- 数据获取
我们获取东方财富网站每天发布的对A股大盘的分析。http://stock.eastmoney.com/a/cchjy_2.html 以下是爬虫代码
#coding=utf-8
import re
from selenium import webdriver
import pandas as pd
driver = webdriver.Chrome('D:/webdrives/chromedriver.exe')
href_list_=[]
content_list = []
def href(i):
href_t = driver.find_element_by_css_selector('#newsTr'+str(i)+' > div.text > p.title > a')
href_ = href_t.get_attribute('href')
return href_
def text():
try:
div = driver.find_element_by_css_selector('body > div.main > div.contentwrap > div.contentbox').text
time = driver.find_element_by_css_selector('#topbox > div.tipbox > div.infos > div:nth-child(1)').text
title = driver.find_element_by_css_selector('#topbox > div.title').text
summary = driver.find_element_by_css_selector('body > div.main > div.contentwrap > div.contentbox > div.mainleft > div.zwinfos > div.abstract > div.txt').text
summary_ = re.findall(".*】(.*)",summary)
div_=re.sub('\s+', " ", div)
content_x = re.findall(".*APP内免费看>>(.*)主力资金加仓名单.*",div_) #body > div.main > div.contentwrap > div.contentbox > div.mainleft > div.zwinfos > div.abstract
content = [title,time,content_x,summary_]
except:
content = []
return content
for i in range(1,26):
url = 'http://stock.eastmoney.com/a/cchjy_'+str(i)+'.html'
driver.get(url)
for j in range(20):
href_ = href(j)
href_list_.append(href_)
#body > div.main > div.contentwrap > div.contentbox
for href in href_list_:
driver.get(href)
content = text()
content_list.append(content)
driver.close()
data = pd.DataFrame(content_list,columns=['title','date','content','summary'])
data.to_csv('content_11.csv')
最终获得数据样例如下图所示,主要爬取标题、发布时间、摘要、正文。
- 情感分析
情感分析主要借助于百度API接口进行分析,百度情感倾向分析API调用指南如https://cloud.baidu.com/doc/NLP/s/zk6z52hds所示,其他博客也有类似的教程,不在赘述。如“使用百度API进行情感分析(python)(一)” 以下是调用代码及分析结果:
#coding=utf-8
import re
import time
import pandas as pd
import numpy
import requests
import json
text_ = pd.read_excel('content_09.xlsx')
#获取token
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={自己的id}&client_secret={自己的id}'
response = requests.get(host)
print(response.json()) #运行获取token
运行上述代码获取access_token。 将上述access_token导入下面代码中
token = '上述获取的access_token'
url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token={}'.format(token)
negative_list = []
list =[]
def sentiment(text_,i):
new_data={'text':text_.content[i]}
new_data = json.dumps(new_data)
res=requests.post(url,data=new_data)
json_data = json.loads(res.text)
negative = json_data['items'][0]['negative_prob']
positive = json_data['items'][0]['positive_prob']
positive_list = [negative,positive]
return positive_list
list1=[]
list2=[]
for i in range(len(text_)):
try:
p_n = sentiment(text_,i)
list1.append(p_n[0])
list2.append(p_n[1])
except:
list1.append('n')#百度提供的免费API不稳定,为完整数据,先填满不能识别的数据
list2.append('p')
time.sleep(5)
text_['positive'] = [i for i in list2]
text_['negative'] = [i for i in list1]
text_.to_excel('content_sentiment.xlsx')
最终得到的结果如下:
问题
- 百度提供的api稳定不足,有可能我使用的是免费调用的原因,有大概30%~50%的不能分析出来;
- 百度提供的API,对应的是大行业,而且并未公布其训练数据的倾向,若要求准确性,需要自己收集本行业的数据,从“数据标注——>模型选择——>模型训练——>模型验证——>模型应用”着手,自己训练适合本行业的模型,方更具有说服力。
- 本案例数据有限,不能获取同一频次内至少10+的文章,不具备进行细粒度的舆情分析。
文章摘要
最后一步即是要对一段时间内的多个文本进行观点抽取,此处我们依然调用百度文本摘要的API。
# -*- coding: utf-8 -*-
import pandas as pd
import re
import requests
import json
text = pd.read_excel('content_sentiment.xlsx')
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={自己的id}&client_secret={自己的id}'
response = requests.get(host)
print(response.json())
运行上述代码获取access_token。 将上述access_token导入下面代码中
# -*- coding: utf-8 -*-
import pandas as pd
import re
import requests
import json
text = pd.read_excel('content_sentiment.xlsx')
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=jZzHwZkYY34wBfIwoKNfqDMS&client_secret=Goi0IQHyswhCEfiWTRA7CD2X4qvN6wgj'
response = requests.get(host)
print(response.json())
token = '24.fe4901284bb9b8510835059adf4d69fd.2592000.1630637330.282335-24648109'
url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/news_summary?charset=UTF-8&access_token={}'.format(token)
new_data={'content':text.content[1],"max_summary_len":200}
new_data = json.dumps(new_data)
res=requests.post(url,data=new_data)
print(text.content[1])
print(res.text)
最后得到的结果如下
{"log_id": 6681357197830018885, "summary": "A股市场在上周前半周市场波动加大、成交放量,但伴随着投资者逐渐消化政策意图、监管表态稳定市场,市场有所企稳,成长板块在后半周又再度大幅跑赢,但消费板块依然低迷。近期A股的波动加剧更多源于情绪面扰动,市场调整也是风险释放的过程,暂不具备系统性风险。"}
问题
- 百度提供的API是基于抽取式文本摘要算法,可读性有保证,但是不足以概括文本的核心观点,如需要概况性的生成核心观点,恐怕需要借助与深度学习,但是根据最新NLP的发展,目前的主流技术生成的中文摘要可读性较差,如基于RNN、transform、bert等深度学习的算法,国外的技术基本只针对英文摘要,不可迁移。
- 本文由于只是提供一种构建舆情分析的框架和思想,采集的数据较少,不能做细粒度的舆情分析。
最后
我们希望得到的舆情分析报告样例如下。
|