程廣東,秦一方
(連云港港口集團通信信息工程公司, 江蘇連云港 222046)
?
基于新浪微博API的話題分析系統
程廣東,秦一方
(連云港港口集團通信信息工程公司, 江蘇連云港222046)
摘要:以從新浪微博平臺海量信息中挖掘知識為目的,通過獲取新浪微博開放平臺授權并認證,調用新浪微博API(Application Programming Interface)相應的函數接口,獲取單用戶基本信息及所發(fā)微博信息,應用多用戶遍歷思想及迭代算法,獲取大量用戶基本信息及微博信息,并存儲到數據庫中,利用數據挖掘關聯規(guī)則算法進行話題分析,并將分析結果通過可視化的方式展現,最終實現話題的關注度分析、話題間關聯程度分析以及話題關注人群的特征分析。
關鍵詞:微博;話題分析;數據挖掘;API
新浪微博是一個開放式的社交平臺,利用平臺提供的API,可以獲取用戶基本信息、用戶微博、用戶好友信息(關注人和粉絲)、話題信息以及用戶實時位置信息等[1],將這些信息存入數據庫,利用數據挖掘算法進行分析可以獲得需要的知識。近年來新浪微博的普及度越來越高,到目前為止,累計用戶已經將近4億,成為世界范圍公認的與Twitter齊名的第二大移動社交應用[2],信息量十分龐大,從龐雜的數據信息中獲取想要的知識,數據挖掘與分析技術必不可少。
1系統結構分析
話題分析系統分為原始信息采集、數據庫存儲、算法實現信息提取、分析結果展示等四大模塊。原始信息采集是項目最重要也是最基礎的環(huán)節(jié),利用新浪API獲取所需的數據;數據庫存儲是項目中起銜接作用的必不可少的一環(huán),用來連接數據獲取與數據分析模塊,將提取到的數據以統一的格式存儲起來,便于數據分析;算法實現信息提取模塊是項目的核心模塊,生成用戶想要獲得的信息;分析結果展示模塊將產生的信息以可視化的形式展現給用戶。項目實現簡易流程如圖1所示。
圖1 項目簡易流程圖
2系統實現
2.1搭建開發(fā)環(huán)境
搭建開發(fā)環(huán)境的流程如圖2所示。
2.2提取數據
新浪API提取數據是信息篩選過程,即從新浪微博平臺上的海量數據信息中篩選出數據分析所需要的信息。
圖2 項目環(huán)境搭建流程圖
2.2.1獲取微博授權
利用新浪API提取數據,首先要在新浪開放平臺上注冊應用,獲得回調地址、APP_KEY和APP_SECRET,一起填入項目中的config.properties文件中;然后通過weibo4j.examples.Oauth2.Oauth4Code.java文件完成新浪微博的Oauth認證[3],Oauth認證流程如圖3所示。Oauth認證完后,開發(fā)者即可利用新浪API完成對用戶信息的提取。
圖3 Oauth認證流程圖
2.2.2提取信息
新浪微博API是一組函數接口,通過調用對應的函數接口即可獲得相應的功能[4]。
1)獲取用戶基本信息
①獲取單個用戶的基本信息
通過對API函數“weibo4j.examples.user.ShowUser.java”傳入“uid”參數獲得用戶的基本信息。具體實現方法為:將由Oauth認證獲得的“access_token”值賦給此函數的access_token參數;將用戶的“uid”賦值給此函數的uid參數項;調用Users類中的showUserById(uid)函數,即可返回一個User對象,這個對象中即包含了此uid用戶的基本信息;在Java Application上運行此函數,即可得到此用戶姓名、性別、位置、粉絲數量等基本信息[5]。
圖4 遍歷多用戶信息模型圖
②獲取多個用戶信息
通過獲取用戶粉絲uid的方法,即可獲得足夠數量的用戶uid,根據多用戶遍歷的思想,通過一個用戶 uid即可獲得其所有粉絲的uid,然后再獲取這些粉絲的粉絲的uid,如此迭代,即可獲得足夠數量的用戶uid[6],多用戶遍歷思想如圖4所示。
具體實現方法為:在導入的API_SDK包中找到獲取粉絲uid的函數weibo4j.example.friendship.GetFollowersIds.java;從Oauth4Code類得到的“access_token”及根用戶的“uid”值傳入GetFollowersIds類的主函數中,調用FriendShips類中的getFollowersIdsById()函數獲得根用戶的所有粉絲的uid,將這些uid存入String ids[]數組中,利用迭代算法獲得和這些uid有粉絲關系的所有uid[7],迭代算法實現為代碼:
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)獲取微博信息 ①獲取某個用戶的微博 通過調用API接口類 “weibo4j.example.timeline.GetUserTimeline.java”,即可根據用戶的uid獲得用戶的微博信息,具體的實現方法為:獲取用戶uid和由Oauth認證得到的access_token;調用Timeline類中的getUserTimelineByUid(uid)函數, 返回一個StatusWapper類的對象,此對象中即包涵了用戶所發(fā)微博的前20條微博信息[8]。 ② 獲取多個用戶的微博信息 通過迭代獲取足夠多用戶的微博信息。 2.3數據庫設計及數據存儲 1)設計數據表 根據數據分析的需要,設計3張數據庫表:user_info表、weibo_info表以及province表。user_info表用于存儲用戶的基本信息,包括用戶uid、用戶名uname、性別gender、省份province、位置location等信息。weibo_info表用于存儲用戶微博的信息,包括用戶uid、微博tid、微博內容text等信息。province表用于存儲省份編號pid和省份名稱pname;創(chuàng)建視圖usable,是聯合user_info表和weibo_info表的部分字段組成的,包括用戶uid、性別gender、省份province、位置location、微博內容text等屬性[9]。 2)連接Java項目與數據庫 在下載JDBC包到工程以后,就可以將Java工程與指定數據庫進行連接。 3)數據庫存儲 通過提取數據的方法,Java項目獲得用戶信息及用戶微博信息,Java項目與數據庫連接后通過執(zhí)行sql語句,將數據存儲到數據庫中對應的數據表中。 2.4數據分析 數據挖掘算法包括關聯規(guī)則算法、分類算法和聚類算法等[10],本文主要用到關聯規(guī)則算法。 1)分析話題的關注度 分析話題的關注度是從微博表中找出與待分析話題相關的微博條數與微博表中總微博條數的比例[11]。通過sql查詢語句實現,查找出與待查找話題相關的微博條數及查找出表中所有的微博條數。 2)分析兩個話題的關聯程度 通過對支持度和可信度的分析得到兩個話題的關聯程度。話題的支持度即微博中提及到的話題與收集到的微博總條數之比;而話題的可信度就是話題一推導出話題二的真實度,即在提及到話題一的微博中,同時也提及到了話題二的微博條數的比例[12]。 通過執(zhí)行4條sql語句實現,分別統計話題一的微博總數、話題二的微博總數、通過API所采集到的經過purify()函數整理過的微博總數、同時提及到話題一和話題二的微博總數。 3)分析某話題關注人群的特征 分析關注某話題人群的特征包括人群的性別分布和人群的地域分布。通過genderfb()函數獲得某話題的男女分布比例,該函數的代碼如下: 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; } 通過給這個函數傳入話題名即可給用戶返回一個float[]數組,數組的值為關注該話題的男女比例。 調用provincenum()函數獲得話題關注人群所在省份的數目,代碼如下: 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; } 調用provincefb1()函數,通過傳入話題名和省份數目得到這些關注者所在省份的名稱,代碼如下: 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; } 最后再調用provincefb2()函數,通過傳入話題名、省份名和省份數目,獲得各個省份的關注者占總關注者的比例,代碼如下: 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; } 通過調用上述幾個函數,即可獲得話題關注者的人群地域分布。 2.5利用JSP/html技術與用戶互動 通過JSP/html技術完成與用戶的互動,實現項目的實用性與可操作性。 系統從html頁面完成對用戶請求的捕捉,即完成對請求參數的收集,然后通過jsp頁面完成對請求參數的處理以及對處理結果的展示[13]。其中html頁面接受用戶請求并將該請求發(fā)送給jsp頁面以供其分析處理,Jsp頁面通過調用JavaBean類方法和嵌入JavaScript完成對用戶請求信息的處理與分析[14]。 在項目中總共用9個頁面完成與用戶的信息互動,分別為: 1)main.html。用于選擇功能,共分為話題關注度分析、話題關聯度分析和話題關注者人群特征分析等3個功能,由3個超鏈接組成。 2)attention.html。用于實現接受“話題關注度分析”功能的參數,頁面提供供用戶輸入話題和條件限制的表單。 3)attention.jsp。用于對頁面attention.html接收到的參數進行處理與展示結果。 4)association.html。用于實現接受“話題關聯度分析”功能的參數,頁面提供供用戶輸入待分析的兩個話題名稱的表單。 5)association.jsp。用于對頁面association.html接收到的參數進行處理與展示結果,如圖5所示。 圖5 話題關聯度分析結果 6)followers.html。用于實現接受“話題關注者人群特征分析”功能的參數,頁面主要提供供用戶輸入話題名稱的表單。 7)followers.jsp。用于對頁面followers.html接收到的參數進行處理和以表格形式展示結果,如圖6所示。 圖6 話題關注者人群特征分析結果 8)genderpie.jsp。用于將話題關注者的性別分布以扇形圖的形式展示出來,如圖7所示。 9)provincepie.jsp。用于將話題關注者的省份分布以扇形圖的形式展示出來,如圖8所示。 圖7 話題關注者性別分布結果 3結語 話題分析系統通過開放的新浪微博平臺API,獲取大量用戶基本信息及其所發(fā)微博信息,實現將信息存入數據庫,通過數據挖掘關聯算法分析了話題的關注度、話題間的關聯度以及話題關注人群的特征,并通過可視化的界面與用戶可交互及分析結果展示。 圖8 話題關注者省份分布結果 系統通過用戶遍歷思想采集大量信息,采集數據的數量及話題覆蓋程度與根用戶及粉絲圈的關注話題密切相關,下一步需要就如何采集到相對全面的新浪微博信息進行深入研究。 系統應用數據挖掘關聯算法進行分析,應用支持度和可信度計算方法較為簡單,對數據深入挖掘需要進一步探索和研究。 參考文獻: [1]廉捷,周欣,曹偉,等.新浪微博數據挖掘方案[J].清華大學學報(自然科學版),2011,51(10):1300-1305. [2]李彪.微博中熱點話題的內容特質及傳播機制研究——基于新浪微博6025條高轉發(fā)微博的數據挖掘分析[J].中國人民大學學報,2013,27(5):85-89. [3]黃延煒,劉嘉勇.新浪微博數據獲取技術研究[J].信息安全與通信保密, 2013,34(06):23-26. [4]田野.基于微博平臺的事件趨勢分析及預測研究[D].武漢:武漢大學, 2012. [5]張國安,鐘紹輝.基于微博用戶評論和用戶轉發(fā)的數據挖掘[J].電腦知識與技術,2012,19(27):35-38. [6]楊雪.淺析數據挖掘技術[J].華南金融電腦,2005,13(8):91-95. [7]喬瑩.微博用戶粉絲演化模型的構建與實證[D].保定:河北大學, 2012. [8]熊小兵,周剛,黃永忠,等.新浪微博話題流行度預測技術研究[J].信息工程大學學報,2012,13(04),67-69. [9]薩師煊,王珊.數據庫系統概論[M].北京:高等教育出版社,2002:156-180. [10]毛國君.數據挖掘原理與算法[M].北京:清華大學出版社,2005:40-55. [11]王曉光.微博客用戶行為特征與關系特征實證分析——以“新浪微博”為例[J].圖書情報工作,2010,54(14):178-182. [12]尹書華.基于復雜網絡的微博用戶關系網絡特性研究[J].西南師范大學學報(自然科學版), 2011,55(6):203-206. [13]方忠.JSP技術及其在動態(tài)網頁開發(fā)中的應用[J].微型機與應用,2000,19(11):38-41. [14]趙春蘭.基于JSP的電子網站數據庫連接研究[J].科技創(chuàng)新導報, 2010,7(6):72-74. (責任編輯:郎偉鋒) 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 文章編號:1672-0032(2015)04-0078-09 中圖分類號:TP393.092 文獻標志碼:A DOI:10.3969/j.issn.1672-0032.2015.04.015 作者簡介:程廣東(1981—),男,山東嘉祥人,軟件部副經理,主要研究方向為軟件開發(fā)、系統集成、大數據處理等. 收稿日期:2015-09-15