岳文應(yīng)
(浙江理工大學(xué) 信息學(xué)院, 杭州 310018)
在高度網(wǎng)絡(luò)化的社會(huì)中, 對(duì)直播系統(tǒng)中的聊天內(nèi)容進(jìn)行過(guò)濾攔截有著十分重要的意義, 因?yàn)槔奶旒皬V告內(nèi)容一方面污染網(wǎng)絡(luò)環(huán)境, 另一方面對(duì)主播及觀眾會(huì)造成很大的困擾, 極大的影響客戶的體驗(yàn). 甚至一些垃圾聊天內(nèi)容會(huì)傳播色情、反動(dòng)等各式各樣的有害信息, 給社會(huì)帶來(lái)危害.
聊天內(nèi)容過(guò)濾問(wèn)題可以看為文本的二分類問(wèn)題,即將用戶的聊天內(nèi)容分類為0或1(其中1表示需要攔截的垃圾或廣告聊天內(nèi)容, 0表示正常的不需要攔截的內(nèi)容). 類似于垃圾郵件的過(guò)濾問(wèn)題. 目前常用的垃圾信息過(guò)濾方法主要包括三類:
(1) 黑白名單過(guò)濾法: 比如基于IP地址的垃圾信息過(guò)濾, 即只攔截黑名單中用戶發(fā)的信息. 但是這種方法有兩大缺陷: 一這種方法需要手工維護(hù)黑名單, 而且在實(shí)際中發(fā)送垃圾信息的用戶可以采用動(dòng)態(tài)變化的地址; 更嚴(yán)重的是, 這種方法具有一次拒絕性, 即一旦用戶發(fā)過(guò)被攔截信息, 則該用戶就會(huì)被加入攔截黑名單中, 以后的信息都會(huì)被攔截. 所以, 在實(shí)際中會(huì)造成極高的誤攔率.
(2) 基于關(guān)鍵詞規(guī)則的過(guò)濾[1]: 根據(jù)歷史或?qū)<医?jīng)驗(yàn), 定義一些能反映需攔截聊天內(nèi)容的關(guān)鍵詞或短語(yǔ),比如: “免費(fèi)”, “加 QQ”, “進(jìn)微信群”等. 當(dāng)聊天內(nèi)容匹配到若干條關(guān)鍵詞或短語(yǔ)時(shí)就會(huì)被判定為垃圾郵件.但是這種方法具有很大的局限性, 只能攔截固定的形式內(nèi)容的垃圾聊天內(nèi)容, 不具備靈活性, 不能智能判斷.
(3) 基于機(jī)器學(xué)習(xí)的方法, 首先從訓(xùn)練樣本中學(xué)習(xí)得到分類模型, 然后再利用分類模型對(duì)未知樣本進(jìn)行分類,目前主要的模型有樸素貝葉斯分類器[2–7]、SVM分類器、隨機(jī)森林等. 樸素貝葉斯算法是一種簡(jiǎn)單而高效的基于概率統(tǒng)計(jì)的分類算法, 能夠適用于垃圾信息分類. 文獻(xiàn)[3]提出使用樸素貝葉斯算法對(duì)郵件進(jìn)行分類過(guò)濾, 文獻(xiàn)[4]在基于貝葉斯算法的基礎(chǔ)上建立一個(gè)用于郵件過(guò)濾的機(jī)器學(xué)習(xí)應(yīng)用系統(tǒng)ifle, 這種方法分類的速度很快, 并且可以對(duì)其進(jìn)行動(dòng)態(tài)調(diào)整, 但是錯(cuò)誤率較高. 文獻(xiàn)[5]提出了基于最小風(fēng)險(xiǎn)的貝葉斯過(guò)濾方法, 它做決策時(shí)不僅考慮了后驗(yàn)概率的大小, 也把是否損失最小作為決策依據(jù)來(lái)考慮, 雖然對(duì)分類的查全率有所提高, 但是召回率卻有所下降. 但是樸素貝葉斯貝葉斯方法對(duì)各個(gè)屬性的獨(dú)立性要求很高, 而在實(shí)際中很難滿足. 此外樸素貝葉斯的維數(shù)一般很高, 對(duì)內(nèi)存的需求很大.
從以上方法看出, 目前聊天內(nèi)容的過(guò)濾方法中基于機(jī)器學(xué)習(xí)的方法精確度比其他模型高, 且靈活度很強(qiáng), 但是現(xiàn)有的機(jī)器學(xué)習(xí)方法的效率不高, 準(zhǔn)確率需要提升, 而且大多數(shù)機(jī)器學(xué)習(xí)方法在文本分類任務(wù)上對(duì)文本的表示都是使用基于詞頻或者one-hot分布式表示方法, 這種方法的方法忽略了文本的具體內(nèi)容及文本中各個(gè)詞之間的上下文關(guān)系, 導(dǎo)致每個(gè)文本的表示維度非常大, 處理效率低且誤判率很高. 為了客服以上問(wèn)題, 在基于SVM模型的基礎(chǔ)上, 本文使用了一種Doc2Vec與SVM結(jié)合的方法對(duì)聊天內(nèi)容進(jìn)行分類, 即首先使用Doc2Vec模型將聊天內(nèi)容轉(zhuǎn)化成密集數(shù)值向量表示, 然后使用SVM對(duì)轉(zhuǎn)化后的向量進(jìn)行訓(xùn)練分類, 最后對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè)分類. 實(shí)驗(yàn)表明, 這種方法能有效提高分類結(jié)果且具有很好的泛化性能.
本文的結(jié)構(gòu)如下: 第2節(jié)介紹了本文模型的整體框架流程, 第3節(jié)介紹了doc2vec模型和SVM模型,第4節(jié)介紹了實(shí)驗(yàn)過(guò)程并對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行了分析比較,第5節(jié)對(duì)整篇文章做了總結(jié).
本文的模型的框架圖1所示.

