霍 英, 丘志敏, 李小帆, 李彥廷
(1.韶關(guān)學(xué)院信息工程學(xué)院, 廣東 韶關(guān) 512005;2.韶關(guān)學(xué)院智能工程學(xué)院, 廣東 韶關(guān) 512005)
網(wǎng)絡(luò)輿情分析包括對(duì)網(wǎng)絡(luò)信息進(jìn)行采集、去重、抽取、分詞、索引、存儲(chǔ)和分析等一系列過程,是進(jìn)行網(wǎng)絡(luò)輿論感知、監(jiān)控與引導(dǎo)的重要依據(jù)。如何規(guī)范大數(shù)據(jù)環(huán)境下網(wǎng)絡(luò)輿情信息的及時(shí)感知、收集、分析與監(jiān)管,并及時(shí)有效地引導(dǎo)輿情向良好的方向發(fā)展,如何實(shí)現(xiàn)“傳播力決定影響力,話語權(quán)決定主導(dǎo)權(quán),時(shí)效性決定有效性,透明度決定公信度”的使命,是我國各級(jí)政府相關(guān)部門面臨的現(xiàn)實(shí)問題,也是亟待解決的重要課題[1-2]?;诖?在大數(shù)據(jù)環(huán)境下,本文給出了一種微博輿情分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)方案,并對(duì)文本情感分析、計(jì)算文本相似度給出了具體實(shí)現(xiàn)算法,以實(shí)現(xiàn)對(duì)輿情信息的趨勢(shì)性預(yù)警及有效監(jiān)管。
本系統(tǒng)主要是通過采集微博用戶指定話題的相關(guān)數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行初步加工后,通過業(yè)務(wù)系統(tǒng)展示出來,能清晰直觀地體現(xiàn)某熱點(diǎn)話題的傳播速度,以及公眾對(duì)該輿情事件的態(tài)度。
本系統(tǒng)主要分成三個(gè)子層:數(shù)據(jù)采集層、數(shù)據(jù)處理層及數(shù)據(jù)展示層(業(yè)務(wù)子系統(tǒng)展示層)。其中,數(shù)據(jù)采集層主要通過官方提供的數(shù)據(jù)應(yīng)用獲取接口(API)及使用自定義的網(wǎng)絡(luò)爬蟲[3-5]獲取網(wǎng)絡(luò)數(shù)據(jù);數(shù)據(jù)處理層主要完成中文的分詞、文本的清洗、標(biāo)準(zhǔn)化、特征提取、情感分析等工作;業(yè)務(wù)子系統(tǒng)展示層主要是面向平臺(tái)用戶,將數(shù)據(jù)處理層處理后的數(shù)據(jù)以圖表、文字的形式呈現(xiàn)給用戶,并完成與用戶的交互等功能。三個(gè)子層都可以當(dāng)成一個(gè)獨(dú)立的系統(tǒng)使用,擁有良好的擴(kuò)展性。系統(tǒng)整體運(yùn)行流程如圖1所示,系統(tǒng)主要功能如圖2所示。
圖1 系統(tǒng)運(yùn)行圖Fig.1 System run diagram
圖2 微博輿情分析平臺(tái)功能圖Fig.2 Functional map of microblog public opinion analysis platform
系統(tǒng)采用SSM(Spring+SpringMVC+MyBatis)架構(gòu),共劃分為四個(gè)層次:View(表現(xiàn))層、Controller(控制)層、Service(業(yè)務(wù)邏輯)層、DAO(數(shù)據(jù)持久)層,如圖3所示,其流程主要分為以下幾個(gè)步驟。
圖3 系統(tǒng)處理流程Fig.3 System processing flow
(1)客戶端(用戶)發(fā)送請(qǐng)求到分發(fā)器。
(2)分發(fā)器查詢Hander Mapping(處理器映射),并找到處理請(qǐng)求的控制器。
(3)控制器調(diào)用業(yè)務(wù)邏輯層后,處理返回Model and View(模型和視圖對(duì)象)。
(4)分發(fā)器負(fù)責(zé)查詢視圖解析器,并找到Model and View指定的視圖。
(5)視圖把結(jié)果展示到客戶端。
微博輿情分析中的數(shù)據(jù)處理主要采用以下技術(shù):對(duì)獲取的原始文本進(jìn)行中文分詞、文本清洗、情感分析等。
由于語言的差異,因此中英文在分詞的思路上有較大區(qū)別。多數(shù)情況下,英文通常使用空格就可以自動(dòng)完成分詞任務(wù),但中文的語法復(fù)雜,通常會(huì)通過第三方庫進(jìn)行分詞操作。本系統(tǒng)采用第三方庫Jieba分詞器進(jìn)行中文分詞工作[6]。Jieba分詞器工作的主要原理是基于統(tǒng)計(jì)詞典,首先建立一個(gè)前綴詞典,然后利用前綴詞典對(duì)句子展開切分,并根據(jù)所有切分的可能及切分位置構(gòu)造一個(gè)有向無環(huán)圖,通過相關(guān)動(dòng)態(tài)規(guī)劃算法計(jì)算出最大概率路徑,從而獲得最終切分形式。
經(jīng)過分詞之后獲取的文本中通常含有類似標(biāo)點(diǎn)符號(hào)、停用詞等無用信息,因此需要對(duì)文本開展分步清洗工作。本系統(tǒng)使用正則表達(dá)式結(jié)合百度的停用詞庫進(jìn)行文本清洗。
正則表達(dá)式的基本原理如下[7]:定義文法G={Vn,Vt,S,P},其中Vn是一個(gè)非空有限的符號(hào)集合,它的元素稱為非終結(jié)符號(hào);Vt也是一個(gè)非空有限符號(hào)集合,它的元素稱為終結(jié)符號(hào),并且Vt∩Vn=?;S是文法G的起始符號(hào),并且S∈Vn;P是一個(gè)非空有限集合,它的元素稱為產(chǎn)生式。所謂產(chǎn)生式,其形式為α→β,它的元素為形如α→β的產(chǎn)生式,其中α、β是由終結(jié)符和非終結(jié)符組成的符號(hào)串,并且α、β∈(Vt∪Vn)*,α≠ε。開始符S必須至少在某一產(chǎn)生式的α中出現(xiàn)一次。正則表達(dá)式是一種3型文法,它以整個(gè)字母表作為Vt集合。假設(shè)一個(gè)文法的產(chǎn)生式為{S→Sa;S→b;},那么對(duì)應(yīng)的正則表達(dá)式為ba*。例如,等包含html標(biāo)簽的文本,可使用“?.+?/?>”表達(dá)式去除html標(biāo)簽。
去除停用詞的原理如下:對(duì)文本進(jìn)行中文分詞操作后,將產(chǎn)生一個(gè)包含所有詞語的列表,通過逐個(gè)取出列表中詞語與停用詞庫里的詞語進(jìn)行匹配,若相同則在列表中刪除該詞,從而實(shí)現(xiàn)去除停用詞。
文本情感分析主要是指對(duì)文本開展檢測、分析以及挖掘的過程,文本中可能包含有用戶的觀點(diǎn)、喜好、情感等主觀因素,通過情感分析可以歸納、推理文本和文本中各個(gè)人物所要表達(dá)的情感色彩。SnowNLP[8]是python編寫的一個(gè)類庫,它提供了情感傾向分析等功能,可以方便地處理中文文本內(nèi)容,本系統(tǒng)主要借助它實(shí)現(xiàn)文本情感分析和文本評(píng)分功能。通過人工預(yù)先把部份微博數(shù)據(jù)分為消極的和積極的兩種類別,以此為基礎(chǔ),通過貝葉斯公式推斷接下來提取的微博數(shù)據(jù)屬于積極類別的概率。當(dāng)某條微博數(shù)據(jù)有60%以上的概率屬于積極類,則認(rèn)為該條微博屬于正面微博,并將該微博屬于積極類別的概率值減去0.6后的取值,作為其文本評(píng)分。
通過用戶提供的敏感詞典(*.txt文件),從每條微博中提取出敏感詞匯,存儲(chǔ)在業(yè)務(wù)數(shù)據(jù)庫中。通過自定義的詞庫種類,還可以提取出正負(fù)詞匯和關(guān)鍵詞等。敏感分?jǐn)?shù)則由該微博中出現(xiàn)敏感詞的個(gè)數(shù)決定,出現(xiàn)一個(gè)敏感詞加一分,并存儲(chǔ)到業(yè)務(wù)數(shù)據(jù)庫中。
SnowNLP是python編寫的一個(gè)類庫,它提供了情感傾向分析等功能,但因其使用的模型是通過影評(píng)訓(xùn)練生成的,并不完全契合本系統(tǒng)的需求,因此需要重新訓(xùn)練生成新的模型,并替換SnowNLP中原有模型。
貝葉斯模型[9]是用于情感分類的基本模型。對(duì)于兩個(gè)類別的分類問題,其特征表示為w1,w2,…,wn,并且各個(gè)特征之間相互獨(dú)立,對(duì)于其中一個(gè)類別的貝葉斯模型可以表示如下:
例如,有一句話text1:“我想出去玩?!?/p>
text1的分詞結(jié)果為[″我″,″想″,″出去″,″玩″],A1,A2,A3,A4分別表示4個(gè)詞,C1表示積極類,C2表示消極類。
計(jì)算每個(gè)單詞出現(xiàn)的頻率:則P(A1)=A1的詞頻/訓(xùn)練集的單詞總數(shù),同理P(A2)=A2的詞頻/訓(xùn)練集的單詞總數(shù)。
計(jì)算C1情緒中單詞出現(xiàn)的概率:P(A1|C1)=C1中A1的詞頻/訓(xùn)練集中屬于C1的單詞總數(shù)。P(A2|C1)=C1中A2的詞頻/訓(xùn)練集中屬于C1的單詞總數(shù)。
計(jì)算訓(xùn)練集中C1類別出現(xiàn)的概率:P(C1)=C1的句子總數(shù)/訓(xùn)練集的句子總數(shù)。
則text1屬于C1類的概率:
為了得到新的模型,需要重新對(duì)貝葉斯模型進(jìn)行訓(xùn)練,生成新的模型并替換原有模型,而訓(xùn)練的實(shí)質(zhì)就是計(jì)算每個(gè)特征出現(xiàn)的頻次,當(dāng)統(tǒng)計(jì)好訓(xùn)練樣本中的total和每一個(gè)特征key的d[key]后,訓(xùn)練過程就構(gòu)建完成。這個(gè)過程的核心代碼如下:
def train(self, data):
# data 中既包含正樣本,也包含負(fù)樣本
For d in data: # data中是list
# d[1]:正/負(fù)樣本的標(biāo)記
C=d[1]
If c not in self.d:
self.d[c]=AddOneProb() # 類的初始化
For word in d[0]: # 分詞結(jié)果中的每一個(gè)詞
self.d[c].add(word, 1)
self.total=sum(map(lambda x: self.d[x].getsum(), self.d.keys())) # 取得所有d中的和sum
Class AddOneProb(BaseProb):
Def __init__(self):
self.d={}
self.total=0.0
self.none=1 # 默認(rèn)所有的none為1
# 這里如果value也等于1,則當(dāng)key不存在時(shí),累加的是2
Def add(self, key, value):
self.total +=value
# 不存在該key時(shí),需新建key
If not self.exists(key):
self.d[key]=1
self.total +=1
self.d[key] +=value
Def classify(self, x):
tmp={}
For k in self.d:#正類和負(fù)類
tmp[k]=log(self.d[k].getsum())-log(self.total)#正/負(fù)類的所有之和的log函數(shù)
For word in x:
tmp[k] +=log(self.d[k].freq(word)) #詞頻,不存在就為0
ret, prob=0, 0
For k in self.d:
Now=0
try:
For otherk in self.d:
Now +=exp(tmp[otherk]-tmp[k])
Now=1/now
Except OverflowError:
Now 0
If now >prob:
ret, prob=k, now
Return (ret, prob)
該算法主要集成在系統(tǒng)的推薦功能上,以初始文本作為質(zhì)心,計(jì)算與其距離最近的微博,即文本相似度最高的微博推送即可。由于計(jì)算機(jī)不能直接識(shí)別中文,因此需要先把文本轉(zhuǎn)化為向量的形式,其主要步驟可分為去除停用詞、計(jì)算TF-IDF(TF和IDF的乘積)的值,以此作為該文本向量的表現(xiàn)形式。其中,TF定義為某個(gè)詞或短語在一個(gè)文本中出現(xiàn)的頻率,當(dāng)該詞頻率很高時(shí),可認(rèn)為其是該文本較為明顯的特征,有較好的區(qū)分效果;其計(jì)算公式可表示為TF=某詞出現(xiàn)的次數(shù)/該文檔中所有的詞的總數(shù)。
IDF主要用于評(píng)價(jià)一個(gè)詞語的普遍性和重要性,它是以某文件數(shù)目除以包含該詞語的文件的數(shù)目,再以10為底,取對(duì)數(shù)計(jì)算得到。當(dāng)包含該詞的文件數(shù)越少,便可認(rèn)為該詞在文檔中的重要性越高,即IDF的值越大[10];其計(jì)算公式可表示如下:
其中,D為總文檔數(shù),分母包含該詞語的文檔總數(shù)。
本文所提算法的具體實(shí)現(xiàn)方案如下。
(1)對(duì)每個(gè)文檔進(jìn)行分詞,并去除停用詞。詳細(xì)流程如圖4所示:
圖4 去除停用詞流程Fig.4 Process of removing stop words
(2)計(jì)算每個(gè)文檔的TF即詞頻,假設(shè)IDF值均為2。通過圖4可得出文檔的詞頻為{“天氣”=0.2,“錯(cuò)”=0.2,“想”=0.2,“出去”=0.2,“玩”=0.2}。因此,TF-IDF的可表示為{“天氣”=0.4,“錯(cuò)”=0.4,“想”=0.4,“出去”=0.4,“玩”=0.4}。
(3)以TF-IDF作為該文本向量的表現(xiàn)形式,即[0.4,0.4,0.4,0.4,0.4]為該文本向量化后的結(jié)果。
(4)重復(fù)上述步驟,計(jì)算從數(shù)據(jù)庫中隨機(jī)查找出來的微博內(nèi)容的向量值,并以字典的形式保存,如{微博ID=[0.4,0.4,0.4,0.4,0.4]}。最終將形成一個(gè)i行j列的矩陣:
(5)通過歐式距離計(jì)算每條微博到用戶當(dāng)前查看的微博的距離,選取距離最近的前N條展示出來。歐式距離計(jì)算公式如下:
其中,n為向量維數(shù),i和k為行號(hào)。
目前,已利用該平臺(tái)對(duì)“西安奔馳女車主維權(quán)事件”的整個(gè)微博輿情事件發(fā)展全過程進(jìn)行了追蹤與分析,對(duì)2020年3月至2020年6月新冠疫情發(fā)生期間的微博輿情熱點(diǎn)話題進(jìn)行了趨勢(shì)預(yù)警,對(duì)2020年12月至2021年5月韶關(guān)地區(qū)各旅游景點(diǎn)的微博輿情進(jìn)行了采集及預(yù)警處理。系統(tǒng)部分運(yùn)行效果如圖5至圖7所示。圖5為輿情基本信息總覽,圖6為輿情數(shù)據(jù)采集來源及占比分析,圖7為各類事件隨時(shí)間發(fā)展的趨勢(shì)變化展示。在實(shí)際應(yīng)用中,系統(tǒng)整體運(yùn)行穩(wěn)定性較高,在單機(jī)日采集量約100萬條時(shí),對(duì)數(shù)據(jù)分析的有效率可以達(dá)到90%以上,當(dāng)并發(fā)采集的數(shù)據(jù)量過大時(shí),數(shù)據(jù)分析的效率有所下降,研究人員后期將在降數(shù)據(jù)規(guī)模算法方面進(jìn)行進(jìn)一步的優(yōu)化。
圖5 輿情基本信息Fig.5 Basic public opinion information
圖6 輿情數(shù)據(jù)來源展示Fig.6 Display of public opinion data sources
圖7 輿情趨勢(shì)變化展示Fig.7 Display of public opinion trend change
設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于大數(shù)據(jù)的集輿情信息采集、去重、分析、處理及可視化的綜合平臺(tái)。該平臺(tái)主要對(duì)采集到的用戶指定話題的微博數(shù)據(jù)進(jìn)行加工處理后,通過業(yè)務(wù)子系統(tǒng)展示出來,清晰直觀地體現(xiàn)微博某熱點(diǎn)話題的傳播速度,以及公眾對(duì)該輿情事件的態(tài)度。通過在相關(guān)輿情事件開展追蹤、分析、預(yù)警及處理的實(shí)際應(yīng)用過程中,系統(tǒng)穩(wěn)定性較高,整體表現(xiàn)良好。