“还没等真话准备好,谎话就已经跑遍大半个世界了。”
——温斯顿丘吉尔
自2016年美国总统大选以来,“假新闻”就一直是政界的主导性话题。很多政治权威人士称,政治偏见和不实的新闻报道对选举结果产生了极大的影响。然而,斯坦福大学和纽约大学研究者们则对此言论表示怀疑。但不论如何,不实的新闻报道的确是利用了Facebook等社交媒体在网络上得到了广泛传播。
l “什么是假新闻?”
“假新闻”指的是那些具有明显误导性的新闻。但最近,社交媒体和社交用语的发展正在改变这一定义。现在,有些人会用“假新闻”这个词来反驳那些有悖于他们观点的事实,最突出的例子就是美国总统特朗普。因此,这样一个定义非常模糊的词语其实是很容易被恶意使用的。
数据科学界已经采取了实际行动来应对“假新闻”的挑战。最近出现了一种Kaggle风格的竞赛,叫做“假新闻挑战”;Facebook也正采用人工智能将虚假的新闻报道从用户信息中过滤掉。事实上,打击虚假新闻实际上是一个非常典型的文本分类任务,需要的解决问题也十分简单,即开发一个能够分辨新闻真假的模型。
而这也正是我打算要做的事情。我收集了一些新闻报道作为模型开发的数据库,这些新闻报道有真有假,鱼龙混杂。为了开发能够辨别文章真假的模型,我还在训练中利用了一个Naive Bayes分类器。
l 数据收集
我的训练数据包括“真新闻”和“假新闻”,数据收集的流程也分为真、假两个部分,其中假新闻的收集非常简单。Kaggle曾发布了一个假新闻的数据集,该数据集中包括了发表于2016年大选期间的一万三千篇新闻报道,因此假新闻的来源完全可以从这个数据集中获取。
然而,真新闻的获取就困难多了。为了获得真实可靠的新闻报道,我使用了一个叫做“All Sides”的网站。这个网站是专门发布政界的新闻报道和评论文章,因此其新闻的真实性相对有保证。All Sides网站上的文章都是按照主题(环境、经济、生育等)和政治偏向(左派、右派和中间派)划分的。之所以使用All Sides,是因为这个网站能让我从众多政见不同的媒体报道中,直接获得上千篇相对真实的文章报道。除此之外,All Sides还支持下载文章全文,而《纽约时报》就不行了。经过一段时间的数据收集,我最终收集到了5279篇“真新闻”。这些“真新闻”都是2015至2016年间,发表于纽约时报、华尔街日报、美国国家公共电台等媒体机构的。
最终版的数据集总共包含了10558篇新闻报道,有着文章标题、完整的文章内容以及文章真假的标签。所有的数据内容可点击链接查看此github。
l 目标和期望
一开始我就知道这项建模任务很难做到尽善尽美。实际上,我们的任务就是开发一个辨别真假新闻的分类器,并且将开发过程中获得的新发现用于建立更完备、准确的模型。最初,我认为辨别真假新闻其实跟检测垃圾邮件差不多。
开发一个基于count vectorizer(计算词汇的数量)的模型,或是“tfidf矩阵”(计算词汇在数据集的其他文章中的使用频率)的模型只能达到这种效果。这两种模型一般会忽视“词汇排序”和“全文布局”这些重要的因素,比如字数相同的两篇文章很有可能表达的是完全不同的内容。我并不指望我的模型能熟练地处理文字重叠的新闻报道,比起这个,我更希望能够从这个建模过程得到一些有价值的见解和经验。
l 建模
由于这个模型是关于文本分类的,所以我使用了一个Naive Bayes分类器。
组建这样一个模型真正需要做的是转换文本(“count vectorizer”VS“tfidf vectorizer”)和选择文本类型(标题或全文),所以我需要处理四对重新配置的数据集。
下一步是给“count vectorizer”或“tfidf vectorizer”选择最优参数,实际上就是用一些最常用的单词或短语、小写、删除停顿词(比如the、when、there)等。
为了更高效地测试多参数及其参数组合的性能,我使用了Sci-kit Learn的“网格搜索”功能。了解更多关于算法参数调优的方法,请点击文字查看教程。
经过“网格搜索”的测试,我发现“count vectorizer”和全文的训练更适合我的模型。“count vectorizer”的最优参数是“非小写”、“双词短语”,词语在文本库中出现的最优频率是三次。
正如我在前文中提到的,我对这个模型的期望并不高。因此这个模型最终的输出结果好的让我惊讶,甚至有些疑惑。模型的交叉验证准确度是91.7%,召回值为92.6%,AUC值为95%。
以下是该模型的ROC曲线图:
如果让我在这个曲线图上选一个阀值,我会选FPR在0.08左右、TPR在0.90左右的阀值。因为在这个点上FPR和TPR的权衡是相等的。
l 结果及总结
这些分值其实并不是最重要的,对模型性能的真正考验让它辨别非训练数据集中的新闻报道。
在假新闻数据集中剩下的5234篇新闻报道中,模型能够正确识别出其中的88.2%,这个数字比我的交叉验证准确度低了3.5%,但在我看来这已经相当不错了。
我曾做过这样的假设:模型很难对新闻报道进行分类。事实证明,我的假设是错的。
尽管我开发的这个模型看起来还不错,但是考虑到任务的复杂性,这很可能只是表象。
为了更好地理解,我们先看看数据中“最假”和“最真”的词。
我利用了从“数据学院”的Kevin Markham借来一项技术,在新闻报道数据集中找到了“最假”和“最真”词。
这项工作是由一个两列、10558行(文本库中的词数)的表格开始的。第一列代表某个词在一篇“假新闻”中出现的次数,第二列代表某个词在一篇“真新闻”中出现的次数。用某词在“假新闻”中出现的总次数除以“假新闻”的篇数,“真新闻”也是同样的操作。
然后,我新建了一列用于表示“假新闻”和“真新闻”的比值(假新闻/真新闻)。为了避免结果中出现条件错误(除数不能为零),我给所有数据值都加了1。这个比值确实能够比较直观地表示一个词究竟有多“真“或者有多“假”,但这绝对不是最完美的。逻辑很简单,如果一个词出现在好多篇“假新闻”里,而只出现在少数的几篇“真新闻”中,那么这个词的比值就会非常大。
以下是在我的数据集中排行前二十的“最假词”和“最真词”。
这两个图表反映出的结果让人非常疑惑——“最假词”表中包含了一些典型的网络用语,比如PLEASE, Share, Posted, html,还有一些根本不存在的词,比如“tzrwu”。而“最真词”主要是政论性文章中的高频词、政客的名字,这些词占了60%。这20个词语中7个有都是政客的名字。这就引发了一个问题:政治性文章更有可能是真的吗?当然不是,这些政论性文章中有很多都散布着关于政客的不实传言。
这个建模过程还存在一个问题——这些话题会出现很大程度的重叠,正如我们在上面看到的,某个词在“真新闻”里出现的频率不如在“假新闻”中出现的频率高,并不一定意味着包含这个词的文章就一定是虚假的,这只能表示该词在假新闻里更常见。
事实上,这些新闻报道的选取非常具有主观性。模型使用的“真新闻”数据是我选的,“假新闻”是由Daniel Sieradski组建的“BS Detector”选的。所以在决定这些新闻报道的真假方面已经有很强的主观性了。政客名字之所以能进入“最真词”排行榜,是因为“真新闻”数据库中的文章大多都是政治新闻报道,而且这些新闻报道的确是相对可靠的新闻来源。
总之,尽管一个标准的Naive Bayes文本分类模型的确能够为解决社交媒体发布不实消息的问题提供一些思路,但是从专业的角度看,还是应该采用一个更强大的深度学习工具来抗击假新闻和不实的言论。
分辨真假新闻给数据科学界带来了一个全新的挑战。在大多数机器学习任务中,各个类别的区分界限都是很明确的,但在这个案例中,真假新闻的界限非常模糊。这个案例再次证明了数据科学界的一个概念——有时候,对数据的敏感度和熟悉度甚至比模型和工具还重要。