圖1 模型的總體框架
即首先對(duì)于數(shù)據(jù)集進(jìn)行劃分得到訓(xùn)練集和測(cè)試集,訓(xùn)練集用來(lái)訓(xùn)練模型, 測(cè)試集用來(lái)評(píng)估模型, 然后分別對(duì)訓(xùn)練集和測(cè)試集進(jìn)行中文分詞, 去掉停用詞、低頻詞將聊天內(nèi)容轉(zhuǎn)換成詞組的形式, 然后應(yīng)用Doc2Vec模型將聊天內(nèi)容的詞組形式轉(zhuǎn)換成密集向量表示. 最后使用訓(xùn)練集的數(shù)據(jù)訓(xùn)練SVM分類模型, 并使用SVM模型對(duì)測(cè)試樣本進(jìn)行分類, 評(píng)估模型效果.
Doc2Vec 也稱 Word Embeddings, 是 Quoc Le 和Tomas Mikolov[8]提出的一種處理可變長(zhǎng)度文本的總結(jié)性方法, 是一種將句子向量轉(zhuǎn)換成密集向量表示的無(wú)監(jiān)督學(xué)習(xí)方法[9]. 不同于傳統(tǒng)的稀疏式表示方法, 該模型是一種高效的算法模型, 它能將文本或句子表征成密集實(shí)值向量, 即通過(guò)深度學(xué)習(xí)的方法將每個(gè)文本或句子映射成K維向量(K為模型的超參數(shù), 可以通過(guò)交叉驗(yàn)證調(diào)整), 因此文本或句子之間的運(yùn)算就可以轉(zhuǎn)化為K維向量空間中的向量運(yùn)算, 而向量空間上的相似度可以用來(lái)表示文本語(yǔ)義上的相似.
Doc2Vec試圖在給定上下文和段落向量的情況下預(yù)測(cè)單詞的概率. 為了訓(xùn)練出句子的向量表示, 在句子的訓(xùn)練過(guò)程中, 句子的id保持不變, 共享同一個(gè)句子向量. Doc2Vec模型可以在對(duì)語(yǔ)言模型進(jìn)行建模的同時(shí)獲得單詞和句子在向量空間上的表示. 這種方法與基于one-hot的表示方法相比, 充分地利用詞的上下文內(nèi)容, 句子的語(yǔ)義信息更加豐富, 能更有效地提高分類精度.
其中主要的思想就是利用一個(gè)包含輸入層-隱層-輸出層三層的分類神經(jīng)網(wǎng)絡(luò)對(duì)句子進(jìn)行建模, 即利用句子中詞的上下文信息去預(yù)測(cè)該詞, 常用的方法為Continuous Bag of Words, 簡(jiǎn)稱為 CBOW.
CBOW的目標(biāo)為根據(jù)上下文來(lái)預(yù)測(cè)當(dāng)前詞語(yǔ)的概率, 并利用神經(jīng)網(wǎng)絡(luò)作為分類算法, 初始時(shí), 為每一個(gè)單詞和句子隨機(jī)生成一個(gè)N維向量, 經(jīng)過(guò)訓(xùn)練之后可以獲得每個(gè)詞及句子的最優(yōu)向量.
首先取一個(gè)合適的語(yǔ)境窗口, 輸入層讀入窗口內(nèi)的詞, 將它們的向量加和在一起, 作為隱藏層的輸出傳給輸出層. 輸出層是一個(gè)巨大的二叉樹, 其中葉節(jié)點(diǎn)代表語(yǔ)料庫(kù)中所有的詞. 而這整棵二叉樹構(gòu)建的算法就是Huffman樹.
具體模型如圖2所示, 該模型的語(yǔ)境窗口為5, 表示對(duì)于句子中的任意一個(gè)詞, 使用該詞周圍的4個(gè)詞及該詞所在句子的id去預(yù)測(cè)該詞. 其中分別表示當(dāng)前詞的前面第二個(gè)詞、前面第一個(gè)詞、后面的第一個(gè)詞和后面的第二個(gè)詞. 相應(yīng)的V表示對(duì)應(yīng)詞的向量表示. SV表示當(dāng)前句子的向量表示, 其維數(shù)與詞向量的維數(shù)一致. 隱層是一個(gè)累加層, 其節(jié)點(diǎn)數(shù)與詞向量的維度相同, 將輸入層的向量累加起來(lái)作為隱藏層的輸出, 最后一層是一個(gè)softmax層, 在一個(gè)句子的訓(xùn)練過(guò)程中, 句子的向量SV保持不變, 相當(dāng)于每次在預(yù)測(cè)單詞的概率時(shí), 都利用了整個(gè)句子的語(yǔ)義.
在預(yù)測(cè)階段, 給待預(yù)測(cè)的每個(gè)句子分配一個(gè)不同的id, 詞向量和輸出層的softmax的參數(shù)保持訓(xùn)練階段得到的參數(shù)不變, 重新利用梯度下降訓(xùn)練待預(yù)測(cè)的句子. 訓(xùn)練完之后即可以得到帶預(yù)測(cè)句子的句子向量.

