独家 | 基于NLP的COVID-19虚假新闻检测(附代码)

作者:Susan Li

翻译:杨毅远

校对:吴金笛

本文长度为4400字,建议阅读8分钟

本文为大家介绍了基于自然语言处理的COVID-19虚假新闻检测方法以及可视化方法,并结合真实的新闻数据集与完整的代码复现了检测以及可视化的过程。

标签:自然语言处理 数据可视化

最近有这样一则新闻:一半的加拿大人被COVID-19的阴谋论所愚弄,这个新闻真的令人心碎。

世界卫生组织(WHO)称,与COVID-19相关的信息流行病与病毒本身同样危险。同样地,阴谋论、神话和夸大的事实可能会产生超出公共健康范围的后果。

多亏了Lead Stories,Poynter,FactCheck.org,Snopes,EuVsDisinfo等项目可以监视、识别和检查散布在世界各地的虚假信息。

为了探究COVID-19虚假新闻的内容,我对于真实新闻和虚假新闻进行了严格的定义。具体来说,真实新闻是众所周知的真实报道并且来自可信赖的新闻机构;虚假新闻是众所周知的错误报道并且来自知名的有意试图散布错误信息的虚假新闻网站。

基于以上定义,我从各种新闻资源中收集了1100篇有关COVID-19的新闻文章和社交网络帖子并对其进行了标记。

数据集可以在这里找到:

https://raw.githubusercontent.com/susanli2016/NLP-with-Python/master/data/corona_fake.csv

数据

1. from nltk.corpus import stopwords  
2. STOPWORDS = set(stopwords.words('english'))  
3. from sklearn.feature_extraction.text import CountVectorizer  
4.   
5. from textblob import TextBlob  
6. import plotly.express as px  
7. import plotly.figure_factory as ff  
8. import plotly.graph_objects as go  
9.   
10. df = pd.read_csv('data/corona_fake.csv')  
11. df.loc[df['label'] == 'Fake', ['label']] = 'FAKE'  
12. df.loc[df['label'] == 'fake', ['label']] = 'FAKE'  
13. df.loc[df['source'] == 'facebook', ['source']] = 'Facebook'  
14.   
15. df.loc[5]['label'] = 'FAKE'  
16. df.loc[15]['label'] = 'TRUE'  
17. df.loc[43]['label'] = 'FAKE'  
18. df.loc[131]['label'] = 'TRUE'  
19. df.loc[242]['label'] = 'FAKE'  
20.   
21. df = df.sample(frac=1).reset_index(drop=True)  
22. df.label.value_counts()

process_data.py

经过数据清洗,我们可以看到共有586篇真实新闻和578篇虚假新闻。

df.loc[df['label'] == 'TRUE'].source.value_counts()

图一

真实新闻主要来自哈佛健康出版社(Harvard Health Publishing)、《纽约时报》(The New York Times)、约翰霍普金斯大学彭博公共卫生学院(Johns Hopkins Bloomberg School of Public Health)、世卫组织(WHO)以及疾病预防控制中心(CDC)等机构。

df.loc[df['label'] == 'FAKE'].source.value_counts()

图二

其中的几个虚假新闻是从Facebook的帖子中收集的,其是一个名为Natural News的极右网站和一个名为orthomolecular.org的替代医学网站。一些文章或帖子已从互联网或社交网络中删除,但是,他们仍能够在网络中被查询到。

使用下面的函数,我们将能够阅读任何给定的新闻内容并由此确定如何清洗它们:

1. def print_plot(index):  
2.     example = df[df.index == index][['text','label']].values[0]  
3.     if len(example) > 0:  
4.         print(example[0])  
5.         print('label:', example[1])  
6.           
7. print_plot(500)

print_plot.py

print_plot(1000)  

由于我们数据集中文章内容很清晰,所以我们仅需要删除标点符号并将大写字母改为小写即可。

1. df['text'] = df['text'].str.replace('[^\w\s]','')  
2. df['text'] = df['text'].str.lower()

文章长度

在接下来的步骤中:

  • 获取每篇新闻的情感得分,而且分数控制在[-1,1]范围内,其中1表示积极情绪,-1表示消极情绪。

  • 获取每篇文章的长度(字数)。

