劉子謙 王志強
1. 北京電子科技學(xué)院,北京市 100070 2. 國家信息中心,北京市 100045
隨著互聯(lián)網(wǎng)的發(fā)展,大量網(wǎng)民通過自媒體平臺發(fā)表個人聲音,也給輿情監(jiān)控帶來了新的挑戰(zhàn)。 微博上大量碎片化信息蘊含著潛在價值,通過分析可以了解民眾所關(guān)心的社會熱點話題,有效監(jiān)控輿情動態(tài)。 政府、企業(yè)也能及時引導(dǎo)失實言論,防止輿情進一步惡化,維護其社會公信力。
然而,一方面,微博制定的反爬蟲策略限制用戶訪問頻率,數(shù)據(jù)獲取難度大;另一方面,微博語言具有碎片化、多樣性、凝練性等特點[1],增大了情感分析的難度。 同時由于我國互聯(lián)網(wǎng)發(fā)展較晚,網(wǎng)絡(luò)輿情監(jiān)控方面的研究也較晚,且成果參差不齊[2]。 以影響力較大的“微熱點”網(wǎng)站為例,其關(guān)鍵詞搜索功能有明顯缺陷,不能自定義時間段搜索數(shù)據(jù),并且無法導(dǎo)出博文,不支持智能情感分析,用戶只能查看該關(guān)鍵詞對應(yīng)的熱度,卻無法得知網(wǎng)友的情感動態(tài)。 文章解決了以上兩個問題并針對現(xiàn)有輿情監(jiān)控平臺的缺陷進行了改進,從博文抓取、情感分析、數(shù)據(jù)處理、可視化展示四個方面出發(fā),設(shè)計了一個基于網(wǎng)絡(luò)爬蟲和文本處理的微博輿情分析系統(tǒng)。
本文程序包括四部分:數(shù)據(jù)抓取模塊,文本處理模塊,數(shù)據(jù)分析模塊和數(shù)據(jù)可視化模塊。 程序架構(gòu)如圖1 所示。
數(shù)據(jù)抓取采用了網(wǎng)絡(luò)爬蟲技術(shù),網(wǎng)絡(luò)爬蟲技術(shù)(Web crawler)是指自動化獲取網(wǎng)頁數(shù)據(jù)程序或腳本。 它從給定的網(wǎng)頁出發(fā),分析目標(biāo)網(wǎng)頁結(jié)構(gòu),進而獲取指向其他網(wǎng)頁的URL,再繼續(xù)選擇并搜索下一個站點[3]。 由于Python 語法結(jié)構(gòu)簡潔,并擁有requests、selenium 等出色的第三方爬蟲庫,因此本文選擇Python 作為爬蟲語言。 根據(jù)微博網(wǎng)站的高級搜索功能,程序提供了多種數(shù)據(jù)篩選模式,用戶可以根據(jù)內(nèi)容、時間、地點、博主類型等進行定向搜索,提升數(shù)據(jù)價值和獲取效率。 高級搜索設(shè)置界面和數(shù)據(jù)抓取整體程序框架如圖2、圖3 所示。
然而微博設(shè)計了反爬機制,用戶只有登錄后才能瀏覽微博信息。 微博服務(wù)器會向登錄用戶發(fā)送一個Cookies,當(dāng)他繼續(xù)訪問微博其他網(wǎng)頁時,Cookies 將被瀏覽器添加到請求頭并發(fā)送到服務(wù)器,服務(wù)器可以通過Cookies 識別用戶身份。 因此,獲取有效Cookies 成為突破微博反爬蟲策略的關(guān)鍵。
由于微博Cookies 的有效時間較短(通常為幾天),直接復(fù)制瀏覽器請求頭效率低并會影響用戶使用體驗。 針對此問題,本系統(tǒng)設(shè)計了賬號密碼登錄、二維碼登錄、讀取本地Cookies 三種模擬登錄機制。
微博對賬號密碼登錄和二維碼登錄接口都設(shè)計了較強的反爬,前者使用算法對數(shù)據(jù)進行加密傳輸;后者只有用戶點擊“二維碼登錄”按鈕后,才會加載二維碼。 本文選擇了Selenium 爬蟲框架。 Selenium 是一個開源的瀏覽器自動化測試框架,安裝對應(yīng)的驅(qū)動程序后,可以操控包括Chrome、Firefox 在內(nèi)的主流瀏覽器。 其特點是能模擬用戶真實操作,難以被服務(wù)器判識為爬蟲。 同時Selenium 支持多種交互模式,比如模擬鼠標(biāo)點擊,填充網(wǎng)頁輸入框等;也支持多種元素定位方法,如XPath、CSS、Selector 等,因此能實現(xiàn)模擬真實用戶輸入密碼、點擊登錄按鈕或點擊二維碼登錄按鈕。 程序只需要時刻判斷當(dāng)前鏈接變化,即可判斷用戶是否登錄成功。 若登錄成功則抓取當(dāng)前Cookies。 并詢問用戶是否存儲到本地,方便下一次直接調(diào)用。 具體流程圖如圖4 所示。
為了提高抓取效率,本文使用Python 的thread 庫實現(xiàn)多線程數(shù)據(jù)抓取,并在確定URL后,根據(jù)用戶設(shè)置的線程數(shù),將任務(wù)平均分配到每個線程。 微博對每個IP 設(shè)置了訪問頻率限制,多線程訪問速度過快易觸發(fā)微博反爬,因此每次抓取時程序會自動設(shè)置到89 免費代理網(wǎng)(http:/ /www.89ip.cn/)抓取代理IP 列表,每個線程使用不同的代理IP,從而有效繞開反爬,提高程序穩(wěn)定性和抓取效率。
Selenium 模塊會調(diào)用瀏覽器引擎,因此訪問網(wǎng)頁時會和真實用戶一樣加載圖片等無用數(shù)據(jù),導(dǎo)致數(shù)據(jù)抓取速度過慢,因此程序采用了更加高效的requests 庫。 Requests 是Python 出色的爬蟲庫之一,基于urllib 標(biāo)準(zhǔn)庫編寫,擁有比urllib庫更簡潔的語法,極大提高編程效率。 使用requests 庫訪問事先確定的URL,并發(fā)送包含User-Agent 和Cookies 的請求頭,即可繞開微博反爬并獲取網(wǎng)頁信息。
根據(jù)微博網(wǎng)頁的類型,程序的網(wǎng)頁解析模塊使用了BeautifulSoup 庫和re 庫(正則表達(dá)式)。BeautifulSoup 庫擁有l(wèi)xml、html5lib、html.parser等多種解析器,可以解析HTML 格式或XML 格式的數(shù)據(jù),使之結(jié)構(gòu)化格式化,進而從中提取目標(biāo)信息[4]。 經(jīng)BeautifulSoup 庫解析獲取的網(wǎng)頁數(shù)據(jù)往往夾雜亂碼,而Re 庫可以對字符串進行多種自定義處理,進一步清洗數(shù)據(jù)。 在獲得包括微博內(nèi)容、發(fā)布時間、點贊量、評論量等信息的同時,程序還會抓取每條博文對應(yīng)的博主ID,進而構(gòu)造出博主主頁鏈接。 為了進一步提高數(shù)據(jù)價值,分析關(guān)注該微博熱點的發(fā)布者情況,每抓取完一頁博文后,程序會自動遍歷博主鏈接列表,抓取所有博主的個人信息。
同時,系統(tǒng)設(shè)計了數(shù)據(jù)存儲模塊,通過創(chuàng)建SQLAlchemy 庫中的create_engine 對象根據(jù)用戶配置連接到MySQL 數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)存儲。 為了提升用戶使用體驗,程序會自動在本地保存上一次的數(shù)據(jù)庫用戶密碼配置,并創(chuàng)建連接。 用戶設(shè)置界面如圖5 所示,未安裝數(shù)據(jù)庫的用戶也可選擇導(dǎo)出到Excel。
文本情感分析(又稱為傾向性分析)是對有情感色彩的主觀性文本進行分析、處理、歸納和推理預(yù)測的過程[5]。 SnowNLP 是基于深度學(xué)習(xí)的Python 第三方庫,可以方便處理中文文本,支持中文分詞、詞性標(biāo)注、情感分析、文本分類等。其情感分析模塊利用貝葉斯模型統(tǒng)計文本中特征詞詞頻,進行訓(xùn)練和預(yù)測。 由于該庫的默認(rèn)模型訓(xùn)練集是某電商評論數(shù)據(jù),其語言特征和微博博文有很大差距,會導(dǎo)致程序預(yù)測結(jié)果誤差較大,因此需要使用微博數(shù)據(jù)重新訓(xùn)練模型再進行情感分析。
為了使模型更精確,本文使用系統(tǒng)的“高級搜索”功能,抓取了2020 年4 月到7 月的十二萬余條微博博文,覆蓋國際、科技、娛樂、社會等熱點話題,也包含了最近的網(wǎng)絡(luò)流行語。 之后,使用re 庫(正則表達(dá)式)對博文中數(shù)據(jù)進行處理,刪除連續(xù)字符、表情、鏈接等。 并根據(jù)博文的情感色彩,人工剔除情感不鮮明的數(shù)據(jù),并分成兩組,每兩條微博間用回車隔開,分別命名為neg.txt 和pos.txt,每個文件約有60000 條微博。利用SnowNLP 庫提供的訓(xùn)練接口,可方便地訓(xùn)練模型。只需要
調(diào)用save 方法即可保存模型后,修改SnowNLP 庫__init__.py 文件中的data_path 的值,使之指向剛剛訓(xùn)練生成的文件,即可實現(xiàn)默認(rèn)情感分析模型的更改。 經(jīng)過測試,新模型的預(yù)測效果明顯優(yōu)于原先默認(rèn)的模型。
每爬取完一張網(wǎng)頁后,程序會循環(huán)遍歷博文列表,清洗博文,去除微博特有的停用詞(如“回復(fù)”,“轉(zhuǎn)發(fā)”等),再調(diào)用SnowNLP 的sentiment方法,根據(jù)訓(xùn)練好的模型給出情感評分,評分越高說明該文本情感“越積極”。 最后將該情感評分存儲到列表。
除了豐富的爬蟲庫,Python 還有眾多出色的數(shù)據(jù)處理庫,Pandas 就是其中之一。 Pandas 經(jīng)常被用于科學(xué)計算和數(shù)據(jù)分析,同時可以快速讀取數(shù)據(jù)庫或Excel 中的數(shù)據(jù)并轉(zhuǎn)換為DataFrame類型;DataFrame 是Pandas 中的一個表結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),包括三部分信息,表頭,表的內(nèi)容(二維矩陣),索引,這與程序中需要表示的數(shù)據(jù)結(jié)構(gòu)非常契合,而且比起EXCEL 和數(shù)據(jù)庫中的表,Pandas 提供了大量基于DataFrame 的數(shù)據(jù)分析方法以及眾多與外部數(shù)據(jù)進行交換的方式[6]。在處理時間方面也有獨特的數(shù)據(jù)結(jié)構(gòu):“時間序列”,能智能識別多種時間格式,從而對微博發(fā)布時間進行重采樣運算,實現(xiàn)對博文發(fā)布量的時間統(tǒng)計;使用分類匯總算法可以對某一省份微博發(fā)布量進行匯總,統(tǒng)計微博發(fā)布的全國分布;同時Pandas 核心使用Cython 編寫,能將列表、字典等數(shù)據(jù)類型轉(zhuǎn)換為對應(yīng)的C 語言數(shù)據(jù)類型,有效解決Python 運算速度慢的問題。 因此,使用Pandas 可以快速統(tǒng)計千萬條博文的博主性別比例、博文的時間發(fā)布量等,根據(jù)博主性別分類匯總情感評分,并分別計算出男女博主的情感平均值。
使用詞云圖實現(xiàn)文本數(shù)據(jù)可視化。 通過詞云圖展示微博博文能讓關(guān)鍵詞一目了然,用戶可以快速了解該關(guān)鍵詞對應(yīng)社會熱點的相關(guān)信息。生成詞云圖的關(guān)鍵是提取關(guān)鍵詞,主要通過分詞、去停用詞和詞頻統(tǒng)計實現(xiàn)。 分詞技術(shù)是將文本中連續(xù)的字按預(yù)先設(shè)計的算法分隔為不連續(xù)的詞的過程[8]。 由于中文詞之間沒有天然的分隔符,詞邊界相對模糊,甚至同一文本有多種不同的分詞方式,處理難度遠(yuǎn)大于英文[9]。 在眾多分詞庫中,jieba 分詞效果最好,功能最為強大。 擁有精準(zhǔn)模式(無冗余)、全模式(返回全部可能的分詞情況)、搜索引擎模式(在精準(zhǔn)模式基礎(chǔ)上對長詞進行二次切分)三種分詞模式,可以滿足多種場合分詞需求。 由于微博多采用網(wǎng)絡(luò)語言,無意義的停用詞較多,本文程序?qū)⒆x取事先整理的停用詞詞典:ChineseStopWord.txt 對jieba 返回的分詞列表進行清洗,僅保留關(guān)鍵詞。
Wordcloud 是Python 的一個詞云圖庫,可以自動統(tǒng)計詞頻,開發(fā)者只需將關(guān)鍵詞數(shù)據(jù)以字符串格式(關(guān)鍵詞之間用空格隔開) 傳入Wordcloud 函數(shù),即可生成詞云圖。 同時該庫允許用戶自定義詞云圖形狀、文字色調(diào)、文字大小等。
其他數(shù)據(jù)通過圖表方式展示。 Pandas 自帶了基于Matplotlib 的可視化接口,支持多種圖表格式,但風(fēng)格單調(diào)。 Echarts 是一個免費的可視化庫,基于Javascript 開發(fā),可以生成動態(tài)交互式圖表,并支持個性化風(fēng)格設(shè)計[7]。 第三方庫Pyecharts 能直接使用Python 語言生成Echarts 圖表并支持pip 安裝。
Pyecharts 生成的可交互圖表為HTML 格式,同時pyqt5 提供了谷歌內(nèi)核的QwebEngine控件,可以將本地HTML 文件加載到UI 界面,最終實現(xiàn)動態(tài)圖表展示。
本文以“許可馨事件”為關(guān)鍵詞,抓取3 月30 日到8 月17 日一萬余條微博數(shù)據(jù),分析博文的情感和發(fā)布量的時間變化規(guī)律,并對博主信息進行了統(tǒng)計。 數(shù)據(jù)抓取結(jié)果如圖6 所示。
對每條博文的發(fā)布時間使用resample 方法按天進行重采樣,得到微博-時間統(tǒng)計圖,如圖7所示。 從圖中可以直觀看出“許可馨事件”的熱度和公眾情感走向,六月份以后熱度明顯降低,而博文情感始終維持在較低水平。
對微博發(fā)布時間按小時重采樣,可以得到微博發(fā)布的小時分布規(guī)律和情感變化規(guī)律。 如圖8所示。 對“許可馨事件”較為關(guān)注的人群大多在夜間(20:00—0:00)發(fā)布微博。 日間情感略好于夜間。
分別計算所有博主、男性博主、女性博主的情感評分均值和博主性別比例并繪制水球圖和餅圖,可以粗略反映不同網(wǎng)民對熱點事件的情感態(tài)度。 生成的圖表分別如圖9、圖10 所示。 從中可以明顯看出,網(wǎng)友情感比較消極,并且男性情感明顯低于女性,且發(fā)文博主中超過70%為男性,男性對“許可馨事件”的關(guān)注度更高。
根據(jù)所在地對博主進行分類匯總并計數(shù),即可得到該熱點話題的省份關(guān)注規(guī)律。 Pyecharts提供了多種地理空間圖表接口,包括世界地圖、中國地圖以及中國全部省份和部分城市地圖,可以輕松繪制博主分布熱力圖。 具體效果如圖11所示。
去除所有博文停用詞后,繪制的詞云圖如圖12 所示。 從中可以直觀看出博文的關(guān)鍵詞。
UI 設(shè)計(User Interface Design)指面向電子產(chǎn)品的界面設(shè)計[10],用戶使用體驗是UI 設(shè)計的起點和終點。 優(yōu)秀的UI 設(shè)計能讓用戶使用習(xí)慣的交互方式進行操作[11],為用戶帶來可靠和愉悅的交互體驗。 對此,本程序設(shè)計了簡單易用、美觀簡潔的用戶操作界面,合理布局按鈕,添加多個容錯機制和等待交互機制,同時提高程序穩(wěn)定性,解決了多種因素導(dǎo)致的“閃退”問題。 同時,本文對圖表進行了美化處理,并將他們放到同一個頁面上,直觀展示各個數(shù)據(jù)特征,最終實現(xiàn)效果如圖13 所示。
面對復(fù)雜多變的網(wǎng)絡(luò)輿情形勢,快速準(zhǔn)確分析輿情動態(tài)變得尤為重要。 本文使用Python 爬蟲和數(shù)據(jù)處理庫,設(shè)計了一套多線程輿情監(jiān)控方法:將selenium 框架和requests 庫同時使用,既能突破微博反爬、也保證了數(shù)據(jù)抓取的高效;使用snowNLP 訓(xùn)練模型對博文進行情感分析;使用運算速度更快的pandas 進行數(shù)據(jù)處理;通過pyecharts 能為用戶進行可視化展示。 與此同時,本程序情感分析模型準(zhǔn)確率、程序穩(wěn)定性、數(shù)據(jù)抓取速度等有待提高,未來將優(yōu)化深度學(xué)習(xí)算法,完善容錯機制,進一步提升用戶體驗和程序?qū)嵱眯浴?/p>