饒 泓, 姬名書, 朱 劍
(南昌大學 信息工程學院, 江西 南昌 330031)
機器學習(machine learning,ML)涉及概率論、統(tǒng)計學、逼近論、凸分析、算法復雜度理論等多門學科,是人工智能領域中一個極其重要的研究方向,是數據挖掘、計算機視覺、語音識別、自然語言處理等研究的基礎。機器學習與模式識別算法已經成功應用于現(xiàn)代互聯(lián)網中的搜索引擎、社交網絡、推薦引擎、計算廣告、電子商務等領域中,成為當前研究的熱點之一。
機器學習課程也是高校計算機專業(yè)碩士研究生、博士研究生的專業(yè)核心課程。本文設計了一個基于機器學習算法的輿情分析案例,以電影《戰(zhàn)狼2》的影評分析為例,闡述使用機器學習方法解決實際問題的完整過程。
機器學習的過程通常包括數據獲取、數據清洗、數據可視化分析、數據建模、數據分析、結果輸出等步驟。本論文以《戰(zhàn)狼2》影評為例,說明基于機器學習算法的輿情分析過程。
本案例從微博、論壇、朋友圈、貼吧等活躍社區(qū)獲取評論,然后通過去重、索引等方法對源數據進行預處理后入庫,再使用去停用詞、自動聚類、SVM等方法進行建模分析,最后將所得到結果通過數據可視化方法展現(xiàn)。主要流程如圖1所示。

圖1 輿情分析流程圖
(1) 數據獲取。數據獲取主要是利用網絡爬蟲(Web Crawler)或網絡蜘蛛(Web Spider)類的程序自動爬取網頁數據[1]。利用爬蟲獲取數據的大致流程如圖2所示。
(2) 數據清洗與數據入庫。數據清洗主要是刪除原始數據集中的無關數據、重復數據,平滑噪聲數據,篩選并刪除與挖掘主題無關的數據,處理缺失值、異常值等[2]。
通過上述預處理步驟后將數據保存入庫,即可進行輿情分析。
傳統(tǒng)的網絡輿情分析技術主要包括網絡調查方法、基于統(tǒng)計規(guī)則的模式識別方法、內容分析法等[3]。