df['polarity'] = df['text'].map(lambda text: TextBlob(text).sentiment.polarity)  def text_len(x):  if type(x) is str:  return len(x.split())  else:  return 0  df['text_len'] = df['text'].apply(text_len)  
nums_text = df.query('text_len > 0')['text_len']  fig = ff.create_distplot(hist_data = [nums_text], group_labels = ['Text'])  
fig.update_layout(title_text='Distribution of article length', template="plotly_white")  
fig.show()  

polarity_length.py

图三

数据集中的大多数文章少于1000个单词。不过,有少数文章超过4000个单词。

当我们按标签区分时,就文章的长度而言,真实新闻和虚假新闻之间没有明显的区别,尽管在数据集中大多数真实新闻似乎都比虚假新闻短一些。

1. fig = px.histogram(df, x="text_len", y="text", color="label",  
2.                    marginal="box",  
3.                    hover_data=df.columns, nbins=100)  
4. fig.update_layout(title_text='Distribution of article length', template="plotly_white")  
5. fig.show()  
text_len_hist.py

 

图四

为了显示不同新闻的文本长度的概率密度,我们使用小提琴图(violin plot)表示:

1. fig = px.violin(df, y='text_len', color='label',  
2.                 violinmode='overlay',   
3.                 hover_data=df.columns, template='plotly_white')  
4. fig.show()

text_len_violin.py

图五

  • Facebook vs. Harvard

平均而言,Facebook的帖子比哈佛健康的文章短得多:

1. df_new = df.loc[(df['source'] == 'Facebook') | (df['source'] == 'https://www.health.harvard.edu/')]  
2.   
3. fig = px.histogram(df_new, x="text_len", y="text", color='source',  
4.                    marginal="box",  
5.                    hover_data=df_new.columns, nbins=100)  
6. fig.update_layout(title_text='Distribution of article length of two sources', template="plotly_white")  
7. fig.show()

facebook_harvard_textlen_hist.py

图六

我们也可以使用小提琴图(violin plot)来呈现:

1. fig = px.violin(df_new, y='text_len', color='source',  
2.                 violinmode='overlay',   
3.                 hover_data=df_new.columns, template='plotly_white')  
4. fig.show() 

facebook_harvard_textlen_violin.py

 

图七

 

也许我们大家都很熟悉,Facebook虚假帖子的内容往往更短。发表文章的人试图通过试探法而非说服力来说服读者。

  • 情感极性

1. x1 = df.loc[df['label']=='TRUE']['polarity']  
2. x2 = df.loc[df['label'] == 'FAKE']['polarity']  
3.   
4. group_labels = ['TRUE', 'FAKE']  
5.   
6. colors = ['rgb(0, 0, 100)', 'rgb(0, 200, 200)']  
7.   
8. fig = ff.create_distplot(  
9.     [x1, x2], group_labels,colors=colors)  
10.   
11. fig.update_layout(title_text='polarity', template="plotly_white")  
12. fig.show()

label_polarity.py

图八

真实新闻与虚假新闻在情感方面没有明显差异,我们可以使用小提琴图(violin plot)来证实:

1. fig = p.violin(df, y='polarity', color="label",  
2.                 violinmode='overlay',  
3.                 template='plotly_white')  
4. fig.show()

polarity_violin.py

图九

当我们比较这四个来源之间的情绪极性时,我们可以看到《纽约时报》和《自然新闻》的情绪分布比哈佛健康新闻和Facebook的情绪分布要窄得多。

1. x1 = df.loc[df['source']=='Facebook']['polarity']  
2. x2 = df.loc[df['source'] == 'https://www.health.harvard.edu/']['polarity']  
3. x3 = df.loc[df['source'] == 'https://www.nytimes.com/']['polarity']  
4. x4 = df.loc[df['source'] == 'https://www.naturalnews.com/']['polarity']  
5. group_labels = ['Facebook', 'Harvard', 'nytimes', 'naturalnews']  
6.   
7. colors = ['rgb(0, 0, 100)', 'rgb(0, 200, 200)', 'rgb(100, 0, 0)', 'rgb(200, 0, 200)']  
8.   
9. # Create distplot with custom bin_size  10. fig = ff.create_distplot(  
11.     [x1, x2, x3, x4], group_labels,colors=colors)  
12.   
13. fig.update_layout(title_text='polarity', template="plotly_white")  
14. fig.show()  