圖2 CBOW 模型
在本文中, 我們選擇的語(yǔ)境窗口為3, 即選擇前后相鄰的詞及句子向量來(lái)預(yù)測(cè)該詞, 詞和句子的維度選擇為200, 然后將這三個(gè)的向量(初始為隨機(jī)的200維向量)加和在一起, 隱藏層有200個(gè)節(jié)點(diǎn), 與輸入層全連接, 輸出層為一個(gè)巨大的二叉樹(Huffman樹), 葉子節(jié)點(diǎn)代表語(yǔ)料中所有的詞, 根據(jù)Huffman樹可以得到每個(gè)詞的二進(jìn)制編碼. 隱層的每一個(gè)節(jié)點(diǎn)都會(huì)跟二叉樹的內(nèi)節(jié)點(diǎn)有連接邊. CBOW的輸出值就是預(yù)測(cè)二進(jìn)制編號(hào)的每一位, 目標(biāo)函數(shù)是使得預(yù)測(cè)的二進(jìn)制編碼概率最大. 在訓(xùn)練的過(guò)程中, 與一般的神經(jīng)網(wǎng)絡(luò)的訓(xùn)練不同, 該網(wǎng)絡(luò)中輸入層的三個(gè)向量也為需要更新的參數(shù), 在模型的訓(xùn)練過(guò)程中一起更新直到收斂, 因此在訓(xùn)練完成后, 即可以得到每個(gè)句子和每個(gè)詞的密集向量表示.
支持向量機(jī)[9–11](Support Vector Machine, SVM)是在20世紀(jì) 90 年代以來(lái)發(fā)展起來(lái)的一種統(tǒng)計(jì)學(xué)習(xí)方法,在解決小樣本學(xué)習(xí)、非線性及高維模式識(shí)別問(wèn)題中表現(xiàn)較好. SVM主要采用結(jié)構(gòu)風(fēng)險(xiǎn)最小化原則來(lái)訓(xùn)練學(xué)習(xí)并使用VC維理論來(lái)度量結(jié)構(gòu)風(fēng)險(xiǎn).
給定訓(xùn)練樣本集:


但是在實(shí)際問(wèn)題中, 原始的樣本空間可能是非線性的. 所以需要引進(jìn)非線性映射函數(shù)將輸入空間中的樣本映射到高維特征空間中, 使得映射后的高維特征空間中的樣本線性可分, 然后再在高維特征空間構(gòu)造線性最優(yōu)超平面. 由于高維空間中的內(nèi)積運(yùn)算極為耗時(shí), SVM引入了核函數(shù)來(lái)代替高維空間中的內(nèi)積運(yùn)算. 本文選擇高斯函數(shù)作為 SVM的核函數(shù), 其高斯核函數(shù)形式為:

由于SVM具有良好的泛化性能, 且通過(guò)核函數(shù)可以處理低維線性不可分的情況, 避開高維空間的復(fù)雜性,直接用內(nèi)積函數(shù), 很適合對(duì)聊天文本進(jìn)行分類, 所以本文選擇SVM作為后續(xù)的聊天內(nèi)容分類器. 由CBOW模型可以得到每個(gè)句子的密集向量表示, 維度為200, 將句子向量與其相應(yīng)的標(biāo)簽相結(jié)合得到SVM的訓(xùn)練數(shù)據(jù), 然后訓(xùn)練SVM模型.
本文的所有的數(shù)據(jù)都來(lái)自于真實(shí)的聊天記錄, 在數(shù)據(jù)預(yù)處理階段, 由于數(shù)字對(duì)聊天內(nèi)容具有很強(qiáng)的干擾性, 但是去掉所有數(shù)字對(duì)結(jié)果可能造成影響, 因此本文采用折中的辦法, 使用數(shù)字替換的方法, 將聊天內(nèi)容中連續(xù)出現(xiàn)的數(shù)字統(tǒng)一都用其字符長(zhǎng)度代替, 比如將“電話 128324”替換為“電話6”, 一方面可以有效減少詞表中詞的數(shù)量, 另一方面又能充分利用數(shù)字信息. 然后去掉聊天內(nèi)容中的一些特殊符號(hào), 作為數(shù)據(jù)的初步處理.
初步處理之后, 本文使用python中的jieba分詞對(duì)處理后的聊天內(nèi)容進(jìn)行分詞處理, 得到每個(gè)聊天內(nèi)容的詞組表示, 接下來(lái)使用停用詞表去掉詞組中的停用詞, 本文使用的停用詞表是由哈工大停用詞表、四川大學(xué)機(jī)器智能實(shí)驗(yàn)室停用詞庫(kù)、百度停用詞表等組合而成的, 共包含2792個(gè)停用詞. 對(duì)于處理完之后為空的聊天內(nèi)容, 則將該條內(nèi)容刪除, 將該條內(nèi)容視為正常聊天內(nèi)容處理. 對(duì)于新的預(yù)測(cè)樣本, 如果經(jīng)過(guò)同樣的處理之后其內(nèi)容為空, 則直接將該樣本分類為正常的聊天內(nèi)容而不需要進(jìn)行后續(xù)的模型預(yù)測(cè).
對(duì)于數(shù)據(jù)預(yù)處理后的數(shù)據(jù), 使用Doc2Vec模型進(jìn)行訓(xùn)練, 可以得到每條聊天內(nèi)容的數(shù)值向量表示及其標(biāo)簽. 由于聊天系統(tǒng)中的語(yǔ)句一般都較短, 所以本文使用的Doc2Vec的語(yǔ)境窗口為3, 選擇的詞向量及句子向量的空間維度為200, 即對(duì)于第i條聊天內(nèi)容, 通過(guò)Doc2Vec模型之后可以得到一個(gè)201維的數(shù)值向量,其中前200維表示的是該條聊天內(nèi)容的數(shù)值向量表示記為最后一維表示的是該條句子對(duì)應(yīng)的標(biāo)簽其中的取值為0或1, 表示該條聊天內(nèi)容是否應(yīng)該被攔截. 令 X表示所有樣本的向量集合, 即其中m表示數(shù)據(jù)集樣本的總數(shù)量,表示每個(gè)樣本對(duì)應(yīng)的標(biāo)簽.
接下來(lái)對(duì)聊天內(nèi)容進(jìn)行分類, 即對(duì)數(shù)據(jù)X,Y進(jìn)行訓(xùn)練得到分類模型. 本文使用基于高斯核的SVM模型進(jìn)行分類, 為了測(cè)試模型的效果, 本文將數(shù)據(jù)集劃分為訓(xùn)練集和驗(yàn)證集, 訓(xùn)練集用來(lái)訓(xùn)練SVM模型, 驗(yàn)證集用來(lái)測(cè)評(píng)模型的效果. 為了充分利用訓(xùn)練樣本的信息,本文使用70%的數(shù)據(jù)作為訓(xùn)練集, 30%的數(shù)據(jù)作為驗(yàn)證集, 由于本文數(shù)據(jù)樣本不平衡, 正負(fù)樣本的比例接近7:3, 所以本文采用分層抽樣的方法生成訓(xùn)練集和測(cè)試集, 即在正樣本中隨機(jī)抽樣70%的樣本, 在負(fù)樣本中隨機(jī)抽樣30%的樣本作為訓(xùn)練樣本集, 剩下的樣本作為測(cè)試樣本集.
整個(gè)數(shù)據(jù)集共有218 356條數(shù)據(jù), 其中正反樣例的分布如表1所示.

表1 數(shù)據(jù)集中正負(fù)樣本分布
本文中反例表示需要攔截的聊天信息, 正例表示不需要攔截的正常信息. 最終選擇的訓(xùn)練樣本集和測(cè)試樣本集中數(shù)據(jù)的分布如表2所示.

表2 訓(xùn)練集及測(cè)試集樣本分布

測(cè)試集 56 136 9371
為了評(píng)價(jià)模型的好壞, 需要使用評(píng)估函數(shù)[13–16].評(píng)估函數(shù)是用來(lái)評(píng)價(jià)模型性能的函數(shù), 表示模型預(yù)測(cè)結(jié)果與真實(shí)數(shù)據(jù)結(jié)果之間的差別, 差別越小表示模型的性能越好, 所以評(píng)估函數(shù)可以用來(lái)比較多個(gè)模型之間的性能. 在介紹測(cè)評(píng)函數(shù)之前先介紹混淆矩陣, 對(duì)于分類模型, 其分類結(jié)果的混淆矩陣如表3所示.

表3 混淆矩陣
即TP表示真實(shí)樣例為正例模型預(yù)測(cè)結(jié)果為正例的樣例數(shù),FN表示真實(shí)樣例為正例模型預(yù)測(cè)為反例的樣例數(shù),FP表示真實(shí)樣例為反例模型預(yù)測(cè)結(jié)果為正例的樣例數(shù),TN表示真實(shí)樣例為反例模型預(yù)測(cè)結(jié)果為反例的樣例數(shù).
由于本文樣本分布不平衡, 且誤分類帶來(lái)的損失也不一樣, 因?yàn)樵诹奶靸?nèi)容攔截中, 將正常的聊天內(nèi)容誤分類為需攔截的內(nèi)容造成的損失比將需要攔截的內(nèi)容誤判為正常的內(nèi)容大. 所以本文選擇F1指標(biāo)作為度量模型精確度的標(biāo)準(zhǔn),F1度量的計(jì)算公式如下:

由于本文主要關(guān)注的是反例, 即需要被攔截的信息, 所以用P表示反例的查準(zhǔn)率即被模型預(yù)測(cè)為反例的所有樣例中真實(shí)反例的比例,R表示查全率, 即反例被成功預(yù)測(cè)為反例的比例, 具體P和R的計(jì)算公式如下:

本文得模型得到的結(jié)果的混淆矩陣如表4所示.

表4 模型預(yù)測(cè)結(jié)果混淆矩陣
由表4可以得出表5所示的各種評(píng)價(jià)指標(biāo), 由表5可以得到該模型的預(yù)測(cè)準(zhǔn)確率為97%, 查準(zhǔn)率為89.27%表示模型預(yù)測(cè)為反例的樣本中真正反例所占的比例為89.27%, 查全率為89.82%表示真是的反例中被模型預(yù)測(cè)出來(lái)的比例為89.82%. 為了比較模型的結(jié)果, 可對(duì)于相同的數(shù)據(jù)集我們分別使用了樸素貝葉斯方法及基于Doc2Vec的logistic模型, 其中樸素貝葉斯方法是基于文本的one-hot表示, 即將每個(gè)聊天記錄表示一個(gè)維度為詞典長(zhǎng)度的向量, 向量的取值為0或1, 其中0表示該聊天記錄包含了相應(yīng)的詞, 1表示該聊天記錄沒有包含相應(yīng)的詞, 然后通過(guò)TF-IDF方法進(jìn)行降維, 選取具TF-IDF值高的詞作為最終的變量, 最終選擇的變量有5321個(gè). 三個(gè)模型的最終結(jié)果如表6所示.

表5 模型評(píng)價(jià)指標(biāo) (單位: %)

表6 各模型的實(shí)驗(yàn)結(jié)果對(duì)比
由表6可以看出, 本文的Doc2vec SVM模型與Doc2Vec Logistic、樸素貝葉斯相比具有更高的準(zhǔn)確率、查準(zhǔn)率、查全率及F1值.而且維度只有201維,遠(yuǎn)遠(yuǎn)小于樸素貝葉斯的5322維. 雖然樸素貝葉斯的準(zhǔn)確率為96.17%, 查準(zhǔn)率為92.56%, 但是其查全率只有80.35%, 即樸素貝葉斯傾向于將樣本預(yù)測(cè)為正樣本.Logistic由于模型過(guò)于簡(jiǎn)單, 導(dǎo)致欠擬合, 所以各項(xiàng)指標(biāo)都較低. 因此, 可以得出結(jié)論本文的Doc2Vec SVM模型在提高了分類精度的同時(shí)有效的減小了數(shù)據(jù)維度, 提高了分類的效率, 此外還可以通過(guò)訓(xùn)練得到每個(gè)詞的向量表示.
本篇文章使用了基于Doc2Vec與SVM的方法,對(duì)用戶的聊內(nèi)容進(jìn)行分類, 首先使用Doc2Vec對(duì)聊天內(nèi)容進(jìn)行處理, 將聊天內(nèi)容表示為數(shù)值向量, 然后再使用SVM進(jìn)行分類. 實(shí)驗(yàn)表明, 這種方法能有效的提高分類精度, 能有效的識(shí)別垃圾聊天內(nèi)容或廣告, 從而大大提高了聊天內(nèi)容攔截過(guò)濾的效率.