虛假新聞文本識別分類


虛假新聞檢測

原文鏈接:https://blog.csdn.net/weixin_51206814/article/details/121688294

一、項目主題

​ 針對媒體出現的虛假新聞和真實新聞進行檢測識別。

動機:在這個社交媒體和互聯網的世界中,我們接觸到各種新聞和文章,但其中一些新聞和文章是假的,是為了好玩或出於惡意而制作的,這對社會是非常有害的。想對媒體產生的新聞進行鑒別,實現對虛假新聞和真實新聞的檢測分類識別,以便用戶對獲取到的新聞進行清晰的認知,排除虛假新聞對用戶的影響。

方法:采用監督學習模式,使用 \(TfidfVectorizer,CountVectorizer,PassiveAggressiveClassifier\) ,貝葉斯分類器對文本進行分類。

數據集datasethttps://download.csdn.net/download/weixin_51206814/54260176

代碼鏈接https://download.csdn.net/download/weixin_51206814/55499702

項目實例:在實驗過程中,參考以下論文實例。

  • [1]許麗,焦博,趙章瑞.基於TF-IDF的加權朴素貝葉斯新聞文本分類算法[J].網絡安全技術與應用,2021(11):31-33.
  • [2]陳翠娟.改進的多項朴素貝葉斯分類算法和Python實現[J].景德鎮學院學報,2021,36(03):92-95.

二、實驗報告

2.1 方法介紹

2.1.1 貝葉斯分類文本

​ 貝葉斯分類算法是一種以統計學為基礎的分類算法。朴素貝葉斯分類算法是對傳統貝葉斯分類算法進行朴素的假設,所謂朴素就是假設數據類別之間彼此獨立,互不產生任何影響。首先要計算屬於某一 類的先驗概率,然后再利用貝葉斯定理計算其屬於此類的后驗概率,對各類后驗概率的大小進行比較就可進行分類。貝葉斯公式也稱為貝葉斯法則,它是關於隨機事件\(A\)\(B\) 的條件概率和邊緣概率的。任何事件的發生都不是完全偶然的,往往都是以其他事件的發生為基礎的。條件概率研究的就是在事件 \(A\) 發生的基礎上,事件 \(B\) 發生的概率。貝葉斯法則是根據已知先驗概率求后驗概率。后驗概率就是一種條件概率,一般的條件概率是由因求果,后驗概率則是知果求因。

​ 在對新聞文本的表示中,使用一個 \(n\) 維向量的形式在多維空間進行表示,對文本的每個詞賦予一個權重,在本實驗中采用 \(TF-IDF\) 來計算特征詞的權重,下一部分將對這個 \(TF-IDF\) 進行詳細解釋。特征權重就是該詞對應空間向量的一個維度坐標,可以進行如下表示:
​ 新聞文本 \(f_i\) 在向量空間中就可以表示為:

\[V(f_i)=(W_{i1},W_{i2},\cdots,W_{in}) \]

​ 其中,\(f_i\) 是數據集中第 \(i\) 篇新聞文本,\(i=1,2,\cdots,m;n\)\(f_i\) 中含有的特征詞個數, \(W_{ij}\) 是新聞文本 \(f_i\) 中特征詞 \(t_j\) 的特征權重,\(j =1,2,\cdots,n\)

​ 對於文本分類來說,設訓練數據集 \(F =\{f_1,f_2,\cdots,f_m\}\),訓練集數據分為 \(k\) 類,記為 \(C_i,i=1,2,\cdots,k\)。類 \(C_i\) 的先驗概率為 \(P(C_i)\) ,則文本 \(d\) 的后驗概率為:

\[P(C_k|d) = \frac{P(d|C_k)P(C_k)}{P(d)} \]

​ 有朴素貝葉斯算法的獨立性假設:各個特征詞之間是相互獨立。可以得到條件概率:

\[P(d|C_k) =P((W_{i1},W_{i2},\cdots,W_{in})|C_k)=\prod_{i=1}^nP(W_{in}|C_k)\\ 代入上式可得:P(C_k|d)=\frac{P(C_k)\prod_{i=1}^n P(W_{in}|C_k)}{P(d)} \]

​ 由於 \(P(d)\) 是確定不變的,因此在比較后驗概率的時候只需要比較分子部分即可。即:

\[C_k =arg\ \max P(C_k)\prod_{i=1}^nP(W_{in}|C_k) \]

​ 在 \(P(W_{in}|C_k)\) 中,實際可以將其看作是 \(TF-IDF\) 的值,用 \(TF-IDF\) 的值代替概率進行計算。(個人理解)

