此项目包括與情分析系统,包括爬虫、数据清洗、文本摘要、主题分类、情感倾向性识别以及分析结果数据可视化。该项目是在校时导师建议的一个边缘研究方向,开题时间 2017 上半年。导师研究的主力方向是网络空间安全,因此在社会工程学上,以当时大火的 AI 领域 NLP (自然语言处理) 为切入口,进行舆情舆论的情感倾向性研究。当时 NLP 的领域还是战国时代,self-attention 还在萌芽,transformers 还在酝酿,现在占统治地位的 BERT 和预训练机制还没有问世。战火纷飞的前 BERT 时代,百家争鸣,基于加性和乘性的传统 Attention 配合着 LSTM、GRU 等,花活儿辈出,创新方向是模型的魔改以及结合数据和场景的词嵌入。因此当时的建模方法相对今日早已落后。但是舆情分析的应用场景一直存在并且越来越需要,尤其是后疫情时代。所幸毕业之后一直从事 NLP 算法的工作,在项目的重构、建模的创新、以及整个工程应用链路的打通,也有很大成长,希望让这个项目完善起来,能帮助到社区,帮助到各位。
相信上至政府、企业,下到团体、个人,经历过新冠疫情,都深深意识到,网络舆情的重要程度。特殊时刻甚至能够左右时局、事态的发展。与此同时,后 BERT 时代,自然语言处理技术已经得到快速并且深入的发展。希望能有一个便捷的工具,可以更高效方便地收集网络舆情,通过情绪极性自动识别,分析舆论风向;有必要的话,自动抽取舆情中关注的重要信息,为使用者提供更精准及时的决策依据。技术工具本无好坏,重在使用者的初心。希望世界和平稳定,没有战争、没有疫情、人人安居乐业,技术造福人类。
所谓网络,互联网等,本质上就是一个信息载体,整个社会的信息在其中产生、演变、交互、消失。这些海量信息冗余繁杂、真假难辨,那么什么样的信息才算舆情。将复杂问题极致简化,时钟拨回人类的原始社会时期,那时信息极致简单明了,除了渔猎、迁徙、繁衍无他。舆情便是:原始人讨论去哪里渔猎、讨论迁徙到哪里、讨论如何繁衍。从中可以看到,舆情便是群体中大多数人所关注的、具有价值的信息。大多数人关注、具有价值,这两点缺一不可。而在现在的分工极为细致的信息社会,多少人参与讨论以及有无价值是相对于舆情获取者及关注问题而言的,因此,这两个标准要在最开始时明确。
云计算、云存储、大算力的进步,为信息能够以指数爆炸式地增长提供技术保障;以前的论坛、贴吧、社区,现在的微博、知乎、微信、抖音等,大量鼓励用户生成内容(UGC)的诞生,让信息能够被大多数人创作、演变、交互,同时也让信息变得更分散、更低质;大火的要上链的 web 3.0、区块链让信息变得更加隐私匿名。同时,网络信息形式越来越多样化,文本、表情包、音频、视频等,也为舆情获取提高门槛。此外,商业化的大规模的水军行为也让互联网内容环境越来越复杂。因此随着信息越来越浩瀚、越来越低质、越来越分散、越来越私密,收集大多数人关注的、有价值的网络信息越来越难。
以目前的状态,从技术视角来看,网络舆情的获取,移动端APP占绝大多数,此外,兼顾传统媒体,一些 Web 站点等也需纳入考虑。具体来说,公共事件的话,微博,微信公众号、视频号,抖音号,知乎这些必然是要有的;消费商品评价的话,各大电商平台,如淘宝、天猫、京东、当当、拼多多、自营商城网站等(比如对于电子产品,中关村在线)是肯定要有的;游戏、体育、图书、影视剧、艺术展的话,豆瓣、虎扑等是要有的。
目前获取网络舆情的主要技术方法,还是通过爬虫获取,包括网站爬虫、APP爬虫。最近各种隐私数据保护政策的落地,以及公司对数据资产的重视,爬虫和反爬技术愈演愈烈,小爬怡情,大爬伤身,强爬灰飞烟灭。
- Web 爬虫
- 编写 Python 脚本
- 依赖:Requests,BeatifulSoap,Selenium、ChromeDriver (Chrome官方驱动)
- 推荐 Scrapy 框架
- 开源项目:https://github.com/facert/awesome-spider
- APP 爬虫
- Java 环境 + Android 环境 (sdk)
- 夜神模拟器
- Appium (Appium Server GUI + Appium Inspector) + mitmproxy (mitmdump + mitmweb) + mongodb
- 编写 Python 脚本
- 搭建教程 + Demo 教程
- 舆情主题分类,获取目标受众关注的热点方向、热点领域,常用于造势,预测热点,并利用热点宣发,或者打造爆款
- 受众偏好分类,获取目标受众的审美、口味、偏好的趋势,常用于顺势时尚,调整宣发策略
- 舆情受众画像,根据受众的画像,对舆情分门别类,出于不同目的,推送给受众,吸睛引流
- 篇章/段落粒度的情感极性
- 句子粒度的情感极性
- 细粒度目标的情感极性(aspect-level)
- 获取网络舆情自身的关键信息,如主体、关系、客体;时间、地点等
- 获取参与网络舆情目标受众的态度、观点、看法等
- 获取网络舆情的时间线、主题等,预测舆情以及受众态度的走势
- 思路:主题分类,典型的自然语言理解 (NLU) 研究方向之一,对于有较强的业务意图的场景,主题类别确定,有监督的分类都可尝试;主题类别不确定,垂直域可以尝试支持类别扩充的有监督分类,开放域建议尝试无监督分类;对于现在舆情信息的形式多样,文本,图片,表情包,音频、视频等,多模态必是未来趋势;对于数据获取以及存储的效率来看,首选文本,如果文本形式即可满足场景需求,则大道至简。
- 参考:大量的论文、模型、数据、竞赛资源
- 模型:规则策略、特征工程+传统机器学习、深度学习
- 思路:情感极性分类,典型的自然语言理解 (NLU) 研究方向之一,根据业务场景的分析粒度,选择对应的研究对象
- 参考:大量的论文、模型、数据、竞赛资源
- 模型:规则策略、特征工程+传统机器学习、深度学习
- 思路:短文本生成,典型的自然语言生成 (NLG) 研究方向之一,生成较为成熟,条件生成、可控性都有一定保障
- 参考:大量的论文、模型、数据、竞赛资源
- 模型:规则模板、话术底表、特征工程+传统机器学习、深度学习
- 思路:信息抽取,pipeline形式,还是end-to-end联合抽取,重点 NLP 领域研究方向,成熟稳定,各大竞赛的常见场景
- 参考:大量的论文、模型、数据、竞赛资源
- 模型:规则模板、特征工程+传统机器学习、深度学习(有无 Schema 约束)
此项目主要是尽快重构项目,大同整个过程流程,所以数据获取的爬取脚本等工作暂先略去,待到后续进行补充,暂先用之前抓取得到的数据,包括
- 正面情绪 60000 条微博评论:https://github.com/CodeAsPoetry/PublicOpinion/blob/master/data/%E8%AF%AD%E6%96%99/PaperDataSet/pos60000.txt
- 负面情绪 60000 条微博评论:https://github.com/CodeAsPoetry/PublicOpinion/blob/master/data/%E8%AF%AD%E6%96%99/PaperDataSet/neg60000.txt
- 抓取搜狐新闻评论:https://github.com/CodeAsPoetry/PublicOpinion/tree/master/data/%E8%AF%AD%E6%96%99/NativeCorpus
-
分析微博评论数据,大概率推测此数据的标签来自 emoji 表情自动构造
pos60000.txt 中有数据:“好吧,下车了,很不爽,全家,让我爽一下![哈哈]” neg60000.txt 中有数据:“我这儿还有啤酒炸鸡巧克力,要不要互相交流一下零食?[偷笑] //@吉吉870609:一直都淡定的看热闹中。。。。。。花生瓜子果盘都准备好了!//@北京数独莹莹: [围观]现在的心情已经从昨天的心慌变为看戏的节奏了。。。哈哈哈 //@-阿雾啊呜-:[失望] //@下一个路口?-1988:大事不妙[生病]//@宋晚晚_:[生病]”
-
评论数据中存在转发微博,造成多人的评论在一起,微博转发格式“ //@xxx: ” 可以拿正则处理掉,并将多人评论合起来作为一条数据
-
“@xxx” 以及“[#emoji#]”,在评论中 at 某人和 emoji 表情的形式予以保留,因为这本就是微博评论会存在的情况
-
数据处理脚本:data_processing/data_analysis.ipynb
weibo_comment_list = [] zhuan_zai_reg = re.compile(r'\//[\s]*@.*?[\:\:]{1}') for item in weibo_path_list: with open(item, 'r', encoding='utf-8') as f: lines = f.readlines() for line in tqdm(lines): line = line.strip() comment_list = re.split(zhuan_zai_reg, line) if item == pos_file_path: sample = { 'uid': str(uuid.uuid1()), 'comment': ''.join(comment_list).lstrip().rstrip(), 'line': line, 'sentiment_label': 1 } weibo_comment_list.append(sample) else: sample = { 'uid': str(uuid.uuid1()), 'comment': ''.join(comment_list).lstrip().rstrip(), 'line': line, 'sentiment_label': 0 } weibo_comment_list.append(sample)
-
得到数据集:data/weibo_train_v0_by_emoji.json
{ 'uid': '92a34ad2-044b-11ed-95f9-a683e78cc882', 'comment': '哈,下次我赶着一头驴,唱着“我的故乡在远方”去旅行。[爱你]', 'line': '哈,下次我赶着一头驴,唱着“我的故乡在远方”去旅行。[爱你]', 'sentiment_label': 1 }
-
从其中随机抽样 100 条数据,data/weibo_train_v0_by_emoji_sample_100.xlsx,人工 Review 标签准确率:93%
-
搜狐评论数据来自多条新闻
data/sohu/8岁女孩下体受伤案,究竟有无老师唆使?.txt data/sohu/深圳GDP首次超越香港,成粤港澳大湾区经济总量第一城.txt data/sohu/拆除“削山别墅”,更得打击违建者嚣张气焰.txt data/sohu/“投币大军”再增一员这“病”如何治.txt data/sohu/山西太原明星市长耿彦波卸任,曾被称现实版李达康.txt data/sohu/权健公司束某某等16人被依法批准逮捕.txt data/sohu/起底城市绿化中的奢靡之风:贫困县斥资200多万种银杏.txt data/sohu/从警35年的副市长退休三年被挖出,曾被举报向黑老大赠送字画.txt data/sohu/百名婴幼儿口服过期疫苗,责任心去哪了?.txt data/sohu/陕西省委原书记赵正永涉严重违纪违法接受纪律审查和监察调查.txt data/sohu/呼和浩特发布大学毕业生“半价购房”新政,专家:力度大或作用有限.txt data/sohu/辽宁教育厅回应“等8年突然被取消高考资格”:改革需要.txt data/sohu/未婚女孩6年做17次流产,子宫薄如纸!医生都看不下去了…….txt data/sohu/龙永图:多向美国进口是一种进步 符合贸易政策调整方向.txt data/sohu/加总理称中国随意作死刑判决,中国外交部:加方缺乏法治精神.txt data/sohu/捷克总理:华为威胁国家安全?没证据.txt
-
评论数据总计 32959 条,预计作为测试集使用 data/sohu_test_v0.json
{ 'uid': '0fd9d1b6-04a5-11ed-95f9-a683e78cc882', 'comment': '看人家没有能出头的人,就这么欺负,简直太黑暗了,跟红楼梦里薛蟠打死人的情节太像了,堂堂法治社会,怎么能出这么黑暗的事!', 'line': '看人家没有能出头的人,就这么欺负,简直太黑暗了,跟红楼梦里薛蟠打死人的情节太像了,堂堂法治社会,怎么能出这么黑暗的事!' }
- 模型:BERT
- 训练-验证集:data/weibo_train_v0_by_emoji.json 120000 (预计从其中挑出 20000 条作为验证集)
- 测试集:data/sohu/xxx.txt,data/sohu_test_v0.json 32959
- 预训练模型:
- 参数:
- 性能指标:
- BadCase 分析:
- 技术栈:Docker + Flask + Uwsgi + Nginx + Pytorch
- 注意项
- docker 启动时加以端口映射,配置随容器自启 Flask、Uwsgi、Nginx,建议直接拉取 Nginx 容器然后进行其他安装配置
- uwsgi 配置 lazy-apps = true
- nginx、uwsgi 配置较长的超时时间(默认配置会报 502 错误),如 nginx 的 keepalive_timeout ,uwsgi 配置 http-timeout 或者 socket-timeout
- 技术栈
- 前端:Docker + React + Nginx
- 后端:Docker + Nginx + Tornado + Celery + Rabbitmq + Redis
- 数据库:MongoDB
- 注意项
- 前后端分离,爬取、清洗、模型推理、数据分析可视化都以插件形式运行(甚至可以实现人工打标以及 docker 承载的模型训练)
- 前端:React (Ant Design Pro),模板预览地址:https://preview.pro.ant.design/dashboard/analysis
- 后端:docker 启动时端口映射,配置随容器自启 Nginx、Tornado、Rabbitmq、Redis,建议直接拉取 Nginx 容器进行安装配置
- 尽管 Tornado 支持异步非阻塞,但仍建议 Celery + Rabbitmq + Redis,以便支持分布式爬虫和负载均衡,如果再进一步,类似 openPAI 的深度学习训练中台也可以支持。( 当然,OpenPAI ,是 k8s 负责容器调度 )
- Docker 容器安装 Rabbitmq : https://www.cnblogs.com/yyxp/p/16049603.html
- Docker 容器内安装 redis : https://www.jianshu.com/p/92395d6a4157
- 数据库