圖2 數據爬取過程圖
網絡調查方法即在網絡上進行問卷調查,該方法通過設計問卷、抽樣調查、統(tǒng)計分析等一整套科學程序,能夠客觀地推測社情民意[3]。但由于網絡調查方法主要是進行采樣分析,要求抽樣具有隨機性,在大數據環(huán)境下抽樣對象是海量的互聯(lián)網用戶,很難找到最優(yōu)抽樣的標準,所以不可能根據抽樣的小樣本得出能精確反映整體趨勢的所有特征。
基于統(tǒng)計規(guī)則的模式識別是通過統(tǒng)計分析某段時間內用戶所關注信息點的記錄來構建互聯(lián)網內容與輿情的熱點/熱度、頻點/頻度、黏點/黏度等10個分析模式和判據[4]。由于不同信息源的信息產生方式有較大的差異,在大數據環(huán)境下具有一定局限性,所以該方法只適用于特定對象。
內容分析法是一種有效的社會科學研究方法,主要在3方面得到應用:一是網絡中的輿情信息;二是對網絡輿情信息的態(tài)度和情緒進行推斷;三是分析網絡輿情信息并得出趨勢變化[5]。該方法對原始材料的依賴性很強,而網絡輿情信息難以辨?zhèn)?使得內容分析法不是很高效。但是隨著網絡技術的發(fā)展,分析軟件的處理能力提高,內容分析法在網絡輿情分析中仍然很重要,因此本文的文本聚類方法仍以此為基礎。
本案例從詞云圖出發(fā),分析數據的一般規(guī)律,利用時間序列和文本聚類方法對輿情進行分析。通過制作詞云圖,觀察數據特征,了解群眾對于具體事件的關注點;然后利用時間序列分析法分析隨著時間的推移群眾對該事件的情感變化;最后利用文本聚類方法對該事件的所有輿論進行聚類,查看群眾對該事件的話題有哪些,并判斷其情感傾向。
2.2.1 基于詞云圖的輿情分析技術
在制作詞云圖階段,利用TextRank方法進行關鍵詞提取,然后進行輿情分析。TextRank算法是基于圖論的文檔關鍵詞提取方法,可以理解為是PageRank在文本領域的應用[6]。關鍵詞提取主要是從給定的文本中自動提取出有意義的詞。TextRank算法是建立圖模型并利用其局部詞之間的關系(共現(xiàn)窗口)對詞進行評分,然后對后續(xù)關鍵詞進行排序。
TextRank算法主要步驟如下:
(1) 把給定的文本T按照完整句子進行分割,即:T=[S1,S2,S3,…,Sn];
(2) 對于每個句子Si,進行分詞和詞性標注處理,并過濾掉停用詞;
(3) 構建候選關鍵詞圖模型G=(V,E),其中V為節(jié)點集,由步驟(2)生成的候選關鍵詞組成,E為詞與詞之間的關系,采用共現(xiàn)關系構造任意兩點之間的邊,兩個節(jié)點之間僅當它們對應的詞匯在長度為K的窗口中共現(xiàn)時才存在邊,K表示窗口大小,即最多共現(xiàn)K個單詞,每個候選詞Wi的評分計算公式為
(1)
其中,d為阻尼因子,即候選詞i轉到候選詞j的概率,一般取值為0.85[6]。In(Wi)為候選詞i的入度,Out(Wj)為候選詞j的出度;
(4) 根據式(1),迭代計算各節(jié)點的權重,直至收斂;
(5) 對詞權重進行倒序排列,從而得到T個最重要的單詞,并將其作為關鍵詞。
2.2.2 基于時間序列的輿情分析技術
在時間序列輿情分析階段,利用SnowNLP庫的情感分析技術進行情感傾向判斷。SnowNLP算法的原理是基于貝葉斯模型的情感分析方法。SnowNLP涉及很多技術,例如中文分詞(character-based generative model)、詞性標準(其原理有TnT算法、3-gram模型與隱馬爾科夫模型)、情感分析、文本分類(原理是NaiveBayes)、提取文本關鍵詞(原理是TextRank算法)、提取文本摘要、tf-idf等。
2.2.3 基于文本聚類的輿情分析技術
在對文本聚類跟蹤觀眾的話題及其情感傾向時,利用經典的K-Means方法聚類后進行分析,其中在特征提取階段利用了逆文檔頻率(tf-idf)方法。其原理如下:
(1) K-Means算法
K-Means算法是經典的基于距離的非層次聚類算法,在最小化誤差函數的基礎上將數據劃分為預定義的類數K,采用距離作為相似性的評價指標,即兩個對象的距離越近,其相似度就越大[7-9]。K-Means的算法過程為:
① 從N個樣本數據中隨機選取K個對象作為初始的聚類中心;
② 分別計算每個樣本到各個聚類中心的距離,將對象分配到距離最近的聚類中;
③ 所有對象分配完成后,重新計算K個聚類中心;
④ 與前一次計算得到的K個聚類中心比較,如果聚類中心發(fā)生改變,轉②,否則轉⑤;
⑤ 當質心不再發(fā)生變化時停止并輸出聚類結果。
這里選擇殘差平方和(residual sum of squares,SSE)作為度量聚類質量的目標函數,計算公式為:
(2)
簇Ei的聚類中心ei計算公式如下:
(3)
其中,K為聚類簇的個數,Ei表示第i個簇,ei表示簇Ei的聚類中心,ni表示第i個簇中的樣本數,x為樣本。
(2) 逆文檔頻率(tf-idf)
某個詞項在文本集合的多篇文本中出現(xiàn)次數越多,該詞項的區(qū)分能力越差。計算每一個詞項的tf-idf值,通常采用如下公式進行計算:
tf-idf(wi)=tf(wi)×idf(wi)=
(4)
其中,tfj(wi)表示詞wi在文本j中出現(xiàn)的頻率,N表示文本總數,df(wi)表示文本集合中有多少個文檔中出現(xiàn)了該詞wi。本文統(tǒng)計并計算最常出現(xiàn)的200個詞的tf-idf值,并利用這200個詞為每個文本建立向量模型,通過計算向量間的余弦相似度確定文本間的相似性,最后進行聚類分析。
本文以Python3.5為工具進行數據的獲取、預處理、建模與分析工作。實驗環(huán)境如下:
操作系統(tǒng):Windows10
處理器:2.50 GHz,雙核
內存:4 GB
Python版本:3.5
Python環(huán)境:jupyter notebook
Python包:urllib, beatifulSoup, pandas, numpy, jieba, operator, WordCloud, matplotlib, nltk,re, SnowNLP, ggplot, genism, sklearn等
本文利用urllib與BeautifulSoup,從豆瓣網和新浪微博爬取用戶對電影《戰(zhàn)狼2》的評論,并將獲取的數據保存為Excel格式。數據的屬性包括8個:評論者名稱(authorname)、評論時間(commenttime)、評論內容(content)、電影評分(score)、評論回復數(replyNum)、評論有用數(info)、評論無用數(nonInfo)。獲取的部分數據內容格式如表1所示。

