程廣東,秦一方
(連云港港口集團(tuán)通信信息工程公司, 江蘇連云港 222046)
?
基于新浪微博API的話題分析系統(tǒng)
程廣東,秦一方
(連云港港口集團(tuán)通信信息工程公司, 江蘇連云港222046)
摘要:以從新浪微博平臺(tái)海量信息中挖掘知識(shí)為目的,通過(guò)獲取新浪微博開放平臺(tái)授權(quán)并認(rèn)證,調(diào)用新浪微博API(Application Programming Interface)相應(yīng)的函數(shù)接口,獲取單用戶基本信息及所發(fā)微博信息,應(yīng)用多用戶遍歷思想及迭代算法,獲取大量用戶基本信息及微博信息,并存儲(chǔ)到數(shù)據(jù)庫(kù)中,利用數(shù)據(jù)挖掘關(guān)聯(lián)規(guī)則算法進(jìn)行話題分析,并將分析結(jié)果通過(guò)可視化的方式展現(xiàn),最終實(shí)現(xiàn)話題的關(guān)注度分析、話題間關(guān)聯(lián)程度分析以及話題關(guān)注人群的特征分析。
關(guān)鍵詞:微博;話題分析;數(shù)據(jù)挖掘;API
新浪微博是一個(gè)開放式的社交平臺(tái),利用平臺(tái)提供的API,可以獲取用戶基本信息、用戶微博、用戶好友信息(關(guān)注人和粉絲)、話題信息以及用戶實(shí)時(shí)位置信息等[1],將這些信息存入數(shù)據(jù)庫(kù),利用數(shù)據(jù)挖掘算法進(jìn)行分析可以獲得需要的知識(shí)。近年來(lái)新浪微博的普及度越來(lái)越高,到目前為止,累計(jì)用戶已經(jīng)將近4億,成為世界范圍公認(rèn)的與Twitter齊名的第二大移動(dòng)社交應(yīng)用[2],信息量十分龐大,從龐雜的數(shù)據(jù)信息中獲取想要的知識(shí),數(shù)據(jù)挖掘與分析技術(shù)必不可少。
1系統(tǒng)結(jié)構(gòu)分析
話題分析系統(tǒng)分為原始信息采集、數(shù)據(jù)庫(kù)存儲(chǔ)、算法實(shí)現(xiàn)信息提取、分析結(jié)果展示等四大模塊。原始信息采集是項(xiàng)目最重要也是最基礎(chǔ)的環(huán)節(jié),利用新浪API獲取所需的數(shù)據(jù);數(shù)據(jù)庫(kù)存儲(chǔ)是項(xiàng)目中起銜接作用的必不可少的一環(huán),用來(lái)連接數(shù)據(jù)獲取與數(shù)據(jù)分析模塊,將提取到的數(shù)據(jù)以統(tǒng)一的格式存儲(chǔ)起來(lái),便于數(shù)據(jù)分析;算法實(shí)現(xiàn)信息提取模塊是項(xiàng)目的核心模塊,生成用戶想要獲得的信息;分析結(jié)果展示模塊將產(chǎn)生的信息以可視化的形式展現(xiàn)給用戶。項(xiàng)目實(shí)現(xiàn)簡(jiǎn)易流程如圖1所示。
圖1 項(xiàng)目簡(jiǎn)易流程圖
2系統(tǒng)實(shí)現(xiàn)
2.1搭建開發(fā)環(huán)境
搭建開發(fā)環(huán)境的流程如圖2所示。
2.2提取數(shù)據(jù)
新浪API提取數(shù)據(jù)是信息篩選過(guò)程,即從新浪微博平臺(tái)上的海量數(shù)據(jù)信息中篩選出數(shù)據(jù)分析所需要的信息。
圖2 項(xiàng)目環(huán)境搭建流程圖
2.2.1獲取微博授權(quán)
利用新浪API提取數(shù)據(jù),首先要在新浪開放平臺(tái)上注冊(cè)應(yīng)用,獲得回調(diào)地址、APP_KEY和APP_SECRET,一起填入項(xiàng)目中的config.properties文件中;然后通過(guò)weibo4j.examples.Oauth2.Oauth4Code.java文件完成新浪微博的Oauth認(rèn)證[3],Oauth認(rèn)證流程如圖3所示。Oauth認(rèn)證完后,開發(fā)者即可利用新浪API完成對(duì)用戶信息的提取。
圖3 Oauth認(rèn)證流程圖
2.2.2提取信息
新浪微博API是一組函數(shù)接口,通過(guò)調(diào)用對(duì)應(yīng)的函數(shù)接口即可獲得相應(yīng)的功能[4]。
1)獲取用戶基本信息
①獲取單個(gè)用戶的基本信息
通過(guò)對(duì)API函數(shù)“weibo4j.examples.user.ShowUser.java”傳入“uid”參數(shù)獲得用戶的基本信息。具體實(shí)現(xiàn)方法為:將由Oauth認(rèn)證獲得的“access_token”值賦給此函數(shù)的access_token參數(shù);將用戶的“uid”賦值給此函數(shù)的uid參數(shù)項(xiàng);調(diào)用Users類中的showUserById(uid)函數(shù),即可返回一個(gè)User對(duì)象,這個(gè)對(duì)象中即包含了此uid用戶的基本信息;在Java Application上運(yùn)行此函數(shù),即可得到此用戶姓名、性別、位置、粉絲數(shù)量等基本信息[5]。
圖4 遍歷多用戶信息模型圖
②獲取多個(gè)用戶信息
通過(guò)獲取用戶粉絲uid的方法,即可獲得足夠數(shù)量的用戶uid,根據(jù)多用戶遍歷的思想,通過(guò)一個(gè)用戶 uid即可獲得其所有粉絲的uid,然后再獲取這些粉絲的粉絲的uid,如此迭代,即可獲得足夠數(shù)量的用戶uid[6],多用戶遍歷思想如圖4所示。
具體實(shí)現(xiàn)方法為:在導(dǎo)入的API_SDK包中找到獲取粉絲uid的函數(shù)weibo4j.example.friendship.GetFollowersIds.java;從Oauth4Code類得到的“access_token”及根用戶的“uid”值傳入GetFollowersIds類的主函數(shù)中,調(diào)用FriendShips類中的getFollowersIdsById()函數(shù)獲得根用戶的所有粉絲的uid,將這些uid存入String ids[]數(shù)組中,利用迭代算法獲得和這些uid有粉絲關(guān)系的所有uid[7],迭代算法實(shí)現(xiàn)為代碼:
private void diedai(String[] ids , int max , String at){
for(int i=0;i System.out.print(ids.length); con_to_showuser(ids); con_to_timeline(ids); Friendships fm=new Friendships(); fm.client.setToken(at); try { String[] id =fm.getFollowersIdsById(ids[i]); int maxx = id.length; diedai(id , maxx , at); } catch (WeiboException e) { e.printStackTrace(); } } 2)獲取微博信息 ①獲取某個(gè)用戶的微博 通過(guò)調(diào)用API接口類 “weibo4j.example.timeline.GetUserTimeline.java”,即可根據(jù)用戶的uid獲得用戶的微博信息,具體的實(shí)現(xiàn)方法為:獲取用戶uid和由Oauth認(rèn)證得到的access_token;調(diào)用Timeline類中的getUserTimelineByUid(uid)函數(shù), 返回一個(gè)StatusWapper類的對(duì)象,此對(duì)象中即包涵了用戶所發(fā)微博的前20條微博信息[8]。 ② 獲取多個(gè)用戶的微博信息 通過(guò)迭代獲取足夠多用戶的微博信息。 2.3數(shù)據(jù)庫(kù)設(shè)計(jì)及數(shù)據(jù)存儲(chǔ) 1)設(shè)計(jì)數(shù)據(jù)表 根據(jù)數(shù)據(jù)分析的需要,設(shè)計(jì)3張數(shù)據(jù)庫(kù)表:user_info表、weibo_info表以及province表。user_info表用于存儲(chǔ)用戶的基本信息,包括用戶uid、用戶名uname、性別gender、省份province、位置location等信息。weibo_info表用于存儲(chǔ)用戶微博的信息,包括用戶uid、微博tid、微博內(nèi)容text等信息。province表用于存儲(chǔ)省份編號(hào)pid和省份名稱pname;創(chuàng)建視圖usable,是聯(lián)合user_info表和weibo_info表的部分字段組成的,包括用戶uid、性別gender、省份province、位置location、微博內(nèi)容text等屬性[9]。 2)連接Java項(xiàng)目與數(shù)據(jù)庫(kù) 在下載JDBC包到工程以后,就可以將Java工程與指定數(shù)據(jù)庫(kù)進(jìn)行連接。 3)數(shù)據(jù)庫(kù)存儲(chǔ) 通過(guò)提取數(shù)據(jù)的方法,Java項(xiàng)目獲得用戶信息及用戶微博信息,Java項(xiàng)目與數(shù)據(jù)庫(kù)連接后通過(guò)執(zhí)行sql語(yǔ)句,將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù)表中。 2.4數(shù)據(jù)分析 數(shù)據(jù)挖掘算法包括關(guān)聯(lián)規(guī)則算法、分類算法和聚類算法等[10],本文主要用到關(guān)聯(lián)規(guī)則算法。 1)分析話題的關(guān)注度 分析話題的關(guān)注度是從微博表中找出與待分析話題相關(guān)的微博條數(shù)與微博表中總微博條數(shù)的比例[11]。通過(guò)sql查詢語(yǔ)句實(shí)現(xiàn),查找出與待查找話題相關(guān)的微博條數(shù)及查找出表中所有的微博條數(shù)。 2)分析兩個(gè)話題的關(guān)聯(lián)程度 通過(guò)對(duì)支持度和可信度的分析得到兩個(gè)話題的關(guān)聯(lián)程度。話題的支持度即微博中提及到的話題與收集到的微博總條數(shù)之比;而話題的可信度就是話題一推導(dǎo)出話題二的真實(shí)度,即在提及到話題一的微博中,同時(shí)也提及到了話題二的微博條數(shù)的比例[12]。 通過(guò)執(zhí)行4條sql語(yǔ)句實(shí)現(xiàn),分別統(tǒng)計(jì)話題一的微博總數(shù)、話題二的微博總數(shù)、通過(guò)API所采集到的經(jīng)過(guò)purify()函數(shù)整理過(guò)的微博總數(shù)、同時(shí)提及到話題一和話題二的微博總數(shù)。 3)分析某話題關(guān)注人群的特征 分析關(guān)注某話題人群的特征包括人群的性別分布和人群的地域分布。通過(guò)genderfb()函數(shù)獲得某話題的男女分布比例,該函數(shù)的代碼如下: public float[] genderfb(String topic) throw SQLException{ getConn(); float[] str=new float[2]; int i=0,j=0,k=0; String sql1="select count(*) from utable where text like′%"+topic+"%′"; String sql2="select count(*) from utable where text like′%"+topic+"%′and gender′=′m′"; String sql3="select count(*) from utable where text like′%"+topic+"%′and gender=′f′"; st=(Statement) conn.createStatement(); ResultSet rs1=st.executeQuery(sql1); st=(Statement) conn.createStatement(); ResultSet rs2=st.executeQuery(sql2); st=(Statement) conn.createStatement(); ResultSet rs3=st.executeQuery(sql3); while(rs1.next()){ String count1=rs1.getString("count(*)"); i=Integer.parseInt(count1); } while(rs2.next()){ String count2=rs2.getString("count(*)"); j=Integer.parseInt(count2); } while(rs3.next()){ String count3=rs3.getString("count(*)"); k=Integer.parseInt(count3); } BigDecimal bdi=new BigDecimal(Integer.toString(i)); BigDecimal bdj=new BigDecimal(Integer.toString(j)); BigDecimal bdk=new BigDecimal(Integer.toString(k)); if((i==0)){ str[0]=str[1]=0; } else{ str[0]= bdj.divide(bdi,3,BigDecimal,ROUND_HALF_UP).floatValue(); str[1]= bdk.divide(bdi,3,BigDecimal,ROUND_HALF_UP).floatValue(); } conn.close(); return str; } 通過(guò)給這個(gè)函數(shù)傳入話題名即可給用戶返回一個(gè)float[]數(shù)組,數(shù)組的值為關(guān)注該話題的男女比例。 調(diào)用provincenum()函數(shù)獲得話題關(guān)注人群所在省份的數(shù)目,代碼如下: public int provincenum(String topic) throws SQLException{ getConn(); int i=0; String sql="select count(distinct province) form utable where text like ′%"+topic+"%′"; st=(Statement) conn.createStatement(); ResultSet rs1=st.executeQuery(sql); while(rs1.next()){ String count1=rs1.getString("count(distinct province)"); i=Integer.pareseInt(count1); } conn.close(); return i; } 調(diào)用provincefb1()函數(shù),通過(guò)傳入話題名和省份數(shù)目得到這些關(guān)注者所在省份的名稱,代碼如下: public String[] provincefb1(String topic , int i) throws SQLException{ getConn(); float[] f=new float[i]; String[] s=new String[i]; String sql1="select distinct province from utable where text like ′%"+topic+"%′"; st=(Statement) conn.createStatement(); ResultSet rs2=st.executeQuery(sql1); int ii=0; while(rs2.next()){ String result=rs2.getString("province"); String sql2="select pname from province where pid=′"+result+"′"; st=(Statement) conn.createStatement(); ResultSet rs3=st.executeQuery(sql2); while(rs3.next()){ String count1=rs3.getString("pname"); s[ii]=count1; } ii++; } conn.close(); return s; } 最后再調(diào)用provincefb2()函數(shù),通過(guò)傳入話題名、省份名和省份數(shù)目,獲得各個(gè)省份的關(guān)注者占總關(guān)注者的比例,代碼如下: public float[] provincefb2(String topic , String[] ss , int max) throws SQLException{ getConn(); float[] ff=new float[max]; int ii=0, jj=0; for(int i =0; i String sql="select count(*) from utable where text like ′%"+topic+"%′ and location like ′%"+ss[i] +"%′"; String sql1="select count(*) from utable where text like ′%"+topic+"%′"; st=(Statement) conn.createStatement(); ResultSet rs=st.executeQuery(sql); st=(Statement) conn.createStatement(); ResultSet rs1=st.executeQuery(sql1); while(rs.next()){ String count=rs.getString("count(*)"); ii=Integer.pareseInt(count); } while(rs1.next()){ String count=rs1.getString("count(*)"); jj=Integer.pareseInt(count); } BigDecimal bdi=new BigDecimal(Integer.toString(ii)); BigDecimal bdj=new BigDecimal(Integer.toString(jj)); ff[i]=bdi.divide(bdj,3,BigDecimal,ROUND_HALF_UP).floatValue(); } conn.close(); return ff; } 通過(guò)調(diào)用上述幾個(gè)函數(shù),即可獲得話題關(guān)注者的人群地域分布。 2.5利用JSP/html技術(shù)與用戶互動(dòng) 通過(guò)JSP/html技術(shù)完成與用戶的互動(dòng),實(shí)現(xiàn)項(xiàng)目的實(shí)用性與可操作性。 系統(tǒng)從html頁(yè)面完成對(duì)用戶請(qǐng)求的捕捉,即完成對(duì)請(qǐng)求參數(shù)的收集,然后通過(guò)jsp頁(yè)面完成對(duì)請(qǐng)求參數(shù)的處理以及對(duì)處理結(jié)果的展示[13]。其中html頁(yè)面接受用戶請(qǐng)求并將該請(qǐng)求發(fā)送給jsp頁(yè)面以供其分析處理,Jsp頁(yè)面通過(guò)調(diào)用JavaBean類方法和嵌入JavaScript完成對(duì)用戶請(qǐng)求信息的處理與分析[14]。 在項(xiàng)目中總共用9個(gè)頁(yè)面完成與用戶的信息互動(dòng),分別為: 1)main.html。用于選擇功能,共分為話題關(guān)注度分析、話題關(guān)聯(lián)度分析和話題關(guān)注者人群特征分析等3個(gè)功能,由3個(gè)超鏈接組成。 2)attention.html。用于實(shí)現(xiàn)接受“話題關(guān)注度分析”功能的參數(shù),頁(yè)面提供供用戶輸入話題和條件限制的表單。 3)attention.jsp。用于對(duì)頁(yè)面attention.html接收到的參數(shù)進(jìn)行處理與展示結(jié)果。 4)association.html。用于實(shí)現(xiàn)接受“話題關(guān)聯(lián)度分析”功能的參數(shù),頁(yè)面提供供用戶輸入待分析的兩個(gè)話題名稱的表單。 5)association.jsp。用于對(duì)頁(yè)面association.html接收到的參數(shù)進(jìn)行處理與展示結(jié)果,如圖5所示。 圖5 話題關(guān)聯(lián)度分析結(jié)果 6)followers.html。用于實(shí)現(xiàn)接受“話題關(guān)注者人群特征分析”功能的參數(shù),頁(yè)面主要提供供用戶輸入話題名稱的表單。 7)followers.jsp。用于對(duì)頁(yè)面followers.html接收到的參數(shù)進(jìn)行處理和以表格形式展示結(jié)果,如圖6所示。 圖6 話題關(guān)注者人群特征分析結(jié)果 8)genderpie.jsp。用于將話題關(guān)注者的性別分布以扇形圖的形式展示出來(lái),如圖7所示。 9)provincepie.jsp。用于將話題關(guān)注者的省份分布以扇形圖的形式展示出來(lái),如圖8所示。 圖7 話題關(guān)注者性別分布結(jié)果 3結(jié)語(yǔ) 話題分析系統(tǒng)通過(guò)開放的新浪微博平臺(tái)API,獲取大量用戶基本信息及其所發(fā)微博信息,實(shí)現(xiàn)將信息存入數(shù)據(jù)庫(kù),通過(guò)數(shù)據(jù)挖掘關(guān)聯(lián)算法分析了話題的關(guān)注度、話題間的關(guān)聯(lián)度以及話題關(guān)注人群的特征,并通過(guò)可視化的界面與用戶可交互及分析結(jié)果展示。 圖8 話題關(guān)注者省份分布結(jié)果 系統(tǒng)通過(guò)用戶遍歷思想采集大量信息,采集數(shù)據(jù)的數(shù)量及話題覆蓋程度與根用戶及粉絲圈的關(guān)注話題密切相關(guān),下一步需要就如何采集到相對(duì)全面的新浪微博信息進(jìn)行深入研究。 系統(tǒng)應(yīng)用數(shù)據(jù)挖掘關(guān)聯(lián)算法進(jìn)行分析,應(yīng)用支持度和可信度計(jì)算方法較為簡(jiǎn)單,對(duì)數(shù)據(jù)深入挖掘需要進(jìn)一步探索和研究。 參考文獻(xiàn): [1]廉捷,周欣,曹偉,等.新浪微博數(shù)據(jù)挖掘方案[J].清華大學(xué)學(xué)報(bào)(自然科學(xué)版),2011,51(10):1300-1305. [2]李彪.微博中熱點(diǎn)話題的內(nèi)容特質(zhì)及傳播機(jī)制研究——基于新浪微博6025條高轉(zhuǎn)發(fā)微博的數(shù)據(jù)挖掘分析[J].中國(guó)人民大學(xué)學(xué)報(bào),2013,27(5):85-89. [3]黃延煒,劉嘉勇.新浪微博數(shù)據(jù)獲取技術(shù)研究[J].信息安全與通信保密, 2013,34(06):23-26. [4]田野.基于微博平臺(tái)的事件趨勢(shì)分析及預(yù)測(cè)研究[D].武漢:武漢大學(xué), 2012. [5]張國(guó)安,鐘紹輝.基于微博用戶評(píng)論和用戶轉(zhuǎn)發(fā)的數(shù)據(jù)挖掘[J].電腦知識(shí)與技術(shù),2012,19(27):35-38. [6]楊雪.淺析數(shù)據(jù)挖掘技術(shù)[J].華南金融電腦,2005,13(8):91-95. [7]喬瑩.微博用戶粉絲演化模型的構(gòu)建與實(shí)證[D].保定:河北大學(xué), 2012. [8]熊小兵,周剛,黃永忠,等.新浪微博話題流行度預(yù)測(cè)技術(shù)研究[J].信息工程大學(xué)學(xué)報(bào),2012,13(04),67-69. [9]薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,2002:156-180. [10]毛國(guó)君.數(shù)據(jù)挖掘原理與算法[M].北京:清華大學(xué)出版社,2005:40-55. [11]王曉光.微博客用戶行為特征與關(guān)系特征實(shí)證分析——以“新浪微博”為例[J].圖書情報(bào)工作,2010,54(14):178-182. [12]尹書華.基于復(fù)雜網(wǎng)絡(luò)的微博用戶關(guān)系網(wǎng)絡(luò)特性研究[J].西南師范大學(xué)學(xué)報(bào)(自然科學(xué)版), 2011,55(6):203-206. [13]方忠.JSP技術(shù)及其在動(dòng)態(tài)網(wǎng)頁(yè)開發(fā)中的應(yīng)用[J].微型機(jī)與應(yīng)用,2000,19(11):38-41. [14]趙春蘭.基于JSP的電子網(wǎng)站數(shù)據(jù)庫(kù)連接研究[J].科技創(chuàng)新導(dǎo)報(bào), 2010,7(6):72-74. (責(zé)任編輯:郎偉鋒) The Topic Analysis System Based on Sina Micro-Blog API CHENGGuangdong,QINYifang (CommunicationandInformationEngineeringCorporation,LianyungangPortGroup,Lianyungang222046,China) Abstract:With the purpose of mining knowledge from mass information of Sina micro-blog platform, authorization and authentication from Sina micro-blog open platform is obtained, corresponding function interfaces of Sina micro-blog API (Application Programming Interface) is ultimately realized, the basic information of individual user and the micro-blogs is got, multi user traversal thought and iterative algorithm is applied, the basic information of a large number of users and micro-blogs is got,the information to the database is stored,the topic by using the data mining algorithm of association rule is analyzed,the analysis results is applied in a visual way,analysis of the topic of attention and analysis of the correlation between topics and analysis of the characteristics of topic concerned crowds is ultimately realized. Key words:micro-blog; topic analysis; data mining; API 文章編號(hào):1672-0032(2015)04-0078-09 中圖分類號(hào):TP393.092 文獻(xiàn)標(biāo)志碼:A DOI:10.3969/j.issn.1672-0032.2015.04.015 作者簡(jiǎn)介:程廣東(1981—),男,山東嘉祥人,軟件部副經(jīng)理,主要研究方向?yàn)檐浖_發(fā)、系統(tǒng)集成、大數(shù)據(jù)處理等. 收稿日期:2015-09-15山東交通學(xué)院學(xué)報(bào)2015年4期