2.1.2 采用TF-IDF文本特征提取

\(TF\) 指詞頻,表示某個詞在文章中出現的頻次;\(IDF\) 指逆文檔頻率,表示包含該詞的文檔數占語料庫文檔數的比例。

\[詞頻(TF) = 某詞出現在文章中的次數 \\ 逆文檔頻率(IDF) =log(\frac{語料庫文檔總數+1}{包含該詞的文檔數+1})+1\\ TF-IDF = TF \times IDF \]

​ 對於不單獨使用詞頻是由於一些普遍出現的詞,在文章出現的次數一般也越高,那么詞頻就會較高,從詞頻角度分析,看起來似乎是更重要的特征,但因為這個詞普遍出現,這個詞可能不是非常的重要,那么單獨采用詞頻 \((TF)\) 進行向量化特征表示就無法反應這一點。

​ 使用 \(TF-IDF\) 的基本思想:如果某個詞語在某篇文檔中出現的頻率很高,從 \(TF\) 的角度來說就是,\(TF\) 很高,但是在語料庫內的其他文檔中出現的頻率很低,從 \(IDF\) 角度來說,就是 \(IDF\) 高,則認定此詞語在某種程度上可作為該文檔的特征詞,具備類別區分能力,可作為分類的依據。一個字詞的重要性與它在某份文件中出現的次數正相關,字詞在文件中出現的次數越多重要性越大,但同時與它在語料庫中出現的頻率呈負相關,語料庫中出現的次數越多,則該字詞的重要性越小。

​ 在對文本特征提取的過程中,可以采用 \(TfidfVectorizer\) 或者 \(CountVectorizer\) ,兩種方法區別不大,本實驗主要采用\(TfidfVectorizer\) ,下面介紹一下在使用 \(TfidfVectorizer\) 對文本特征進行提取的過程。

  • 使用 \(TfidfVectorizer\) 需要調用機器學習 \(sklearn\) 的庫,下面是調庫語句。

    from sklearn.feature_extraction.text import TfidfVectorizer
    
  • 定義語料庫的語句,為了便於觀察原理過程,語料庫加入了兩個句子。

    corpus=["I come to China to travel",
    "This is a car polupar in China"]
    
  • 定義完語料庫后,調用 \(TfidfVectorizer\) ,出於數據集是英文文本,設置停用詞 "\(english\)",將包含在 \(nltk.corpus\) 的英語停止詞中的單詞進行刪除,這些詞包括介詞、連詞、冠詞、to be 等沒有意義的詞。對語料庫根據 \(TfidfVectorizer\) 參數規則進行操作,比如濾除停用詞等,擬合原始數據,生成文檔中有價值的詞匯表,結合 \(fit\_tranform\) 完成向量化。

    上圖是濾除停用詞后的結果,可以看見將語料庫中的一些冠詞、連詞等刪除,同時對這些詞語按字母序排序,得到一個"vocabulary" ,得到這個后,對語料庫里的句子文本進行處理,結合 \(fit\_tranform\) 對詞語進行向量化。結果如下:

    \((0,4)\) 表示第 \(0\) 個字符串,詞匯表里第 \(4\) 個單詞的 \(TF-IDF\) 值。計算過程為:單詞 \(travel\) 在第 \(0\) 個字符串也就是語料庫的第一個句子中,詞頻為 \(TF=1\) ,逆文檔頻率 \(IDF = log\frac{2+1}{1+1}+1 = log\frac{3}{2}+1=1.40546108\)\(TF-IDF=TF\times IDF=1\times 1.40546 = 1.40546108\)。其他單詞同理。
    結合 \(toarray()\) 轉成數據矩陣形式進行顯示,這個矩陣是一個稀疏矩陣,如圖,\((0,0)\)位置的值為 \(0\) ,解釋為第 \(0\) 個字符串,詞匯表里第 \(0\) 個單詞,也就是 \(car\),實際中根本沒有在語料庫第一句中出現,因此值為 \(0\)。由於當文本量龐大的時候,矩陣將會變得十分巨大,不利於顯示,因此后續不做輸出。

    下面是實現上述過程的示例代碼。

    tv_fit = tv.fit_transform(corpus)
    tv.get_feature_names_out()#生成提取的文本濾除停用詞后的單詞
    print("tv.get_feature_names_out")
    print(tv.get_feature_names_out())#將單詞輸出
    # print("tv.vocabulary")
    dict = tv.vocabulary_#生成詞匯表
    print(dict)#輸出詞匯表
    print("tv_fit")
    print(tv_fit)#輸出向量化后的結果
    re = tv_fit.toarray()
    print(re)#輸出轉矩陣后的結果
    