表1 部分數據內容表
首先,讀取數據。由于數據為Excel格式,所以利用read_excel函數讀取數據:
zl_data=pd.read_excel(′zhanlang.xls′,′zl_data′)
將數值型數據為空的值替換為0,或者用該列的平均值代替,實現(xiàn)如下:
zl_data.ix[:,[5,6,7]].replace(np.nan,0)
將非數據類型的列提取出來與上述處理過的列進行合并,刪除重復評論和空評論行,最后將得到的新數據表進行索引重排:
zl_data_txt=zl_data.ix[:,[0,2,3,4]]
zl_data=pd.concat([zl_data_txt,zl_data_num],axis=1).drop_duplicates([′content′]).dropna()
zl_data=zl_data.reset_index(drop=True)
通過可視化分析,發(fā)現(xiàn)觀眾的關注點及情感傾向。這里以詞云圖為例,展示輿情的可視化分析方法。詞云圖中顯示的詞越大則表示該詞在評論中出現(xiàn)的頻率越高,觀眾越感興趣。詞云圖制作步驟如下:
(1) 數據轉換。將上述數據DataFrame對象轉換為python對象:首先遍歷zl_data每行數據,然后對每行數據的評論列進行遍歷并將其放入一個comment列表中,最后將comment列表的元素逐個寫入txt文件中,作為本節(jié)的文本關鍵詞提取、詞云分析的輿情分析數據。
(2) 基于python實現(xiàn)文本關鍵詞提取。提取文本關鍵詞需要jieba中文分詞庫,利用textrank函數進行關鍵詞提取,選出最重要的200個詞,并對這200個詞的權重進行排序,得到10個權重最高的詞,依次為:電影(1.0),戰(zhàn)狼(0.486),中國(0.458),吳京(0.355),沒有(0.307),覺得(0.210),愛國(0.206),劇情(0.175),動作(0.174),美國(0.168)。
(3) 基于python實現(xiàn)詞云圖。通過關鍵詞提取得到觀眾對該電影影評最重要的200個詞,利用WordCloud制作詞云圖,matplotlib庫用來可視化詞云圖,得到如圖3所示詞云圖。

圖3 評論詞云圖
從詞云圖可以看出,觀眾對這部影片的評論基本是正面的,電影、中國、愛國、吳京、國家、戰(zhàn)狼、主旋律這些詞出現(xiàn)在評論里的頻率最高;電影、戰(zhàn)狼、中國等話題是觀眾談論的焦點。關于中國、愛國等一系列詞語,體現(xiàn)了觀眾在愛國主義上引起了共鳴;同時吳京出現(xiàn)頻率也較高,可見吳京的演技受到了觀眾的熱議。
通過對電影評論做時間序列上的輿情分析,獲取觀眾對這部電影隨時間遷移的情感變化,并從評論中挖掘出觀眾對這部電影喜愛與厭惡的原因以及電影的賣點。
首先計算每個評論的情感分析數值。利用情感分析工具包SnowNLP分析計算,得到的結果取值范圍在0到1之間,代表了情感分析結果為正面的可能性。通過計算得到更新后的數據,如表2所示的部分數據。從情感數值來看,觀眾對這部電影的評價總體上是正面的。但少量數據會造成結論的片面性,所以將所有評論的情感分析結果數值進行平均,使用mean()函數,結果數值高達0.9,這體現(xiàn)了該影片的口碑。

表2 部分數據情感數值表
然后觀察其中位數,結果為0.99,這意味著該電影符合大多數人的偏好。但是也存在著極少數觀眾對該電影有很大的意見,產生了嚴重的負面評價,從而拉低了整體的電影口碑水平。
通過時間序列可視化功能,直觀查看這些負面評價出現(xiàn)在什么時間,及情感數值低的原因。利用ggplot繪圖工具包繪制關于時間序列的輿情分析數值圖,如圖4所示。

