疫情當前,咱們聊聊謠言的自動化鑑別「附代碼和資料」

1.前言

2020年真的太難了!(來自一個已經被迫在家隔離了29天的農村娃的無力吐槽)git

2020年對於我來講本來也會是一個難忘的一年,新年女友第一次來我家,6月份碩士生涯結束,正式步入996的美好生活!沒曾想2020年會如此多事,突如其來的疫情(2019-nCoV),也將我本來的計劃完全打亂。惟一讓我感到好受一點的可能就是可貴在家陪父母這麼長時間了吧。github

2.研究目的及意義

此次疫情讓我感覺最深的,除了隔離在家的煩悶和不便,那就是隨着疫情漫天飛舞的謠言。算法

平時的生活中咱們也會常常看到、聽到各類各樣的虛假信息,甚至謠言。可能由於疫情的緣由,相關的謠言和虛假信息格外的多,朋友圈、微信羣常常可以看到。說實話,有些謠言根據經驗大致能夠看出真假,可是有不少謠言是真的很難分辨,今天才信覺得真,明天就有人出來闢謠,偶爾還會再來一次反闢謠,讓人很是煩惱。數據庫

正是謠言的滋擾讓我萌生了用模型來自動分辨謠言的想法。後文中,咱們將謠言、虛假新聞等統稱爲虛假信息。微信

3.研究背景

在實驗以前,我作了些簡單的調研,發現虛假信息自動化鑑別的研究由來已久。網絡

3.1 爲何虛假信息如此盛行

虛假信息的產生,絕大多數是出於利益角度的考量,這裏的利益除了金錢之外,也多是政治上的利益。例如經過編造虛假信息來引發關注,從而獲取廣告收入,或者讓本身的產品變得暢銷。政治上,爲了達到操縱和宣傳的目的,有時候也會故意編造一些虛假信息。學習

大量虛假信息的產生和傳播對於社會、經濟的發展很是不利,對於咱們我的來講也是一件使人厭煩的事。測試

3.2 虛假信息自動化鑑別的難點及研究方向

難點1:一些虛假信息隱藏的較好,會利用一些真的信息來增長迷惑性,有時甚至會藉助一些權威人士或機構來提高信息的可信度。google

難點2:虛假信息的判別缺少及時、權威的數據。不少虛假信息都是針對當前的實事,例如這次疫情。對於一些缺少相關經驗的人來講,很難辨識真假。而缺少相應的數據庫,也很難由模型自動化鑑別。編碼

虛假信息自動化鑑別是一個典型的文本分類問題,咱們能夠直接使用一些文本分類的算法或模型,可是其效果也因數據、場景而不一樣。

除了直接針對虛假信息的文本內容下手,一些研究者將方向拓展到對虛假信息製造者的用戶特徵、發文特徵以及平臺特徵的研究。

虛假信息鑑別是天然語言處理領域的熱門研究方向之一,而且依然面臨着諸多的困難和挑戰。

3.3 相關論文和數據集

在撰寫本文的過程當中,本人蒐集整理了一些相關的論文和數據集,與本文配套的代碼、數據以及訓練好的模型打包在了一塊兒。獲取方式在文章末尾。

4.實驗:嘗試用Bert對疫情謠言進行分類

4.1 數據集

實驗中使用了兩部分數據,一部分是從騰訊的較真平臺爬取的疫情闢謠數據,另外一部分是從biendata平臺獲取的比賽數據。


圖4.1 騰訊較真平臺

騰訊較真提供了疫情期間的闢謠數據,目前其數據量較少(在爬取時只有310條),此外也沒有找到其它更好的疫情謠言數據的來源。這部分數據爬取的代碼也已打包在了一塊兒。

biendata平臺獲取的比賽數據是微博數據,有38000多條,可是數據質量較爲通常,而且有少許重複。示例數據以下(標籤爲0的是真實信息數據,標籤爲1的是虛假信息數據):


圖4.2 biendata平臺提供的微博數據示例

4.2 模型

這部分簡單介紹一下咱們所使用的BERT模型。

4.2.1 BERT的網絡結構

BERT(Bidirectional Encoder Representations from Transformers)是Google在2018年發表的論文「Bert: Pre-training of deep bidirectional transformers for language understanding」中提出的。

BERT吸收了Transformer模型的一些經驗,Transformer是Google的機器翻譯團隊在2017年提出的一種模型,該模型拋棄了傳統的卷積、循環神經網絡結構,而僅以Attention機制解決機器翻譯任務,而且取得了很好的效果。Transformer的模型結構下:

圖4.3 Transformer模型結構圖

Transformer由編碼器(Encoder)和解碼器(Decoder)兩部分組成,對應上圖左右兩部分。Transformer的Encoder部分由多個上圖左側所示的塊(Block)堆疊而成。

BERT的結構以下所示:

圖4.4 BERT模型結構圖

BERT將網絡結構中的每個神經元用前面介紹的Transformer的編碼塊取代,而且是一個雙向的網絡結構。