2.1.3 PassiveAggressiveClassifier 分類模型

\(Passive\ Aggressive\),是經典的 \(online\) 線性分類器,它可以不斷的整合新樣本去調整分類模型,增強模型的分類能力。這樣的模型在處理數據量龐大的數據集時,能夠解決對數據讀取時占用大量內存,使內存受限的情況,避免內存占用過大,解決內存問題。

\(Passive\ Aggressive\ Classifier\) 的具體實現和參考算法。

算法偽代碼:

\(Input: aggressiveness\ parameter\ C > 0\)
\(Initialize: W = (0,0,\cdots ,0)\)
$For \ t =1,2,\cdots $

  • \(recive \ instance : X_t \in R\)

  • \(predict\ correct \ label :y_t\in\{-1,+1\}\)

  • \(suffer \ loss : \ell_t=\max\{0,1-y_t(W_t\cdot X_t)\}\)

  • $update \ $

    • $1. \ set $

      \[\tau_t = \frac{\ell_t}{||X_t||^2} \\ \tau_t = \min\{C,\frac{\ell_t}{||X_t||^2}\} \\ \tau_t = \frac{\ell_t}{||X_t||^2+\frac{1}{2C}} \]

    • \(2.\ update\)

      \[W_{t+1} = W_t+\tau_t y_t X_t \]

2.2 實驗設計

2.2.1 數據處理

​ 對數據集進行讀取,並且對數據集的列表數和個數進行統計,輸出數據集中的前五行數據進行展示。

​ 觀察數據可以看見,有 \(4\) 列數據共 \(6335\) 條,標簽 \(label\) 分為 "\(FAKE\)" 和 "\(REAL\)" 兩類,獲取標簽。然后對數據集進行分割,分割為訓練集和測試集,采用對 "\(text\)" 和 "\(label\)" 列數據進行分割,分割的測試集大小為 \(0.2\)\(random\_state\) 是隨機數種子,設置的數字相同能保證每次拆分的數據集是一樣的。

x_train,x_test,y_train,y_test=train_test_split(df['text'], labels, test_size=0.2, random_state=12)

​ 對數據集進行分類后,對 "\(title\)" 內容進行文本特征提取,采取 \(TfidfVectorizer\) 或者 \(CountVectorizer\) 建立特征權重。擬合和變換訓練集,變換測試集,建立數據特征矩陣。使用"\(fit\_transform\)" 加載數據並將數據轉化為數據矩陣形式。

# TfidfVectorizer 形式
# tfidf_vectorizer = TfidfVectorizer(analyzer = 'word',stop_words = 'english',norm = None)
# CountVectorizer 形式
tfidf_vectorizer =  CountVectorizer()
tfidf_train=tfidf_vectorizer.fit_transform(x_train) 
tfidf_test=tfidf_vectorizer.transform(x_test)




​ 上圖為生成的詞匯表和特征向量化、矩陣的結果。

2.2.2 調用模型

​ 了解到有兩種模型可供使用對於新聞文本分類,兩種分類模型都能避免內存爆炸的情況出現,兩種模型都能不斷的整合新數據調整分類模型,能達到提高分類能力的結果。

2.2.2.1 PassiveAggressiveClassifier 分類模型

​ 調用機器學習 "\(sklearn\)" 里的 "\(linear\_model\)" 里的 "\(PassiveAggressiveClassifier\)" 分類模型,設置參數 \(max\_iter\) ,可以調整迭代次數觀察對於最后准確率的影響(迭代次數設置越大,分類准確率越大)。

#max_iter 迭代次數越大,分類准確率就越大
pac = PassiveAggressiveClassifier(max_iter=50)
2.2.2.2 貝葉斯分類模型對文本進行分類

​ 貝葉斯分類模型分為三種,\(GaussianNB\) 就是先驗為高斯分布的朴素貝葉斯,\(MultinomialNB\) 就是先驗為多項式分布的朴素貝葉斯,\(BernoulliNB\) 就是先驗為伯努利分布的朴素貝葉斯。

  • \(GaussianNB\) 貝葉斯

    • pac = GaussianNB()
      #由於TF-IDF得到的是稀疏矩陣,使用todense變得密集
      tfidf_train = tfidf_train.todense()
      tfidf_test = tfidf_test.todense()
      
  • \(MultinomialNB\) 貝葉斯

    • pac = MultinomialNB()
      
  • \(BernoulliNB\) 貝葉斯

    • pac = BernoulliNB()
      

​ 這是貝葉斯三種模型的調用代碼,分別調用完模型后,進行模型訓練。

