孫 曉, 葉嘉麒, 唐陳意, 任福繼
(合肥工業(yè)大學(xué) 計算機與信息學(xué)院,安徽 合肥 230009)
新浪微博在發(fā)展初期,主要采用國外的Twitter的發(fā)展模式。但隨著發(fā)展而表現(xiàn)出的個性化差異,讓新浪微博增加了更多適應(yīng)于中國用戶的客戶體驗。
新浪微博擁有龐大數(shù)目的用戶群體基礎(chǔ),日均微博總發(fā)送量維持在5 000×104~1×108條之間。用戶狀態(tài)、用戶關(guān)注及粉絲等信息已經(jīng)成為非常龐大且具有價值的數(shù)據(jù),如何去獲得及處理這些數(shù)據(jù),成為十分熱門和值得關(guān)注的研究方向[1-3]。文獻[4]以新浪微博為基礎(chǔ),對網(wǎng)絡(luò)輿情進行分析研究;文獻[5]以姚晨微博為例研究微博傳播機制;文獻[6]對微博用戶行為特征與關(guān)系特征進行實證分析;文獻[7]介紹了早期新浪微博數(shù)據(jù)挖掘方案及獲取新浪微博數(shù)據(jù)的2種方法,即利用新浪微博API和網(wǎng)絡(luò)爬蟲解析微博網(wǎng)頁獲得數(shù)據(jù),并對2種方法進行了對比測試;文獻[8]將Twitter與中國本土微博服務(wù)進行比較,重點討論了微博服務(wù)所具有的研究價值;文獻[9]在Twitter上以話題敏感度為基礎(chǔ),研究轉(zhuǎn)發(fā)路徑上具有影響力的用戶,并引入主題-內(nèi)容相關(guān)的方法分析影響力;文獻[10]在Twitter數(shù)據(jù)獲取上提出了基于Twitter List API和Lookup API的大量用戶數(shù)據(jù)采集方案;文獻[11]嘗試通過關(guān)鍵詞生成來挖掘中文微博的興趣點。
本文嘗試提出利用新浪微博API(OAuth2.0認證)以及利用網(wǎng)絡(luò)爬蟲的多策略方法解析weibo.com和weibo.cn協(xié)同工作的方案,實現(xiàn)新浪微博數(shù)據(jù)的高效抓取,在最大程度上以有限的權(quán)限持續(xù)獲得有效數(shù)據(jù),并對網(wǎng)絡(luò)爬蟲的可行性進行測試,完善爬行策略。另外,利用SVM訓(xùn)練微博情感模型,對熱門話題進行趨勢分析與情感傾向性判斷。
Web2.0時代的到來,使平臺開放成為目前的發(fā)展趨勢,越來越多的產(chǎn)品走向開放,新浪API也不例外。開發(fā)者可以通過向固定的網(wǎng)絡(luò)地址提交參數(shù),服務(wù)器返回請求數(shù)據(jù)給開發(fā)者的應(yīng)用程序使用。相比網(wǎng)絡(luò)爬蟲方式獲取數(shù)據(jù),新浪微博開放API接口使用更加簡潔方便和高效。
在 OAuth2.0標(biāo)準(zhǔn)[12]下調(diào)用新浪微博 API,主要有直接在URL使用參數(shù)傳遞訪問及將參數(shù)加入請求頭內(nèi)進行訪問。
OAuth2.0授權(quán)下API返回的均為JSON格式數(shù)據(jù),JSON是一種輕量級的數(shù)據(jù)交換格式,文件不具有明顯的強結(jié)構(gòu)特征。即使在復(fù)雜的JSON對象中,電腦均能根據(jù)需要處理JSON格式中的數(shù)據(jù)。
在使用API之前,需要了解新浪微博API的接口定義及各個參數(shù)含義,新浪微博接口限制用戶每個小時只能請求一定的次數(shù)。
頻繁地調(diào)用API會導(dǎo)致暫時無法從API獲得數(shù)據(jù),所有請求都會無任何返回。為了避免過高頻率訪問新浪API接口,一方面可以通過新浪接口實時查詢當(dāng)前剩余訪問次數(shù),另一方面,需要對程序進行線程控制,以平均訪問頻率。
新浪SDK中封裝了眾多從授權(quán)到數(shù)據(jù)獲取的各功能程序,SDK建立在API基礎(chǔ)之上,基于SDK的工程可以大大降低程序開發(fā)工作量。目前,已有Java、C++、Python等13種不同語言版本,這些SDK版本還在不斷地完善中,功能性與穩(wěn)定性也在不斷加強,對于常規(guī)的API訪問需求完全可以滿足要求。但其中也存在一些漏洞和不完善的地方,所以對于某些需要定制的數(shù)據(jù)服務(wù),還需要直接從API基礎(chǔ)上進行擴展,并且可以根據(jù)具體問題的需求進行擴展。
通過調(diào)用API接口可以實現(xiàn)新浪微博數(shù)據(jù)的便捷獲取和解析,伴隨著大數(shù)據(jù)時代的來臨,數(shù)據(jù)量成為衡量的新標(biāo)準(zhǔn),新浪在一系列的更新與改革中添加了更多的限制。例如,API中單位時間訪問次數(shù)的限制,部分API接口需要更高級的權(quán)限才能訪問,部分查詢功能根本沒有公開API接口等。因此,本文將研究方向轉(zhuǎn)向利用多策略網(wǎng)絡(luò)爬蟲與網(wǎng)頁解析技術(shù)來獲取更多微博信息的途徑上。
網(wǎng)頁版微博分為PC端瀏覽器微博與手機版網(wǎng)頁微博,兩者并非完全一致。通過對登陸頁面的源碼分析可知,2種登陸方式完全不同。
在使用爬蟲對指定微博頁面爬取之前,無論從weibo.cn還是從weibo.com的策略模式上獲取數(shù)據(jù),都需要先解決通過網(wǎng)頁登陸的問題。
在手機微博(http://weibo.cn)站點上,對提交表單分析后可知,weibo.cn登陸時用戶名密碼屬于明文傳輸,提交的表單中主要參數(shù)為password的name值,vk的value值。通過登陸成功后獲得的Cookies可以繼續(xù)訪問其他微博的內(nèi)容,weibo.cn返回頁面的編碼格式為UTF-8。
在成功登陸后,登陸所返回的Cookie中包含一個gsid字段,以get方式在網(wǎng)址中加入此參數(shù),就能以該用戶的身份去訪問新浪微博。
在新浪微博PC網(wǎng)頁端(http://weibo.com)上模擬登陸,流程基本一致,加上新浪微博的不斷更新版本,操作比在手機微博上模擬登陸復(fù)雜。
在新浪微博網(wǎng)頁端登錄,先要請求預(yù)登陸prelogin-url的鏈接地址,使用get方法得到返回的數(shù)據(jù),從中提取servertime、nonce、pubkey和rsakv值作為備用數(shù)據(jù)。網(wǎng)頁提交的表單中用戶名為base64編碼后的值,密碼的編碼方式已經(jīng)替換為RSA加密方式,之前的登陸密碼編碼方式是對password經(jīng)過3次SHA加密,且在其中加入了servertime和nonce的值來混淆。當(dāng)前新浪微博登陸已經(jīng)更新加密方式為RSA加密,使用返回的JSON數(shù)據(jù)中的pubkey及rsakv對passwd進行RSA加密得到。
新浪微博的RSA加密過程[13]如下:
(1)先創(chuàng)建一個rsa公鑰,公鑰的2個參數(shù)新浪微博都給了固定值,均為16進制字符串,轉(zhuǎn)換一下進制即可,2個參數(shù)分別為pubkey和js加密文件中的10001。
(2)步驟(1)加密過程后,需要向通行證地址http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)請求數(shù)據(jù),其中加入?yún)?shù)rsakv,將pwencode值修改為rsa2,其余根據(jù)表單需要的name對應(yīng)找到value,使用post方法提交,當(dāng)response中的retcode值為0時,表明登陸成功。
(3)登陸后獲得Cookies可以繼續(xù)訪問其他微博的內(nèi)容。在使用爬蟲時還發(fā)現(xiàn),在weibo.com上請求返回頁面的內(nèi)容中,中文字符經(jīng)過了Unicode 1次編碼,網(wǎng)址經(jīng)過了Unicode 2次編碼,需要轉(zhuǎn)碼才能夠讀取。
對于2種不同途徑登陸的新浪微博,獲取的數(shù)據(jù)具有不同的特征和限制。
圖1所示為Uid庫建立的流程圖。用戶個人信息字段見表1所列,用戶微博信息字段見表2所列。
圖1 用戶資料庫建立程序流程圖
對于微博信息的實驗與分析,需要大量完整的數(shù)據(jù)包。
表1 用戶個人信息字段
表2 用戶微博信息字段
對于單個用戶,其唯一標(biāo)識為微博用戶Uid,通過Uid可以獲取用戶的個人信息及粉絲列表,關(guān)注列表甚至新版微博中的心情投票值。但是對于大規(guī)模的微博用戶信息獲取,首先需要數(shù)量龐大的Uid作為爬蟲程序的入口。對于這個問題,可以采用先人工收集篩選一部分質(zhì)量比較好的微博Uid,例如1 000個,然后以1 000個Uid作為基數(shù),通過API獲取其各自的粉絲Uid列表,對這些Uid進行去重處理,擴充整個Uid庫,幾次循環(huán),直至達到閾值設(shè)定的數(shù)量。從Uid庫中可以利用爬蟲進行數(shù)據(jù)爬取,雖然效率相對較低,但可以持續(xù)獲得大量的有效數(shù)據(jù),比API具有更高的靈活性。在獲取一定量的微博用戶與用戶微博的基礎(chǔ)上,可以開展用戶關(guān)系分析、微博傳播途徑分析及關(guān)鍵微博分析等任務(wù),這些任務(wù)在社交關(guān)系與輿論分析上都具有比較重要的研究價值。
中文微博文本情感分析主要分為文本預(yù)處理、情感信息抽取和情感分類,其中情感信息抽取分為情感詞、主題和關(guān)系的抽取。微博主觀文本情感分類方法主要是基于語義詞典的情感計算和基于機器學(xué)習(xí)的情感分類[14]。
目前,基于SVM(support vector machine,簡稱SVM)的機器學(xué)習(xí)方法在中文微博情感極性判斷上被廣泛應(yīng)用。
SVM是一種基于統(tǒng)計機器學(xué)習(xí)理論的模式識別方法,主要用于模式識別領(lǐng)域。本文使用的SVM工具是由臺灣大學(xué)林智仁博士等開發(fā)的一套支持向量機算法庫Libsvm。
中文微博文本長度被限制在140個中文字符,可以包含多個句子,不同短句之間的情感極性不盡相同,如果把整句句子賦予一種極性可能會影響訓(xùn)練效果。更加網(wǎng)絡(luò)化的詞匯、網(wǎng)絡(luò)新詞層出不窮,成為一段時間內(nèi)的流行語,具有更深層次的含義,例如,“打醬油”、“放棄治療”、形式多樣的表情及比較隨意的表達方式等,這些都是在中文微博情感分析過程中需要認真考慮的因素。文獻[15]在微博語料上,對于表情符號規(guī)則方法、情感詞典規(guī)則方法及SVM層次結(jié)構(gòu)的多策略方法進行了探索研究,并進一步詳細分析了方法特征。其實驗結(jié)果顯示,與前2種規(guī)則方法相比,基于SVM層次結(jié)構(gòu)多策略的方法效果最好。本文將采用訓(xùn)練多個SVM分類器的方法,對話題微博文本進行情感傾向性判斷。
訓(xùn)練語料庫采用NLPCC2013會議在中文微博情緒識別測試中提供的樣例數(shù)據(jù),共4 000句,已標(biāo)注整句及分句情感。情感詞典采用Hownet情感詞表及大連理工情感詞匯本體庫;停用詞表為哈工大停用詞表。訓(xùn)練SVM分類器過程如下:
(1)按照主客觀分類特征描述方法,從訓(xùn)練語料的微博內(nèi)容中提取主客觀分類特征,訓(xùn)練主客觀 SVM 分類器[15]。
(2)從訓(xùn)練語料分句中提取極性分類特征,特征詞選擇采用卡方公式統(tǒng)計,即
其中,w為候選詞;e為詞w所在句子的情感傾向性;A為包含詞w并且屬于e類情感的評論或微博數(shù);B為包含詞w但不屬于e類情感的評論或微博數(shù);C為不包含詞w但屬于e類情感的評論或微博數(shù);D為不包含詞w且不屬于e類情感的評論或微博數(shù)。
特征詞產(chǎn)生后,利用TF-IDF產(chǎn)生特征詞的權(quán)重,然后根據(jù)每條微博的正負向情感標(biāo)簽訓(xùn)練SVM分類器。
測試機器為SONY CS36筆記本,Inter core P8700雙核,4 GB內(nèi)存,Windows7平臺下 E-clipse EE,程序由Java開發(fā)實現(xiàn),接入網(wǎng)絡(luò)為10 MB共享教育網(wǎng)。
本文提出了基于新浪微博API與網(wǎng)絡(luò)爬蟲的2大類共3種新浪微博數(shù)據(jù)獲取方案。測試中首先人工選擇100位粉絲超過5 000人的新浪微博用戶,以保證用戶的所有數(shù)據(jù)均可以通過API和網(wǎng)絡(luò)爬蟲正確獲取。
新浪微博API最多只能返回5 000名粉絲的Uid信息,在weibo.com上只能查詢到1 000名粉絲Uid信息,在weibo.cn上和API方式一樣,能查詢到5 000名粉絲Uid信息。表3所列為100個用戶的粉絲Uid信息查詢返回大小對比,在測試中,JSON是基于API的查詢結(jié)果。
表3 用戶粉絲查詢文件大小對比
相比于通過API獲取用戶粉絲,可以發(fā)現(xiàn)網(wǎng)絡(luò)爬蟲方式獲取的數(shù)據(jù)更加龐大,在獲取同樣數(shù)量粉絲的前提下,文件體積要大近百倍。這是因為網(wǎng)絡(luò)爬蟲保留了Html源文件文本中的大量地址信息及Javascript標(biāo)簽等內(nèi)容,因此,通過網(wǎng)絡(luò)爬蟲的方式解析用戶狀態(tài)效率,遠小于通過調(diào)用API方式得到用戶信息的方式。
從API訪問獲取數(shù)據(jù)的限制可以由新浪微博開放平臺直接得到,從API文檔中還能發(fā)現(xiàn),新浪微博API不提供關(guān)鍵詞搜索這一功能。
對于weibo.com及 weibo.cn上的訪問限制,并沒有一個很明確的數(shù)據(jù),故設(shè)計了相關(guān)的爬蟲程序,用來最大限度接近單賬號登陸后的極限訪問次數(shù)。實驗結(jié)果見表4所列。從中可以看出,在網(wǎng)頁weibo.com上,登陸后對于用戶資料與用戶微博的獲取不受限制,因此,可以作為構(gòu)建微博用戶資料庫的數(shù)據(jù)獲取途徑。而手機weibo.cn也可以作為數(shù)據(jù)獲取途徑,作為輔助數(shù)據(jù)來源。對于應(yīng)用爬蟲對關(guān)鍵詞信息的搜索數(shù)據(jù)獲取,新浪微博具有相應(yīng)的限制,與API的不提供相比,已經(jīng)能夠獲取部分數(shù)據(jù)。對于此限制,可以通過構(gòu)建賬號池的方式獲得大量數(shù)據(jù)。
表4 爬蟲限制
2013年上半年,對于食品安全的話題在微博上經(jīng)常出現(xiàn)。本實驗以上海地區(qū)死豬事件的關(guān)鍵詞為例,進行各省份和地區(qū)微博關(guān)鍵詞搜索,采集時間為2013年3月3日至2013年4月5日。由于新浪微博API不提供相應(yīng)接口,故實驗首先注冊一系列微博賬號,再通過爬蟲獲取34個省份及地域下的微博內(nèi)容,進行抽樣統(tǒng)計分析。共采集微博68 000余條,經(jīng)過整理后,微博數(shù)據(jù)的省份和地區(qū)分布如圖2所示。
從圖2中可知,死豬事件在上海、北京、廣東、江蘇、浙江的微博數(shù)量比較多,其中上海、江蘇、浙江、廣東為死豬事件影響地區(qū),北京地區(qū)數(shù)量較多是因為主要政府部門位于北京地區(qū),對于死豬事件的調(diào)查過程以及結(jié)果公布主要通過官方微博等途徑發(fā)布。其他省份和地區(qū)的微博數(shù)量基本均衡,可見各地均對食品安全事件有著較高的關(guān)心程度。
除了微博的省份和地區(qū)分布以外,還對微博發(fā)布時間進行了統(tǒng)計,如圖3所示。從圖3中可以發(fā)現(xiàn),整體的微博發(fā)布量趨勢呈現(xiàn)2個峰的形式,在3月10日左右微博發(fā)布量開始增加,到3月14日開始下降并維持在一定數(shù)目,然后在3月28日左右微博發(fā)布量又開始增加,到4月1日又開始下降。微博上圍繞某一事件主題的微博數(shù)量變化,與這一事件的發(fā)展有著密不可分的關(guān)系。
圖2 采集微博數(shù)量省份與地區(qū)分布情況
圖3 微博發(fā)布時間分布
新浪新聞關(guān)于上海死豬的專題報道中收錄了相關(guān)的所有新聞[16-17]。最早一條名為《黃浦江上游松江水域發(fā)現(xiàn)死豬929頭未影響供水》的新聞,發(fā)布時間為3月9日18:10,從而推斷出3月10日左右的微博數(shù)量增加是由于這一事件的曝光引起的。在這一則新聞之后,日常的新聞基本上是每天打撈死豬的數(shù)量與官方的一些表態(tài)與評論。
直到3月29日,一則《上海漂浮死豬清撈完成 將加強檢查防止不合格肉》,官方宣告死豬的清理工作完成,此后又有2則記者探訪類的新聞發(fā)布,引起了又一波微博上的討論,至此死豬事件基本平息。
對于事件的微博進行情感傾向性分析,可以推測出輿論的觀點傾向。對于話題微博的處理如下:
(1)首先對于微博內(nèi)容進行分句。
(2)用主客觀SVM模型對分句進行預(yù)測。
(3)對于主觀微博SVM極性模型進行情感極性預(yù)測,然后根據(jù)正負向分句的個數(shù),對微博進行分類,即
正向情感(正向分句數(shù)>負向分句數(shù));
負向情感(正向分句數(shù)<負向分句數(shù));
中性情感(正向分句數(shù)=負向分句數(shù))。
實驗結(jié)果如圖4所示。
圖4 微博情感分布
從圖4中可以看出,微博的負向情感變化趨勢與微博發(fā)布時間的趨勢相似,隨著微博發(fā)布量的增加而增加;微博的正向情感變化趨勢從起初的平穩(wěn)轉(zhuǎn)向波動;微博的中性情感則和微博的負向情感一樣,起伏波動。
本文分析了新浪官方API的數(shù)據(jù)獲取方式,闡述了其用法與限制,通過分析2種網(wǎng)頁微博的登陸流程完成模擬登陸,設(shè)計用戶資料庫的字段與存儲方式,完成新浪微博數(shù)據(jù)挖掘的流程。通過設(shè)計實驗與對于熱門事件的搜索與分析,實現(xiàn)了數(shù)據(jù)挖掘方案的測試與應(yīng)用。實驗表明,通過API并結(jié)合混合策略的方式可以最大效率地獲得微博數(shù)據(jù),同時,通過對于網(wǎng)路爬蟲的改造,可以完成新浪微博API中由于權(quán)限等原因無法取得的數(shù)據(jù)。
在新浪微博的數(shù)據(jù)挖掘方案中,還具有許多可以定制化的挖掘方案,以適應(yīng)不同的數(shù)據(jù)需求,挖掘的深度與廣度也可以根據(jù)需要設(shè)定。如何有效率并且低代價地獲取所需要的數(shù)據(jù),需要繼續(xù)研究拓展。
對微博數(shù)據(jù)進行更大規(guī)模的分析處理,則需要大量的微博數(shù)據(jù),隨著時間增加,如何更好地組織和存儲這些微博數(shù)據(jù)需要進一步考慮,另外,微博中的新詞[17]和微博的關(guān)系數(shù)據(jù)也具有研究價值,如何對其有效處理也需進一步研究。
[1]謝愛平.從網(wǎng)絡(luò)營銷工具的使用看凡客誠品的發(fā)展[J].中國電子商務(wù),2011(4):21.
[2]21世紀(jì)經(jīng)濟報.2013年新浪微博尋找新大陸[DB/OL].[2013-02-23].http://jinhua.house.sina.com.cn/news/10292163302.shtml.
[3]新浪科技.新浪微博2012年度盤點[DB/OL].[2012-12-19].http://tech.sina.com.cn/i/13447902817.shtml.
[4]張嵐嵐.新浪微博的網(wǎng)絡(luò)輿情分析研究[D].上海:華東師范大學(xué),2011.
[5]張鈺雪.新浪微博傳播機制研究[D].成都:西南大學(xué),2011.
[6]王曉光.微博客用戶行為特征與關(guān)系特征實證分析:以 “新浪微博”為例[J].圖書情報工作,2010,54(14):66-70.
[7]廉 捷,周 欣,曹 偉,等.新浪微博數(shù)據(jù)挖掘方案[J].清華大學(xué)學(xué)報:自然科學(xué)版,2011,51(10):1300-1305.
[8]Chen S,Zhang H,Lin M,et al.Comparison of microblogging service between Sina Weibo and Twitter[C]//Computer Science and Network Technology(ICCSNT),2011 International Conference on.IEEE,2011:2259-2263.
[9]Cano A E,Mazumdar S,Ciravegna F.Social influence analysis in microblogging platforms:a topic-sensitive based approach[J].Semantic Web,2011,1(5):1-16.
[10]房偉偉,李靜遠,劉 悅,等.Twitter數(shù)據(jù)采集方案研究[J].山東大學(xué)學(xué)報:理學(xué)版,2012,47(5):73-77.
[11]Liu Z,Chen X,Sun M.Mining the interests of Chinese micro bloggers via keyword extraction[J].Frontiers of Computer Science,2012,6(1):76-87.
[12]新浪公司.新浪微博開放平臺[DB/OL].[2012-3-15].http://open.weibo.com/.
[13]紅黑聯(lián)盟.模擬新浪微博登錄算法[DB/OL].[2013-3-5].http://www.2cto.com/kf/201303/192970.html.
[14]周勝臣,瞿文婷,石英子,等.中文微博情感分析研究綜述[J].計算機應(yīng)用與軟件,2013,30(3):161-164.
[15]謝麗星,周 明,孫茂松.基于層次結(jié)構(gòu)的多策略中文微博情感分析和特征抽?。跩].中文信息學(xué)報,2012,26(1):73-83.
[16]新浪新聞.新浪新聞關(guān)于上海死豬的專題報道[DB/OL].[2013-04-15].http://roll.news.sina.com.cn/s-sizhuall/index.shtml.
[17]孫 曉,李承程,葉嘉麒,等.基于重復(fù)字串的微博新詞非監(jiān)督自動抽?。跩].合肥工業(yè)大學(xué)學(xué)報:自然科學(xué)版,2014,37(6):674-678,724.