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