岳文應
(浙江理工大學 信息學院, 杭州 310018)
在高度網(wǎng)絡化的社會中, 對直播系統(tǒng)中的聊天內容進行過濾攔截有著十分重要的意義, 因為垃圾聊天及廣告內容一方面污染網(wǎng)絡環(huán)境, 另一方面對主播及觀眾會造成很大的困擾, 極大的影響客戶的體驗. 甚至一些垃圾聊天內容會傳播色情、反動等各式各樣的有害信息, 給社會帶來危害.
聊天內容過濾問題可以看為文本的二分類問題,即將用戶的聊天內容分類為0或1(其中1表示需要攔截的垃圾或廣告聊天內容, 0表示正常的不需要攔截的內容). 類似于垃圾郵件的過濾問題. 目前常用的垃圾信息過濾方法主要包括三類:
(1) 黑白名單過濾法: 比如基于IP地址的垃圾信息過濾, 即只攔截黑名單中用戶發(fā)的信息. 但是這種方法有兩大缺陷: 一這種方法需要手工維護黑名單, 而且在實際中發(fā)送垃圾信息的用戶可以采用動態(tài)變化的地址; 更嚴重的是, 這種方法具有一次拒絕性, 即一旦用戶發(fā)過被攔截信息, 則該用戶就會被加入攔截黑名單中, 以后的信息都會被攔截. 所以, 在實際中會造成極高的誤攔率.
(2) 基于關鍵詞規(guī)則的過濾[1]: 根據(jù)歷史或專家經(jīng)驗, 定義一些能反映需攔截聊天內容的關鍵詞或短語,比如: “免費”, “加 QQ”, “進微信群”等. 當聊天內容匹配到若干條關鍵詞或短語時就會被判定為垃圾郵件.但是這種方法具有很大的局限性, 只能攔截固定的形式內容的垃圾聊天內容, 不具備靈活性, 不能智能判斷.
(3) 基于機器學習的方法, 首先從訓練樣本中學習得到分類模型, 然后再利用分類模型對未知樣本進行分類,目前主要的模型有樸素貝葉斯分類器[2–7]、SVM分類器、隨機森林等. 樸素貝葉斯算法是一種簡單而高效的基于概率統(tǒng)計的分類算法, 能夠適用于垃圾信息分類. 文獻[3]提出使用樸素貝葉斯算法對郵件進行分類過濾, 文獻[4]在基于貝葉斯算法的基礎上建立一個用于郵件過濾的機器學習應用系統(tǒng)ifle, 這種方法分類的速度很快, 并且可以對其進行動態(tài)調整, 但是錯誤率較高. 文獻[5]提出了基于最小風險的貝葉斯過濾方法, 它做決策時不僅考慮了后驗概率的大小, 也把是否損失最小作為決策依據(jù)來考慮, 雖然對分類的查全率有所提高, 但是召回率卻有所下降. 但是樸素貝葉斯貝葉斯方法對各個屬性的獨立性要求很高, 而在實際中很難滿足. 此外樸素貝葉斯的維數(shù)一般很高, 對內存的需求很大.
從以上方法看出, 目前聊天內容的過濾方法中基于機器學習的方法精確度比其他模型高, 且靈活度很強, 但是現(xiàn)有的機器學習方法的效率不高, 準確率需要提升, 而且大多數(shù)機器學習方法在文本分類任務上對文本的表示都是使用基于詞頻或者one-hot分布式表示方法, 這種方法的方法忽略了文本的具體內容及文本中各個詞之間的上下文關系, 導致每個文本的表示維度非常大, 處理效率低且誤判率很高. 為了客服以上問題, 在基于SVM模型的基礎上, 本文使用了一種Doc2Vec與SVM結合的方法對聊天內容進行分類, 即首先使用Doc2Vec模型將聊天內容轉化成密集數(shù)值向量表示, 然后使用SVM對轉化后的向量進行訓練分類, 最后對測試數(shù)據(jù)進行預測分類. 實驗表明, 這種方法能有效提高分類結果且具有很好的泛化性能.
本文的結構如下: 第2節(jié)介紹了本文模型的整體框架流程, 第3節(jié)介紹了doc2vec模型和SVM模型,第4節(jié)介紹了實驗過程并對實驗結果進行了分析比較,第5節(jié)對整篇文章做了總結.
本文的模型的框架圖1所示.
圖1 模型的總體框架
即首先對于數(shù)據(jù)集進行劃分得到訓練集和測試集,訓練集用來訓練模型, 測試集用來評估模型, 然后分別對訓練集和測試集進行中文分詞, 去掉停用詞、低頻詞將聊天內容轉換成詞組的形式, 然后應用Doc2Vec模型將聊天內容的詞組形式轉換成密集向量表示. 最后使用訓練集的數(shù)據(jù)訓練SVM分類模型, 并使用SVM模型對測試樣本進行分類, 評估模型效果.
Doc2Vec 也稱 Word Embeddings, 是 Quoc Le 和Tomas Mikolov[8]提出的一種處理可變長度文本的總結性方法, 是一種將句子向量轉換成密集向量表示的無監(jiān)督學習方法[9]. 不同于傳統(tǒng)的稀疏式表示方法, 該模型是一種高效的算法模型, 它能將文本或句子表征成密集實值向量, 即通過深度學習的方法將每個文本或句子映射成K維向量(K為模型的超參數(shù), 可以通過交叉驗證調整), 因此文本或句子之間的運算就可以轉化為K維向量空間中的向量運算, 而向量空間上的相似度可以用來表示文本語義上的相似.
Doc2Vec試圖在給定上下文和段落向量的情況下預測單詞的概率. 為了訓練出句子的向量表示, 在句子的訓練過程中, 句子的id保持不變, 共享同一個句子向量. Doc2Vec模型可以在對語言模型進行建模的同時獲得單詞和句子在向量空間上的表示. 這種方法與基于one-hot的表示方法相比, 充分地利用詞的上下文內容, 句子的語義信息更加豐富, 能更有效地提高分類精度.
其中主要的思想就是利用一個包含輸入層-隱層-輸出層三層的分類神經(jīng)網(wǎng)絡對句子進行建模, 即利用句子中詞的上下文信息去預測該詞, 常用的方法為Continuous Bag of Words, 簡稱為 CBOW.
CBOW的目標為根據(jù)上下文來預測當前詞語的概率, 并利用神經(jīng)網(wǎng)絡作為分類算法, 初始時, 為每一個單詞和句子隨機生成一個N維向量, 經(jīng)過訓練之后可以獲得每個詞及句子的最優(yōu)向量.
首先取一個合適的語境窗口, 輸入層讀入窗口內的詞, 將它們的向量加和在一起, 作為隱藏層的輸出傳給輸出層. 輸出層是一個巨大的二叉樹, 其中葉節(jié)點代表語料庫中所有的詞. 而這整棵二叉樹構建的算法就是Huffman樹.
具體模型如圖2所示, 該模型的語境窗口為5, 表示對于句子中的任意一個詞, 使用該詞周圍的4個詞及該詞所在句子的id去預測該詞. 其中分別表示當前詞的前面第二個詞、前面第一個詞、后面的第一個詞和后面的第二個詞. 相應的V表示對應詞的向量表示. SV表示當前句子的向量表示, 其維數(shù)與詞向量的維數(shù)一致. 隱層是一個累加層, 其節(jié)點數(shù)與詞向量的維度相同, 將輸入層的向量累加起來作為隱藏層的輸出, 最后一層是一個softmax層, 在一個句子的訓練過程中, 句子的向量SV保持不變, 相當于每次在預測單詞的概率時, 都利用了整個句子的語義.
在預測階段, 給待預測的每個句子分配一個不同的id, 詞向量和輸出層的softmax的參數(shù)保持訓練階段得到的參數(shù)不變, 重新利用梯度下降訓練待預測的句子. 訓練完之后即可以得到帶預測句子的句子向量.
圖2 CBOW 模型
在本文中, 我們選擇的語境窗口為3, 即選擇前后相鄰的詞及句子向量來預測該詞, 詞和句子的維度選擇為200, 然后將這三個的向量(初始為隨機的200維向量)加和在一起, 隱藏層有200個節(jié)點, 與輸入層全連接, 輸出層為一個巨大的二叉樹(Huffman樹), 葉子節(jié)點代表語料中所有的詞, 根據(jù)Huffman樹可以得到每個詞的二進制編碼. 隱層的每一個節(jié)點都會跟二叉樹的內節(jié)點有連接邊. CBOW的輸出值就是預測二進制編號的每一位, 目標函數(shù)是使得預測的二進制編碼概率最大. 在訓練的過程中, 與一般的神經(jīng)網(wǎng)絡的訓練不同, 該網(wǎng)絡中輸入層的三個向量也為需要更新的參數(shù), 在模型的訓練過程中一起更新直到收斂, 因此在訓練完成后, 即可以得到每個句子和每個詞的密集向量表示.
支持向量機[9–11](Support Vector Machine, SVM)是在20世紀 90 年代以來發(fā)展起來的一種統(tǒng)計學習方法,在解決小樣本學習、非線性及高維模式識別問題中表現(xiàn)較好. SVM主要采用結構風險最小化原則來訓練學習并使用VC維理論來度量結構風險.
給定訓練樣本集:
但是在實際問題中, 原始的樣本空間可能是非線性的. 所以需要引進非線性映射函數(shù)將輸入空間中的樣本映射到高維特征空間中, 使得映射后的高維特征空間中的樣本線性可分, 然后再在高維特征空間構造線性最優(yōu)超平面. 由于高維空間中的內積運算極為耗時, SVM引入了核函數(shù)來代替高維空間中的內積運算. 本文選擇高斯函數(shù)作為 SVM的核函數(shù), 其高斯核函數(shù)形式為:
由于SVM具有良好的泛化性能, 且通過核函數(shù)可以處理低維線性不可分的情況, 避開高維空間的復雜性,直接用內積函數(shù), 很適合對聊天文本進行分類, 所以本文選擇SVM作為后續(xù)的聊天內容分類器. 由CBOW模型可以得到每個句子的密集向量表示, 維度為200, 將句子向量與其相應的標簽相結合得到SVM的訓練數(shù)據(jù), 然后訓練SVM模型.
本文的所有的數(shù)據(jù)都來自于真實的聊天記錄, 在數(shù)據(jù)預處理階段, 由于數(shù)字對聊天內容具有很強的干擾性, 但是去掉所有數(shù)字對結果可能造成影響, 因此本文采用折中的辦法, 使用數(shù)字替換的方法, 將聊天內容中連續(xù)出現(xiàn)的數(shù)字統(tǒng)一都用其字符長度代替, 比如將“電話 128324”替換為“電話6”, 一方面可以有效減少詞表中詞的數(shù)量, 另一方面又能充分利用數(shù)字信息. 然后去掉聊天內容中的一些特殊符號, 作為數(shù)據(jù)的初步處理.
初步處理之后, 本文使用python中的jieba分詞對處理后的聊天內容進行分詞處理, 得到每個聊天內容的詞組表示, 接下來使用停用詞表去掉詞組中的停用詞, 本文使用的停用詞表是由哈工大停用詞表、四川大學機器智能實驗室停用詞庫、百度停用詞表等組合而成的, 共包含2792個停用詞. 對于處理完之后為空的聊天內容, 則將該條內容刪除, 將該條內容視為正常聊天內容處理. 對于新的預測樣本, 如果經(jīng)過同樣的處理之后其內容為空, 則直接將該樣本分類為正常的聊天內容而不需要進行后續(xù)的模型預測.
對于數(shù)據(jù)預處理后的數(shù)據(jù), 使用Doc2Vec模型進行訓練, 可以得到每條聊天內容的數(shù)值向量表示及其標簽. 由于聊天系統(tǒng)中的語句一般都較短, 所以本文使用的Doc2Vec的語境窗口為3, 選擇的詞向量及句子向量的空間維度為200, 即對于第i條聊天內容, 通過Doc2Vec模型之后可以得到一個201維的數(shù)值向量,其中前200維表示的是該條聊天內容的數(shù)值向量表示記為最后一維表示的是該條句子對應的標簽其中的取值為0或1, 表示該條聊天內容是否應該被攔截. 令 X表示所有樣本的向量集合, 即其中m表示數(shù)據(jù)集樣本的總數(shù)量,表示每個樣本對應的標簽.
接下來對聊天內容進行分類, 即對數(shù)據(jù)X,Y進行訓練得到分類模型. 本文使用基于高斯核的SVM模型進行分類, 為了測試模型的效果, 本文將數(shù)據(jù)集劃分為訓練集和驗證集, 訓練集用來訓練SVM模型, 驗證集用來測評模型的效果. 為了充分利用訓練樣本的信息,本文使用70%的數(shù)據(jù)作為訓練集, 30%的數(shù)據(jù)作為驗證集, 由于本文數(shù)據(jù)樣本不平衡, 正負樣本的比例接近7:3, 所以本文采用分層抽樣的方法生成訓練集和測試集, 即在正樣本中隨機抽樣70%的樣本, 在負樣本中隨機抽樣30%的樣本作為訓練樣本集, 剩下的樣本作為測試樣本集.
整個數(shù)據(jù)集共有218 356條數(shù)據(jù), 其中正反樣例的分布如表1所示.
表1 數(shù)據(jù)集中正負樣本分布
本文中反例表示需要攔截的聊天信息, 正例表示不需要攔截的正常信息. 最終選擇的訓練樣本集和測試樣本集中數(shù)據(jù)的分布如表2所示.
表2 訓練集及測試集樣本分布
測試集 56 136 9371
為了評價模型的好壞, 需要使用評估函數(shù)[13–16].評估函數(shù)是用來評價模型性能的函數(shù), 表示模型預測結果與真實數(shù)據(jù)結果之間的差別, 差別越小表示模型的性能越好, 所以評估函數(shù)可以用來比較多個模型之間的性能. 在介紹測評函數(shù)之前先介紹混淆矩陣, 對于分類模型, 其分類結果的混淆矩陣如表3所示.
表3 混淆矩陣
即TP表示真實樣例為正例模型預測結果為正例的樣例數(shù),FN表示真實樣例為正例模型預測為反例的樣例數(shù),FP表示真實樣例為反例模型預測結果為正例的樣例數(shù),TN表示真實樣例為反例模型預測結果為反例的樣例數(shù).
由于本文樣本分布不平衡, 且誤分類帶來的損失也不一樣, 因為在聊天內容攔截中, 將正常的聊天內容誤分類為需攔截的內容造成的損失比將需要攔截的內容誤判為正常的內容大. 所以本文選擇F1指標作為度量模型精確度的標準,F1度量的計算公式如下:
由于本文主要關注的是反例, 即需要被攔截的信息, 所以用P表示反例的查準率即被模型預測為反例的所有樣例中真實反例的比例,R表示查全率, 即反例被成功預測為反例的比例, 具體P和R的計算公式如下:
本文得模型得到的結果的混淆矩陣如表4所示.
表4 模型預測結果混淆矩陣
由表4可以得出表5所示的各種評價指標, 由表5可以得到該模型的預測準確率為97%, 查準率為89.27%表示模型預測為反例的樣本中真正反例所占的比例為89.27%, 查全率為89.82%表示真是的反例中被模型預測出來的比例為89.82%. 為了比較模型的結果, 可對于相同的數(shù)據(jù)集我們分別使用了樸素貝葉斯方法及基于Doc2Vec的logistic模型, 其中樸素貝葉斯方法是基于文本的one-hot表示, 即將每個聊天記錄表示一個維度為詞典長度的向量, 向量的取值為0或1, 其中0表示該聊天記錄包含了相應的詞, 1表示該聊天記錄沒有包含相應的詞, 然后通過TF-IDF方法進行降維, 選取具TF-IDF值高的詞作為最終的變量, 最終選擇的變量有5321個. 三個模型的最終結果如表6所示.
表5 模型評價指標 (單位: %)
表6 各模型的實驗結果對比
由表6可以看出, 本文的Doc2vec SVM模型與Doc2Vec Logistic、樸素貝葉斯相比具有更高的準確率、查準率、查全率及F1值.而且維度只有201維,遠遠小于樸素貝葉斯的5322維. 雖然樸素貝葉斯的準確率為96.17%, 查準率為92.56%, 但是其查全率只有80.35%, 即樸素貝葉斯傾向于將樣本預測為正樣本.Logistic由于模型過于簡單, 導致欠擬合, 所以各項指標都較低. 因此, 可以得出結論本文的Doc2Vec SVM模型在提高了分類精度的同時有效的減小了數(shù)據(jù)維度, 提高了分類的效率, 此外還可以通過訓練得到每個詞的向量表示.
本篇文章使用了基于Doc2Vec與SVM的方法,對用戶的聊內容進行分類, 首先使用Doc2Vec對聊天內容進行處理, 將聊天內容表示為數(shù)值向量, 然后再使用SVM進行分類. 實驗表明, 這種方法能有效的提高分類精度, 能有效的識別垃圾聊天內容或廣告, 從而大大提高了聊天內容攔截過濾的效率.