圖4 關于時間序列的情感數值分析圖
從圖4中可以看出,很大一部分評論的情感分析數值很高,即大部分觀眾對電影有著正面的評價,表示對電影非常滿意。但是,也發(fā)現(xiàn)有一些數值極低的點,即其對應的觀眾評論的情感傾向是負面的。利用sort()函數對情感分析數值進行升序排列,結果顯示前5條評論的情感分析數值幾乎為0,并且發(fā)現(xiàn)其對應的負面評價內容主要是對該電影劇情邏輯的批評,認為該電影的劇情毫無邏輯。利用tail()函數查看情感分析數值最高的幾條評論,發(fā)現(xiàn)對應的正面評價內容主要是對電影具有的愛國主義及吳京演技為焦點進行評價的,基于此,可以了解到觀眾喜愛該電影的原因。由于這部電影的上映時間距建軍節(jié)僅差3天,且接連不斷的國家大事出現(xiàn),使得大眾的愛國情緒高漲,而這部電影剛好符合當時大眾的心理,所以導致電影受到歡迎。
通過對評論文本聚類,將不同話題的評論歸入不同的簇,并在需要的時候建立新的簇,從而快速發(fā)現(xiàn)有用的信息,有助于了解網絡輿情概況。
(1) 將原文本進行分詞、去除停用詞。此部分主要對評論進行去除非中文字符、分詞+標注、去除停用詞。首先使用正則表達式除去非中文字符,然后進行結巴分詞和詞性標注(需要用到jieba庫),最后去除停用詞[10-12]。
其步驟是:返回結果是一個Series對象,即每條評論的分詞結果,實現(xiàn)如下:
import jieba.posseg as pseg
def proc_text(raw_line):
filter_patter=re.compile(′[^u4E00u9FD5]+′)
chinese_only=filter_patter.sub(′′, raw_line)
words_lst = pseg.cut(chinese_only)
meaninful_words = []
for word, flag in words_lst:
if word not in stopwords:
meaninful_words.append(word)
return ′ ′.join(meaninful_words)
(2) 統(tǒng)計詞頻。首先,將評論的分詞變成列表對象;然后,將數據集中的所有單詞放入到一個列表中并計算詞頻;最后,統(tǒng)計詞頻取出最常用的200個詞,most_common(200)函數,部分結果如表3所示:

表3 最常用的部分詞詞頻表
(3) 特征提取(tf-idf特征)。主要對評論進行特征提取。選用逆文檔頻率(tf-idf)進行特征提取[10],將每條評論向量化一遍后期聚類使用,定義一個特征提取函數,結果返回tf-idf矩陣,矩陣中行是評論數,列為200個常用詞特征。
實現(xiàn)如下:
def extract_feat (text_df, text_collection,common_words_freqs):
n_sample = text_df.shape[0]
common_words = [word for word, _ in common_words_freqs]
tf_idf_X = np.zeros([n_sample, 200])
i=0
for r_data in text_df:
text = r_data
tf_idf_feat_val_list = []
if i <= n_sample:
for word in common_words:
if word in text:
tf_idf_val=text_collection
tf_idf(word, text)
else:
tf_idf_val = 0
tf_idf_feat_val_list.append(tf_idf_val)
tf_idf_X [i,:]=np.array(tf_idf_
feat_val_list)
i += 1
return tf_idf_X
(4) 計算評論文本間的相似度
計算評論間的相似度,直接使用python庫中的函數cosine_similarity進行求解,得到相似度矩陣,其行列數均為評論條數。
(5) K-Means聚類原理及實現(xiàn)
實現(xiàn)過程中,利用sklearn的KMeans庫,對上述產生的tf_idf矩陣進行訓練,K取值10:
from sklearn.cluster import KMeans
num_clusters = 10
km = KMeans(n_clusters=num_clusters)
%time km.fit(tf_idf_X)
clusters = km.labels_.tolist()
利用 joblib.dump pickle 模型(model)對上述模型進行保存,起持久化作用:
from sklearn.externals import joblib
joblib.dump(km, ′comment_cluster.pkl′)
km = joblib.load(′comment_cluster.pkl′)
clusters = km.labels_.tolist()
選取n(n=10)個離聚類質心最近的常用詞對聚類進行索引,得到如表4所示的結果:

表4 評論聚類結果表
由上述的聚類結果可知:聚類9中的關鍵詞不錯、情節(jié)、高等顯示了該類中的觀眾對電影有著正面評價;聚類4中的關鍵詞大都與愛國主義有關,這顯示了該類中觀眾的關注點是該電影所具有的愛國主義情節(jié);而聚類5、7中的關鍵詞表示該類中的觀眾認為電影情節(jié)毫無邏輯性,對這部電影不太滿意。
本案例詮釋了機器學習解決實際問題過程中的數據爬取、數據清理、特征提取、數據分析與處理的完整過程,通過對大數據環(huán)境下輿情分析的研究實現(xiàn),使學生掌握如何使用機器學習方法從大量的無序數據中提取有用信息。該案例結合社會熱點問題,體現(xiàn)課程特點,具有較好的深度和綜合性,能幫助學生通過案例的學習,加深理解和掌握課程涉及的理論,并能在實際工作中正確應用。