polarity_source.py

图十

这意味着《纽约时报》的新闻和数据中的自然新闻听起来不那么具有情绪。

可以用以下小提琴图(violin plot)来证实:

1. fig = go.Figure()  
2.   
3. sources = ['https://www.health.harvard.edu/', 'https://www.nytimes.com/', 'Facebook', 'https://www.naturalnews.com/']  
4.   
5. for source in sources:  
6.     fig.add_trace(go.Violin(x=df['source'][df['source'] == source],  
7.                             y=df['polarity'][df['source'] == source],  
8.                             name=source,  
9.                             box_visible=True,  
10.                             meanline_visible=True))  
11. fig.update_layout(title_text='Polarity of four sources', template='plotly_white')  
12. fig.show()

source_violin.py

图十一

  • 情绪vs文章长度vs真实性

我注意到我收集的新闻和帖子既不是非常积极,也不是非常消极。它们大多数处于适度的正数范围内,并且大多数长度少于1000个字。

1. fig = px.density_contour(df, x='polarity', y='text_len', marginal_x='histogram', marginal_y='histogram', template='plotly_white')  
2. fig.update_layout(title_text='Sentiment vs. Article length')  
3. fig.show()

len_polarity.py

图十二

情感与文章的长度之间没有明显的关系。通常,文章的情感或篇幅不能反映其真实性。虚假新闻与真实新闻之间的区别可能是相当随意的。

1. fig = px.scatter(df, x='polarity', y='text_len', color='label', template="plotly_white")  
2. fig.update_layout(title_text='Sentiment polarity')  
3. fig.show()

polarity_scatter.py

图十三

df.groupby(['source']).mean().sort_values('polarity', ascending=False)

图十四

我注意到鲁迪·朱利安妮(Rudy Giuliani)的帖子是情感评分最高的帖子之一,所以我很好奇想知道这篇帖子是关于什么的:

df.loc[df['source'] == 'RudyGiuliani']['text'][880]

当然是关于羟氯喹(Hydroxychloroquine)的啦~。

真实与虚假新闻的内容

现在,我们将了解数据集中包含哪些主题:

1. common_bigram_true = get_top_n_bigram(df.loc[df['label'] == 'TRUE']['text'], 20)  
2. for word, freq in common_bigram_true:  
3.     print(word, freq)

true_bigram.py

1. common_bigram_fake = get_top_n_bigram(df.loc[df['label'] == 'FAKE']['text'], 20)  
2. for word, freq in common_bigram_fake:  
3.     print(word, freq)

fake_bigram.py

  • 促进治愈:这包括使用大剂量静脉注射维生素C。

  • 关于起源的推测:这个主题包括声称冠状病毒是在用于生物武器的实验室中制造的,或者是5G技术导致了这种疾病。

  • 关于有影响力人士的谣言:例如比尔·盖茨和福西博士代表制药公司策划了冠状病毒。

  • 应对人们的恐惧:例如梅林达·盖茨基金会和约翰·霍普金斯大学在三个月前通过Event 201预测了冠状病毒。

从我们的数据来看,真实和虚假新闻内容之间的一个明显区别是,虚假新闻似乎更多地使用了人的名字,这表明虚假新闻可能更加个性化。

naturalnews.com vs orthomolecular.org

以上两个新闻来源都提倡阴谋论,但是它们却关注不同的主题。

1. naturalnews_bigram = get_top_n_bigram(df.loc[df['source'] == 'https://www.naturalnews.com/']['text'], 20)  
2. for word, freq in naturalnews_bigram:  
3.     print(word, freq)

natural_bigram.py

naturalnews.com一直在传播虚假信息,例如在中国实验室将冠状病毒设计为生物武器,并且/或者传播病毒来掩盖暴露于5G无线技术有关有害健康的影响。

1. ortho_bigram = get_top_n_bigram(df.loc[df['source'] == 'http://orthomolecular.org/']['text'], 20)  
2. for word, freq in ortho_bigram:  
3.     print(word, freq)

ortho_bigram.py

orthomolecular.org一直在推广使用大剂量静脉注射维生素C作为治疗方法,但尚无根据。

根据以上分析,大家可以随时自行判断其他新闻的真实性。

总结

首先,我们不知道在收集数据时是否存在选择偏差。其次,虽然以上的新闻都是用户参与度很高的新闻,但我们无法说出这些新闻报导产生的实际流量。尽管有这些不足,但此数据集提供了合理的标签,并且我们知道其内的所有新闻都已被广泛阅读和分享。

原文标题:

Explore COVID-19 Infodemic

原文链接:

https://towardsdatascience.com/explore-covid-19-infodemic-2d1ceaae2306

编辑:王菁

校对:杨学俊

译者简介

杨毅远,清华大学自动化系研一在读,本科毕业于华中科技大学自动化学院实验班,研究方向为工业过程检测中的AI算法。喜欢唱歌、喜欢接触新鲜事物的我对于“AI+”格外感兴趣;入门CV和数据挖掘的我,希望接触到更多非自己研究领域内的事物,拓宽自己的知识圈。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41443.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微博舆情 之 特定话题情感分析

本文介绍一下在做微博特定话题情感分析中的做法,核心就是判断文本的情感极性,再根据这个极性来进行情感判定。 主要经过了以下几个步骤: 文本预处理 去乱码、去网络词利用LTP获取分词、句子结构及成分等信息情感信息提取 在同义词词林里面…

基于NLP的COVID-19虚假新闻检测

基于NLP的COVID-19虚假新闻检测 摘要 全文约2400字,建议阅读时间7分钟。本文为大家介绍了基于自然语言处理的COVID-19虚假新闻检测方法以及可视化方法,并结合真实的新闻数据集以及完整的代码复现了检测以及可视化的过程。 最近有这样一则新闻&#xf…

让一让,神州泰岳要进化了

2018年11月,“中国版Facebook”人人公司宣布将人人网社交平台业务相关资产出售,至此,在国内大学生中风靡一时的社交平台正式落幕。人人网创始人陈一舟在接受媒体采访时谈到几点经验教训,其中之一,“转型比创业难&#…

chatgpt赋能Python-python人机对话代码

简介 Python是一种常用的编程语言,广泛应用于人机对话代码的设计与开发。人机对话是基于自然语言处理技术的,为了更好地实现人机交互,我们需要编写高效的Python代码来处理文字、图像和语音输入输出。本文将介绍Python在人机对话代码中的应用…

chatgpt赋能python:Python人机对话框架:让人机交互变得简单

Python人机对话框架:让人机交互变得简单 人机交互已成为现代社会中不可或缺的一部分,尤其在计算机软件的开发领域,如何实现高效的人机交互对于软件的成功运行至关重要。本文将介绍Python人机对话框架,探讨如何使用该框架实现优秀…

ChatGPT当虚拟助手遇见人工智能|小智AI

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨OpenAI ChatGPT|GPT-4|GPT-3|人机对话|ChatGPT应用|小智ai|小智ai|小智ai|小智ai|小智AI|chatgpt小智AI ChatGPT 是一个引人注目的技术成果,它将人工智能与虚拟助手相结合&#xff0…

MOSS模型量化版部署过程

文章目录 项目背景配置环境与准备部署推理命令行部署报错1报错2: 使用免费试用的阿里云GPU部署在AutoDL平台上部署 项目背景 2023年4月21日,复旦大学自然语言处理实验室正式开放MOSS模型,是国内首个插件增强的开源对话大语言模型。MOSS 相关…

chatgpt赋能python:Python中的复制粘贴教程

Python中的复制粘贴教程 在Python编程中,复制和粘贴是极其常见的操作。虽然这似乎是很基础的操作,但在实际应用中仍有很多人不知道如何正确地复制和粘贴代码。本文将介绍Python中的复制粘贴教程,提供一些实用的技巧和小窍门,帮助…

部落冲突-家乡-兵种(训练营兵种、暗黑训练营兵种)

1 训练营兵种 1.1 野蛮人 1.1.1 野蛮人 这些无畏的勇士长着引人注目的胡子,他们依靠着壮硕的肌肉在敌人的村庄肆虐。训练一队野蛮人,他们将为您出生入死! 1.1.2 超级野蛮人 生命值更高、力量更强、速度更快,最重要的是秀发更浓密。成为超级…

2020-12-22

新开普电子股份有限公司_任意文件下载 物联网平台 GET /api/device/foreignId//…%255c…%255c…%255c…%255c…%255c…%255c…%255c…%255cwindows/win.ini HTTP/1.1 Accept: text/html,application/xhtmlxml,application/xml;q0.9,/;q0.8 Accept-Encoding: gzip,deflate Hos…

新开普一卡通系统(Ecard-T4.5 1200) 补卡-挂失常见问题汇集

1. 挂失补卡后的bug bug描述:某用户在进行挂失操作时,选择“是否立即补卡”,如果放在读卡器上的卡是一张已发的卡的话,该用户将造成该用户cardno 的卡库不一致。 原因分析:使用的数据库表:rec_card_make , …

蚂蚁金服斥资2.5亿入股A股公司新开普旗下完美数联

雷帝网 乐天 1月8日报道 A股公司新开普日前发布公告,宣布蚂蚁金服旗下子公司上海云鑫及公司控股子公司完美数联签署了《业务合作框架协议》。 截至公告日,新开普持有完美数联85.7143%股权。上海云鑫拟出资2.5亿元对完美数联增资。 交割全部完成后&#x…

TensorFlow第二届开发者峰会

天体物理学家使用 TensorFlow 分析开普勒任务中的大量数据,以发现新的行星; 医学研究人员利用 TensorFlow 机器学习技术来评估一个人心脏病发作和中风的几率; 科学家在非洲用 TensorFlow 检测木薯植物疾病,从而提高产量并帮助更…

一、二线城市 IT 公司大盘点!建议收藏

点击关注公众号,回复“1024”获取2TB学习资源! 一直以来,总有读者来询问,是否可以整理一下一、二线城市的互联网IT企业,这样方便后面的跳槽、找工作有一个参考。 所以,应大家的强烈需求,今天给大…

【产业互联网周报】微软、谷歌再布局边缘云;美团放弃公有云业务;开普云登陆科创板...

关注ITValue,看企业级最新鲜、最具价值报道! 图片来源:unsplash 【产业互联网周报是由钛媒体TMTpost发布的特色产品,将整合本周最重要的企业级服务、云计算、大数据领域的前沿趋势、重磅政策及行研报告。】 产业互联网&#xff08…

php会议签到签退系统,会议签到管理系统,无障碍会议签到系统,一卡通会议签到系统,会议签到系统 - 新开普(NewCapec)...

会议签到系统 会议签到管理系统是对会议信息的一种统计和详细记录,对参加会议人员进行统一的管理,及时、准确地统计与会人员的迟到、早退、未参加等各种会议状态。 会议签到系统主要是在一卡通系统平台下开发的针对学校企业有关会议管理的软件。一卡通会…

云南酒店一卡通信息化建设,昆明宾馆一卡通管理系统,新开普智慧酒店整体解决方案

一、云南新开普酒店一卡通管理系统概述: 云南新开普酒店一卡通系统包括:一卡通系统管理中心、结算中心、制卡中心、监控平台、自助查询、银行圈存平台、掌上服务平台。 昆明酒店一卡通系统通过先进的管理系统,实现对酒店的停车、人员、消费…

开普云JAVA开发_【JAVA】使用Java SPI ServiceLoader进行Java应用插件模块化开发

背景:在进行业务定制时需要考虑不同接口的服务实现,每个局点所要求的接口大体都不一致,要求接口服务能够插件化方式提供; 方案分析: 1)采用OSGI框架进行开发,但是考虑到OSGI的框架太重,需要引入…

开普用的oracle管理工具,Oracle常用管理工具及其入门

Oracle常用管理工具及其入门 (2012-06-11 14:50:14) 标签: it (一)Oracle Universal Installer 1.用于安装、升级或删除软件组建、还用于创建数据库 2.基于Java引擎 3.具有一下特性 自动的相关性解析 可以进行基于Web的安装 跟踪组件和套件安装的清单 可卸载已安装的…

一卡通充值系统c语言,一卡通充值,一卡通充值中心,一卡通充值系统,一卡通充值转账系统 - 新开普(NewCapec)...

一卡通充值转账系统 1. 企业卡充值转账系统的特点 系统提供POS充值、软件充值、银行自助圈存充值、批量转账等充值方式。 所有充值操作,全部采用联网模式在线操作,以确保安全。 充值操作操作权限划分清晰,责任明确,只允许被授权的…