4.2.2 BERT的輸入

BERT的輸入由三種Embedding疊加而成,以下圖所示,分別是「Token Embeddings」、「Segment Embeddings」和「Position Embeddings」。


圖4.5 BERT模型的輸入示意圖

輸入BERT的能夠是單個句子(例如當下遊任務是文本分類時),也能夠是一對句子(例如當下遊任務是QA時)。如上圖所示,當輸入的是一對句子時,句子之間會添加一個[SEP]標記。

構成BERT輸入的三個Embedding中,「Token Embeddings」是輸入文本中每一個詞的詞向量。「Segment Embeddings」是句子的編碼向量,該句向量會疊加到句子中每個詞的詞向量上。「Position Embeddings」是句子中每一個詞在該句子中位置信息的編碼向量,一樣也會疊加到每一個詞向量上。

4.2.3 BERT的訓練方式

BERT的訓練包括兩個部分:Masked Language Model和Next Sentence Prediction。

Masked Language Model部分的訓練,會隨機掩蓋一些Token,而後經過上下文來預測這個Token。該方法與用CBOW來訓練Word2Vec類似,主要的不一樣是前者是雙向的,而且使用了Transformer中的結構來提取特徵。

Next Sentence Prediction部分的訓練是爲了學習句子間的先後關係,即判斷句子B是不是句子A的下一句。該部分的考量主要是基於QA等下游任務。

4.2.4 基於BERT的下游任務

基於預訓練的BERT模型,咱們能夠用來實現諸如文本分類、QA、序列標註(例如分詞、實體識別等)等任務。

4.3 實驗過程和結果

Google官方提供了BERT模型的TensorFlow實現(https://github.com/google-res...),本實驗部分也是基於官方的代碼。本實驗的代碼結構以下:

bert_master:Google官方提供的代碼
bert_model_zh_cn:官方提供的基於中文的預訓練好的BERT模型
data:實驗使用的數據
get_data:爬取騰訊較真平臺數據的代碼
output:預測階段的輸出存放在此
saved_model:保存咱們基於本身的數據微調後訓練好的BERT模型(使用疫情數據、含部分微博數據)
saved_model_ori:保存咱們基於本身的數據微調後訓練好的BERT模型(使用微博數據)
calculate_acc.py:基於預測結果計算混淆矩陣和準確率
fake_news_classifier.py:基於BERT實現分類的代碼部分

4.3.1 使用微博數據訓練和驗證模型

首先,咱們使用微博數據來訓練和檢測模型的效果。混淆矩陣和一些評價指標以下:
22

用微博數據訓練和測試的效果看上去還不錯,98%的準確率,其餘指標也沒有大問題。

4.3.2 使用微博數據訓練的模型預測疫情謠言

將微博數據訓練的模型直接拿來預測疫情謠言數據的結果以下:

11

首先,準確率只有28%,咋一看感受尚未直接懵的準確率高。從混淆矩陣來看,致使準確率低的緣由在於大量假信息被預測成了真信息(290條假信息有218條被預測成了真信息)。

分析緣由,多是因爲疫情相關的新聞數據在內容上與微博的數據有很大誤差,特徵上沒有太多的相通之處,直接使用基於微博數據訓練的模型,效果並不佳。

4.3.3 使用疫情謠言數據訓練和驗證模型

最後咱們使用疫情謠言數據直接訓練BERT模型。不過這裏有一個問題,咱們擁有的疫情相關數據太少,而且樣本極不平衡。咱們總共只有310條疫情相關數據,而其中只有20條是真實信息的數據,另外290條是虛假信息。

這裏爲了平衡一些訓練樣本,從微博數據中獲取了120條標註爲真實信息的數據,增長到訓練數據中。

最終效果以下:

因爲數據實在太少,因此測試集只用了30條數據。從準確率來看,雖然有86.66%,可是仔細分析混淆矩陣的話,這個準確率可能會比真實值要偏高。另外,測試集中只有3條真實信息數據,而且全都被預測成了虛假信息。

因爲數據量的不足,該結果只能做爲參考。

總結與展望

1.經過實驗咱們可以看到,直接使用文本分類的模型來自動鑑別虛假信息,是可以取得必定效果的,在微博數據上的實驗必定程度上佐證了這一點。

2.利用文本分類解決虛假信息的自動鑑別有其侷限性。當咱們用微博數據訓練好模型後,再來預測疫情數據,其效果並很差。究其根本緣由是由於咱們的訓練數據沒有覆蓋到疫情相關的數據特徵。所以,數據的規模和數據的全面性是決定模型適用範圍和效果的關鍵。

感興趣的朋友能夠基於本人的實驗繼續探究,不過最好可以先解決數據量不足的問題。歡迎你們一塊兒交流!

數據、代碼和資料獲取

本文實驗部分的代碼已上傳Github:https://github.com/lqhou/NLP_...

相關文章
相關標籤/搜索