周 雁,王慶娟,龐 桐
(北京理工大學(xué)珠海學(xué)院 計(jì)算機(jī)學(xué)院,廣東 珠海 519000)
輿情是“輿論情況”的簡(jiǎn)稱,是指在一定的社會(huì)空間內(nèi),圍繞中介性社會(huì)事件的發(fā)生、發(fā)展和變化,作為主體的民眾對(duì)作為客體的社會(huì)管理者、企業(yè)、個(gè)人及其他各類組織及其政治、社會(huì)、道德等方面的取向產(chǎn)生和持有的社會(huì)態(tài)度[1-4]。它是較多群眾關(guān)于社會(huì)中各種現(xiàn)象、問題所表達(dá)的信念、態(tài)度、意見和情緒等表現(xiàn)的總和[5-7]。
輿情是社會(huì)事件的發(fā)生與變化,新聞是網(wǎng)絡(luò)輿情的重中之重。隨著互聯(lián)網(wǎng)在全球范圍的極速發(fā)展,人們獲取訊息的主要方式漸漸轉(zhuǎn)變?yōu)榻?jīng)由網(wǎng)絡(luò)媒體獲取。網(wǎng)絡(luò)上的新聞種類繁多,信息量巨大,當(dāng)網(wǎng)絡(luò)出現(xiàn)重大輿情,特別是負(fù)面輿情時(shí),若不能及時(shí)了解、有效引導(dǎo),很容易形成輿論危機(jī),嚴(yán)重時(shí)甚至影響公共安全。
隨著大數(shù)據(jù)和人工智能的飛速發(fā)展以及機(jī)器學(xué)習(xí)中神經(jīng)網(wǎng)絡(luò)的突破,使得輿情分析監(jiān)測(cè)系統(tǒng)的架構(gòu)發(fā)生了根本性的轉(zhuǎn)變[8-13]。以往的輿情信息解析系統(tǒng)大多以規(guī)則為主導(dǎo),容易導(dǎo)致規(guī)則數(shù)量龐大、邏輯復(fù)雜,難以維護(hù)與升級(jí);應(yīng)用神經(jīng)網(wǎng)絡(luò)技術(shù)后,一般以神經(jīng)網(wǎng)絡(luò)模型為主、規(guī)則為輔,輿情分析系統(tǒng)的準(zhǔn)確率與速度因此得到巨大提升。本文即是運(yùn)用此思路,參考文獻(xiàn)[9,14-22]中相關(guān)觀點(diǎn),構(gòu)建了一個(gè)新聞?shì)浨榉治鱿到y(tǒng)。通過將系統(tǒng)各模塊松耦合,把解析模塊獨(dú)立出系統(tǒng),使系統(tǒng)結(jié)構(gòu)更清晰和靈活;研究利用神經(jīng)網(wǎng)絡(luò)代替規(guī)則作為分析工具,使用微量規(guī)則修正模型結(jié)果,以提高準(zhǔn)確率。以此來對(duì)新聞進(jìn)行過濾、篩選與分析,去除無用信息的干擾,從巨量數(shù)據(jù)中取出重要的信息,實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)新聞?shì)浨榈姆治龊捅O(jiān)測(cè),以便提前做出預(yù)警及必要準(zhǔn)備。
新聞?shì)浨榉治鱿到y(tǒng)采用微服務(wù)架構(gòu),由四部分組成:Web服務(wù)、新聞搜集服務(wù)、新聞分析預(yù)測(cè)服務(wù)和數(shù)據(jù)存儲(chǔ)服務(wù),四個(gè)服務(wù)對(duì)應(yīng)四個(gè)技術(shù)模塊,如圖1所示。
新聞搜集模塊利用Scrapy框架以及Blocking Scheduler庫(kù)構(gòu)建新聞爬蟲,全天候多進(jìn)程定時(shí)爬取新聞。新聞分析預(yù)測(cè)模塊利用TensorFlow框架搭建CNN模型實(shí)現(xiàn)兩個(gè)多分類任務(wù),分別用于新聞?lì)愋秃颓楦械念A(yù)測(cè)。數(shù)據(jù)存儲(chǔ)模塊是存放數(shù)據(jù)的后方陣地,由Mysql、MongoDB和ElasticSearch構(gòu)成。Mysql負(fù)責(zé)存儲(chǔ)原始數(shù)據(jù)與濾重表,濾重操作在這里進(jìn)行;MongoDB存儲(chǔ)分析后的數(shù)據(jù);ElasticSearch作為搜索引擎單獨(dú)部署。Web服務(wù)模塊是連接系統(tǒng)各部分的樞紐,基于Tornado構(gòu)建web服務(wù),以連通另外三個(gè)模塊。通過Web模塊的連通作用,搜集的新聞先后歷經(jīng)濾重、關(guān)鍵詞提取、分析得出預(yù)測(cè)結(jié)果等步驟后,存入相應(yīng)數(shù)據(jù)庫(kù),并且與前端作數(shù)據(jù)交互,其詳細(xì)流程圖如圖2所示。
圖2 系統(tǒng)流程圖
系統(tǒng)采取微服務(wù)架構(gòu),其主要優(yōu)點(diǎn)在于:
1)系統(tǒng)中的各個(gè)微服務(wù)被獨(dú)立部署,不同服務(wù)之間通過http或rpc(Remote Procedure Call,遠(yuǎn)程過程調(diào)用)輕量級(jí)通信。
2)微服務(wù)之間松耦合,每個(gè)微服務(wù)只需關(guān)注本模塊內(nèi)的功能邏輯以及上下游的數(shù)據(jù)傳輸,且每個(gè)微服務(wù)都是一種相對(duì)獨(dú)立的業(yè)務(wù)。
3)微服務(wù)更新迭代非常方便、快速,開發(fā)人員易于理解與管理。
4)可以按需定制資源利用,橫向擴(kuò)展十分方便。比如,新聞分析服務(wù)和新聞搜集服務(wù)所需的CPU存在較大差異,可以給前者分配更多的CPU,給后者分配較少的CPU,使資源利用最大化。
部署系統(tǒng)的微服務(wù)架構(gòu),使用的是云服務(wù)技術(shù)的革新者Docker。Docker是一個(gè)開源的應(yīng)用容器引擎,它使得部署中最耗時(shí)的環(huán)境配置環(huán)節(jié)幾乎可被忽略,為開發(fā)帶來了巨大的便利。利用Docker,將應(yīng)用或服務(wù)打包到一個(gè)虛擬化、可移植的微型Linux(或Windows)容器中。容器實(shí)際上是一個(gè)進(jìn)程,之間不存在接口,在容器內(nèi)的操作不會(huì)對(duì)宿主機(jī)造成任何影響,類似虛擬機(jī)。如果要進(jìn)行通信,只需映射外部端口和內(nèi)部暴露端口即可。Docker的工作過程類似做漢堡,構(gòu)建鏡像時(shí)的每一次命令都將添加一層鏡像層(可以理解為添加面包片、芝士或肉)?;阽R像,便可啟動(dòng)容器。
數(shù)據(jù)集來自搜狗新聞的開源數(shù)據(jù)。使用Scrapy框架構(gòu)建爬蟲模塊,從搜狗新聞的網(wǎng)頁上爬取新聞,并對(duì)每條新聞提取標(biāo)題、內(nèi)容文本、更新日期、來源等結(jié)構(gòu)性數(shù)據(jù),進(jìn)行編號(hào)后存入數(shù)據(jù)庫(kù)。本文共搜集了約15萬條新聞,提取其結(jié)構(gòu)性數(shù)據(jù)作為原始數(shù)據(jù)集,訓(xùn)練集與測(cè)試集比例為9:1。
新聞數(shù)據(jù)集搜集完畢后,使用TF-IDF算法進(jìn)行關(guān)鍵詞提取,為后續(xù)處理作準(zhǔn)備。
TF-IDF指的是詞頻-逆文本頻率。詞頻是文本中某詞出現(xiàn)的頻率,一般來說,一個(gè)詞在文中現(xiàn)的頻率越高則越重要,但僅以詞頻考量詞的重要度是不科學(xué)的。因?yàn)榇嬖诤芏嘟樵~、代詞等,它們出現(xiàn)的頻率很高,但意義不大,不能用來表示文本的特征。因此引入逆文本頻率(IDF)概念,其反映了一個(gè)詞在所有文本中出現(xiàn)的頻率。如果IDF低,即代表這個(gè)詞在很多文本中出現(xiàn),唯一性低;IDF高,即代表這個(gè)詞在很少文本中出現(xiàn),唯一性高。用變量FID表示IDF,詞x的逆文本頻率計(jì)算公式如下:
其中,N代表語料庫(kù)中文本的總數(shù),N(x)代表語料庫(kù)中包含詞x的文本總數(shù)。
綜合考慮TF和IDF,用變量FT-ID表示TF-IDF,詞x的詞頻-逆文本頻率計(jì)算公式如下:
其中,F(xiàn)T(x)代表詞x在當(dāng)前文本中的詞頻。
基于TF-IDF,建立詞庫(kù)后,便可以開始抽取關(guān)鍵詞了。本文利用Python的jieba庫(kù)進(jìn)行TF-IDF關(guān)鍵詞提取。為了屏蔽不需要的詞,還需自定義一份停用詞列表供切詞器加載。
提取關(guān)鍵詞后,將輸出新聞列表交給系統(tǒng)后端處理。為了避免對(duì)相同的新聞作重復(fù)的保存、分析等操作,必須對(duì)新聞列表進(jìn)行濾重。新聞的濾重屬于長(zhǎng)文本濾重,綜合考慮可行性和空間消耗等因素,對(duì)比Simhash、Bitmap和布隆過濾器等算法后,選擇Simhash作為濾重算法。
Simhash算法由Manku G S等[23]提出,用于解決億萬級(jí)別的網(wǎng)頁去重任務(wù)。其原理是將文本切詞后得到的詞的權(quán)重,經(jīng)過Hash計(jì)算出二進(jìn)制Hash值,然后加權(quán)求累加和,降維得到一個(gè)輸出序列即為Simhash值;計(jì)算兩個(gè)文本Simhash值間的漢明距離,如果小于某個(gè)閾值,即認(rèn)為兩個(gè)文本為類似文本。算法示意圖如圖3所示。
圖3 Simhash算法過程
本文將濾重閾值設(shè)為3。首先在數(shù)據(jù)庫(kù)中建立一張存放Simhash值的表,每次有新的新聞文本需濾重時(shí),將其Simhash值與表中的Simhash值計(jì)算漢明距離,即進(jìn)行異或運(yùn)算,當(dāng)距離小于等于3則判定此文本為重復(fù)新聞。
濾重之后,使用深度神經(jīng)網(wǎng)絡(luò)對(duì)新聞進(jìn)行分析預(yù)測(cè)。通過對(duì)新聞進(jìn)行分析,預(yù)測(cè)出新聞的內(nèi)容類型及情感傾向。本文將新聞?lì)愋头譃?類:金融、科技、社會(huì)、時(shí)政、體育和游戲,情感傾向分為3種:正面、中性、負(fù)面。因此,新聞的分析預(yù)測(cè)本質(zhì)上是兩個(gè)多分類任務(wù)。
深度神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)結(jié)構(gòu)由多個(gè)層組成,以學(xué)習(xí)具有多個(gè)抽象層次的數(shù)據(jù)特征,使得計(jì)算機(jī)能通過相對(duì)簡(jiǎn)單的概念來學(xué)習(xí)復(fù)雜的概念。本文的深度神經(jīng)網(wǎng)絡(luò)使用的是Tensorflow框架及CNN模型。CNN模型包含輸入層、卷積層、池化層、全連接層、Dropout層及激活層,每一層完成不同的操作。
輸入層用于訓(xùn)練語料的輸入。語料在輸入模型之前,需要進(jìn)行清洗與優(yōu)化。首先需要確保分類標(biāo)簽的準(zhǔn)確性;其次是要去除其中的噪聲,如剔除“了”“的”“你”“我”“他”等無用詞,避免其影響模型的分析效果,使預(yù)測(cè)產(chǎn)生誤差。輸入層后加入Embedding層,避免語料中由于存在相同字詞導(dǎo)致的向量距離較近而影響訓(xùn)練效果。卷積層是為了篩選特征,根據(jù)卷積核得到想要的特征形狀。池化層是為了減少學(xué)習(xí)的特征數(shù)和數(shù)據(jù)量,突出特征。連接層使所有的特征整合在一起計(jì)算出一個(gè)值,這個(gè)值就是分類的結(jié)果。此操作可以消除特征位置對(duì)結(jié)果的影響,避免結(jié)果受到時(shí)序的干擾。Dropout層作用是將部分神經(jīng)元舍棄,防止模型掌握了太多的特征而出現(xiàn)過擬合的情況。CNN的卷積層和全連接層都有激活函數(shù),為模型加入非線性的影響因子,使得模型效果更好。文中的激活函數(shù)使用Softmax,它可以將全連接層的輸出歸一化,很好地計(jì)算出各分類的概率得分。
優(yōu)化器用來更新和計(jì)算影響模型訓(xùn)練和模型輸出的網(wǎng)絡(luò)參數(shù),使其逼近或達(dá)到最優(yōu)值。以上為訓(xùn)練過程,模型訓(xùn)練完畢后,可輸入待分析的新聞?wù)Z料進(jìn)行分析預(yù)測(cè)。
預(yù)測(cè)和訓(xùn)練流程基本一致,但無需損失函數(shù)計(jì)算和優(yōu)化器的步驟。需要注意的是確保定義好預(yù)測(cè)文本Embedding的長(zhǎng)度和詞表的統(tǒng)一。
系統(tǒng)使用了Mysql和MongoDB兩種數(shù)據(jù)庫(kù)及1個(gè)全文檢索引擎Elasticsearch。Mysql的作用主要是進(jìn)行Simhash濾重和存儲(chǔ)原始數(shù)據(jù)。Mysql中建了兩張表:news表和simhash表。news表存放爬蟲爬取的未加工數(shù)據(jù),包括新聞的編號(hào)、標(biāo)題、內(nèi)容文本、更新日期、來源等具體信息。simhash表除了上述信息外,還存儲(chǔ)了八列新聞文本的Simhash序列碼,用于新聞濾重時(shí)計(jì)算新聞文本之間的漢明距離。MongoDB是一種文檔型數(shù)據(jù)庫(kù),其擁有非常完善的權(quán)限機(jī)制。文中Mongo數(shù)據(jù)庫(kù)用來存儲(chǔ)新聞解析后的完全體數(shù)據(jù),并同步到Elasticsearch中。MongoDB全文檢索在數(shù)據(jù)量大時(shí)性能急劇下降,本文選用ElasticSearch來實(shí)現(xiàn)后臺(tái)搜索。Elasticsearch存儲(chǔ)的數(shù)據(jù)和Mongo是同步的,但沒有Mongo自生成的_id。因此Elasticsearch不需要設(shè)計(jì)數(shù)據(jù)庫(kù),只需建立索引和文檔類型即可。Elasticsearch提供RESTful的接口,系統(tǒng)通過http方式與ElasticSearch通信。
系統(tǒng)前端設(shè)計(jì)簡(jiǎn)潔,共設(shè)計(jì)了三個(gè)頁面:主頁、深度預(yù)測(cè)頁面以及搜索頁面。頁面使用Bootstrap、Layui和Datatables的組件搭建,使用JavaScript編寫前端邏輯。由于技術(shù)比較簡(jiǎn)單,在此不做詳細(xì)闡述。主頁承載Datatables組件,自動(dòng)從Mongo數(shù)據(jù)庫(kù)獲取最近50條新聞及其分析預(yù)測(cè)結(jié)果進(jìn)行展示,負(fù)面情感的新聞會(huì)標(biāo)紅警示。深度預(yù)測(cè)頁面是提供用戶測(cè)試文本內(nèi)容類型和情感傾向的一個(gè)頁面。用戶可以輸入一段文本進(jìn)行類型和情感的深度分析預(yù)測(cè)。后臺(tái)搜索頁面是基于Elasticsearch搭建的搜索服務(wù),可以對(duì)用戶輸入的內(nèi)容進(jìn)行新聞搜索。
主頁展示新聞數(shù)據(jù),獲取50條最新的新聞并展示,界面如圖4所示。在初始化表格的時(shí)候,前端給后端發(fā)送一串參數(shù),包括:當(dāng)前頁面展示數(shù)據(jù)條數(shù)、當(dāng)前頁面頁數(shù)等,后端根據(jù)參數(shù)的值,返回前端需要的數(shù)據(jù)集。
圖4 主頁界面
表格上方可選擇每頁顯示的條目數(shù),支持翻頁和列排序。當(dāng)單元格數(shù)據(jù)超過一定長(zhǎng)度時(shí),將生成超鏈接,點(diǎn)擊后彈出信息框顯示完整的文本內(nèi)容。新聞內(nèi)容、關(guān)鍵詞、來源這三列內(nèi)容字?jǐn)?shù)較多時(shí)可通過點(diǎn)擊顯示全部?jī)?nèi)容實(shí)現(xiàn)瀏覽。
通過查看系統(tǒng)運(yùn)行日志,可獲取系統(tǒng)各部分的執(zhí)行時(shí)間。如圖5所示,系統(tǒng)獲取50條最新新聞的時(shí)間大約為91 ms(其中查詢數(shù)據(jù)庫(kù)的時(shí)間約為87 ms)。
圖5 系統(tǒng)運(yùn)行日志
在新聞的濾重方面,500字的長(zhǎng)文本建立Simhash序列碼平均速度約為6 ms,萬級(jí)數(shù)據(jù)的查詢?yōu)V重平均速度約為7.5 ms。
深度預(yù)測(cè)頁面由兩個(gè)文本域及對(duì)應(yīng)的按鈕組成,分別用于分析文本的情感傾向和新聞的內(nèi)容類型,如圖6所示。經(jīng)測(cè)試,200字文本的分析預(yù)測(cè)耗時(shí)約為5 ms。如果要追求更快的速度,可以使用Tensorflow-serving載入pb格式的模型并使用rpc通信。
圖6 情感分析和新聞?lì)愋头治?/p>
搜索頁面由搜索文本框、搜索按鈕和表格組成,如圖7所示。當(dāng)ElasticSearch中有1萬條數(shù)據(jù)并設(shè)置最高返回80條結(jié)果時(shí),平均搜索速度為500 ms。
圖7 搜索頁面
本系統(tǒng)基于某企業(yè)實(shí)際項(xiàng)目中的輿情分析模塊而設(shè)計(jì)開發(fā)。系統(tǒng)搭建完成后,對(duì)系統(tǒng)各部分功能進(jìn)行了測(cè)試,均能正常執(zhí)行,準(zhǔn)確無誤。后期根據(jù)企業(yè)使用需要,對(duì)系統(tǒng)進(jìn)行了適當(dāng)調(diào)整,并改寫接口,目前已作為核心部分實(shí)際應(yīng)用于該企業(yè)監(jiān)測(cè)上市公司動(dòng)態(tài)的項(xiàng)目中。投入應(yīng)用后,該項(xiàng)目輿情分析模塊的預(yù)測(cè)準(zhǔn)確率得到了較大提升,具有良好的現(xiàn)實(shí)意義和應(yīng)用價(jià)值。
本文基于深度神經(jīng)網(wǎng)絡(luò),研究并設(shè)計(jì)實(shí)現(xiàn)了網(wǎng)絡(luò)新聞?shì)浨榉治鲱A(yù)測(cè)系統(tǒng)。系統(tǒng)實(shí)現(xiàn)了預(yù)設(shè)功能,投入實(shí)際使用后,效果良好。然而系統(tǒng)仍存在一定的不足,如:前端的界面不夠豐富和美觀;新聞濾重時(shí)隨著數(shù)據(jù)的增多,查詢速度會(huì)逐漸變慢;等等。這些都將在實(shí)際應(yīng)用中根據(jù)需要不斷改進(jìn)與升級(jí)。