pac.fit(tfidf_train,y_train)
2.2.2.3 使用模型進行預測

​ 在調用模型對訓練集進行訓練過后,需要對測試集進行預測,然后將實際結果與預測結果進行對比。

y_pred=pac.predict(tfidf_test)#預測測試集
#print(y_pred)
#print(y_test)

​ 在數據量小的時候,可以將測試集的實際結果與預測結果進行輸出觀察預測情況對比。

​ 完成預測后,比較測試集實際結果,計算正確率和混淆矩陣並對結果進行分析。

2.3 結果與分析

2.3.1 准確率對比

  • \(PassiveAggressiveClassifier\) 分類模型

    采用 \(TfidfVectorizer\)​ 的情況,調整 \(test\_size\)\(random\_state\)\(max\_iter\) 三個參數比較最后分類正確率。

    \(number\) \(test\_size\) \(random\_state\) \(max\_iter\) \(accuracy\)
    1 0.2 7 50 91.32%
    2 0.3 7 50 90.22%
    3 0.4 7 50 89.94%
    4 0.2 12 50 90.45%
    5 0.2 20 50 92.19%
    6 0.2 30 50 90.84%
    7 0.2 7 100 91.55%
    8 0.2 7 150 91.79%
    9 0.2 7 200 91.63%

    分析上表格可以看出,在訓練集較少的情況下對測試集進行測試,可能會得到不太好的預測結果,另外 \(random\_state\)\(max\_iter\) 兩個參數從上表來看對結果的影響並無太大關系,但從實際分析,迭代次數會影響分類效果。

    繪出准確率與迭代次數之間的折線圖。觀察下圖可以看出迭代次數會影響分類效果。

  • 貝葉斯模型

    • \(GaussianNB\) 貝葉斯

      \(number\) \(test\_size\) \(accuracy\)
      1 0.2 80.98%
      2 0.3 79.22%
      3 0.4 79.95%
    • \(MultinomialNB\) 貝葉斯

      \(number\) \(test\_size\) \(accuracy\)
      1 0.2 90.13%
      2 0.3 89.37%
      3 0.4 88.6%
    • \(BernoulliNB\) 貝葉斯

      \(number\) \(test\_size\) \(accuracy\)
      1 0.2 82.08%
      2 0.3 82.22%
      3 0.4 82.56%

​ 從上述三種模型分類的結果分析,采用 \(MultinomialNB\) 多項式貝葉斯分類的准確率最高,主要跟先驗概率的分布有關系。

​ 通過上述四種模型准確率對比,繪出四種模型准確率柱狀圖,可以清晰看出四種模型的差異。

2.3.2 混淆矩陣

​ 在結果的部分,采用混淆矩陣的形式對模型預測結果進行可視化以及結果呈現。

​ 混淆矩陣(\(confusion\ matrix\)),又稱為可能性表格或是錯誤矩陣。它是一種特定的矩陣用來呈現算法性能的可視化效果,通常是監督學習,其每一列代表預測值,每一行代表的是實際的類別。這個名字來源於它可以非常容易的表明多個類別是否有混淆(也就是一個\(class\) 被預測成另一個 \(class\))。

​ 在預測分析中,混淆表格(有時候也稱為混淆矩陣),是由 \(false \ positives\)\(false\ negatives\)\(true \ positives\)\(true \ negatives\) 組成的兩行兩列的表格。它允許我們做出更多的分析,而不僅僅是局限在正確率。准確率對於分類器的性能分析來說,並不是一個很好地衡量指標,因為如果數據集不平衡(每一類的數據樣本數量相差太大),很可能會出現誤導性的結果。

​ 在二分類的模型中,混淆矩陣把預測情況與實際情況的所有結果進行組合,形成了真正 \((true \ positive)\)、假正 \((false\ positive)\)、真負 \((true \ negative)\) 和假負 \((false\ negative)\) 四種情形,分別由 \(TP、FP、TN、FN\) 表示(\(T\) 代表預測正確,\(F\) 代表預測錯誤)。

  • \(PassiveAggressiveClassifier\) 分類模型的混淆矩陣

  • \(MultinomialNB\)貝葉斯分類模型的混淆矩陣

2.3.3 分析

使用貝葉斯模型的優點:

  • 在於能夠使用較小的空間獲得更好的算法效率,空間開銷小,具有穩定的分類效率,占用比較小的空間內存量,並且對缺失數據不太敏感。

使用貝葉斯模型的缺點:

  • 需要提前知道先驗概率,同時貝葉斯的假設是每個特征屬性是獨立,因此在屬性有關聯時就會使分類效果不好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM