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

作者:Susan Li
翻译:杨毅远
校对:吴金笛
本文长度为4400字 , 建议阅读8分钟
本文为大家介绍了基于自然语言处理的COVID-19虚假新闻检测方法以及可视化方法 , 并结合真实的新闻数据集与完整的代码复现了检测以及可视化的过程 。
标签:自然语言处理 数据可视化

附代码 基于NLP的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 stopwords2. STOPWORDS = set(stopwords.words('english'))3. from sklearn.feature_extraction.text import CountVectorizer4.5. from textblob import TextBlob6. import plotly.express as px7. import plotly.figure_factory as ff8. import plotly.graph_objects as go9.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
附代码 基于NLP的COVID-19虚假新闻检测

文章插图
 
经过数据清洗 , 我们可以看到共有586篇真实新闻和578篇虚假新闻 。
df.loc[df['label'] == 'TRUE'].source.value_counts()
附代码 基于NLP的COVID-19虚假新闻检测

文章插图
 

真实新闻主要来自哈佛健康出版社(Harvard Health Publishing)、《纽约时报》(The New York Times)、约翰霍普金斯大学彭博公共卫生学院(Johns Hopkins Bloomberg School of Public Health)、世卫组织(WHO)以及疾病预防控制中心(CDC)等机构 。
df.loc[df['label'] == 'FAKE'].source.value_counts()
附代码 基于NLP的COVID-19虚假新闻检测

文章插图
 
图二
其中的几个虚假新闻是从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
附代码 基于NLP的COVID-19虚假新闻检测

文章插图
 
print_plot(1000)
附代码 基于NLP的COVID-19虚假新闻检测

文章插图
 
由于我们数据集中文章内容很清晰 , 所以我们仅需要删除标点符号并将大写字母改为小写即可 。
文章长度
在接下来的步骤中:
  • 获取每篇新闻的情感得分 , 而且分数控制在[-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()  


推荐阅读