天天看點

第一章, 介紹:挖掘twitter的資料 第一章, 介紹:挖掘twitter的資料

mahout_xb的專欄

http://blog.csdn.net/mahout_xb/article/details/7341477

第一章, 介紹:挖掘twitter的資料

分類: data mining 2012-03-11 11:36  1362人閱讀  評論(4)  收藏  舉報 twitter graphviz python dependencies search import

雖然我們可以從讨論社交網絡的APIs, schemaless的設計,或者許多其它的事開始, 但是讓我們直接進入一些介紹性的例子,以此來說明去收集和分析社交網站的資料。這是一篇入門章節,目的是激發你的興趣,讓你思索一些問題,而餘下的章節會涉及到細節。我們将先将開發環境搭建個,然後馬上開始收集個分析一些twitter的資料。

安裝Python開發環境

這本書的示例以用python語言來寫的,如果你已經安裝了新版本的python和easy_install在你的系統上,那你可以跳過本節。如果你沒有安裝python,壞消息是你可能不是一個python hacker。但是不用擔心,你很快就是了,因為python很容易上手。使用者在任何的平台都能去下載下傳和安裝python在:http://www.python.org/download/,但是強烈建議windows使用者安裝ActivePython,它自動将python加入到你的系統路徑下并且已經帶有easy_install。本書的代碼在python2.7上測試的。

一旦安裝好了python, 你就可以在指令行敲下python, 啟動其互動模式。嘗試以下示例1-1

示例1-1,第一個python互動會話

[python]  view plain copy

  1. >>> print "Hello World"  
  2. Hello World  
  3. >>> #this is a comment  
  4. ...  
  5. >>> for i in range(0,10): # a loop  
  6. ...     print i, # the comma suppresses line breaks  
  7. ...  
  8. 0 1 2 3 4 5 6 7 8 9  
  9. >>> numbers = [ i for i in range(0,10) ] # a list comprehension  
  10. >>> print numbers  
  11. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
  12. >>> if 10 in numbers: # conditional logic  
  13. ...     print True  
  14. ... else:  
  15. ...     print False  
  16. ...  
  17. False  

另外一個工具easy_install,類似linux上的安裝包管理工具, 它能讓你很友善安裝python的庫,而不用去下載下傳,編譯,再安裝。你可以下載下傳最新的版本在http://pypi.python.org/pypi/setuptools, 針對不同的平台有相關的介紹。一般來說,*nix使用者可能要用sudo easy_install在安裝,使很系統中所有使用者都能用到安裝的庫,而windows使用者,如果按照建議安裝了ActivePython, 隻需要用easy_install指令就好了。

你配置好了easy_install後,就可以用它來安裝NetworkX了--用來建構和分析圖的工具,整本書都會用到它。安裝時能看到類似的輸出:

[plain]  view plain copy

  1. $ easy_install networkx  
  2. Searching for networkx  
  3. ...truncated output...  
  4. Finished processing dependencies for networkx  

有了NetworkX後,你可能用在解析器下直接引入它,但有可能會出錯:

[python]  view plain copy

  1. >>> import networkx  
  2. Traceback (most recent call last):  
  3. ... truncated output ...  
  4. ImportError: No module named numpy  

當出現ImportError時,意味着缺少相應的庫。networkx信賴于numpy,  一個高度優化的科學計算庫, 執行easy_install numpy解決此問題。安裝完numpy後,你應該可以運作示例1-2:

示例1-2, 用networkx來建立一個圖的點和邊

[python]  view plain copy

  1. >>> import networkx  
  2. >>> g=networkx.Graph()  
  3. >>> g.add_edge(1,2)  
  4. >>> g.add_node("spam")  
  5. >>> print g.nodes()  
  6. [1, 2, 'spam']  
  7. >>> print g.edges()  
  8. [(1, 2)]  

現在,你已經安裝了一些核心的python開發工具了,準備好去做一些有趣的任務了。如果你覺得這一節有多要學的,那麼很有必要去看看官網的python介紹, 在進入下一節之前。

收集和運用twitter的資料

幾乎不可能你不知道twitter, 它是一個社會化的微網誌服務,你可能輸入140個字元以下的資訊,這些資訊被稱作tweets。不像社交網絡如Facebook和LinkedIn, 在那裡連接配接是雙向的,twitter有一個不對稱的基礎架構,叫做“朋友”和“粉絲”。假設你有一個twitter賬号,你的朋友是你正關注的人,而你的粉絲是那些關注你的人。當然,你可以去關注所有那些關注你的人,然而,這一般是不會發生的,因為你僅僅想讓你的Home Timeline中包含你感興趣的内容。twitter作為一個重要的現象,因為它龐大的使用者數量,以及作為市場動向分析工具,和大量的第三方用戶端。它提供了廣泛的APIs,雖然你可以用其中的很多,而不用注冊,但是它會更有趣去建立和挖掘你自己的社交網絡。發點時間去看看twitter的 服務條款,API文檔,以及API的限制條件。這本書餘下的部分假設你有一個twitter的賬号,并且有足夠多的朋友和粉絲來作為資料去挖掘。

注:這本書的twitter賬号是@SocialWebMining

運用twitter的API

twitter的一小部分網絡API包裝在一個名為twitter的包中,可以通過easy_install來安裝:

[python]  view plain copy

  1. $ easy_install twitter  
  2. Searching for twitter  
  3. ...truncated output...  
  4. Finished processing dependencies for twitter  

這個包還包含一個友善的指令行工具以及網絡聊天機器人, 是以當你安裝了這個子產品後, 你就可以在shell中敲入“twitter"來得到使用幫助。然而,我們将主要關注python的互動解釋器。我們将操作幾個執行個體,但是請注意,你可以跳過文檔,因為可以用pydoc再次檢視這些文檔。*nix使用者可以簡單的敲入pydoc twitter.Twitter來檢視Twitter類的文檔,而widows使用者需要用python -mpydoc twitter.Twitter.如果你發現你經常檢視某個子產品的文檔, 你可以選擇傳遞一個-w選項給pydoc,這樣就可以輸出為HTML檔案來儲存或由浏覽器收藏為書簽。當然,也可以在解釋器中鍵入help來完成同樣的功能,如help(twitter.Twitter).

該進入主題了, 我們來找出人們正在談論什麼, 利用twitter的搜尋api來觀察趨勢。讓我們先準備好解釋器,初始化一個搜尋。嘗試示例1-3,如果有疑問,用help()來檢視相關文檔。

示例1-3,檢索twitter的搜尋趨勢

[python]  view plain copy

  1. >>> import twitter  
  2. >>> twitter_search = twitter.Twitter(domain="search.twitter.com")  
  3. >>> trends = twitter_search.trends()  
  4. >>> [ trend['name'] for trend in trends['trends'] ]  
  5. [u'#ZodiacFacts', u'#nowplaying', u'#ItsOverWhen', u'#Christoferdrew',  
  6. u'Justin Bieber', u'#WhatwouldItBeLike', u'#Sagittarius', u'SNL', u'#SurveySays',  
  7. u'#iDoit2']  

你可能在想,使用twitter的api非常之簡單:初始化Twitter類用一個URL,然後調用這個對象上的方法。例如,twitter_search.trends()初始化了一個HTTP請求去得到  http://search.twitter.com/trends.json,你也可以鍵入這個url到浏覽器中得到同樣的結果。作為前面解釋器章節的進一步,這一節完稿在周六的晚上,是以,SNL(周六夜場秀,一美國娛樂節目)出現在趨勢清單中不是巧合。現在可能是一個很好的時機去看看twitter的api文檔,後面會多次用到。

得出SNL是一個趨勢,下面就是去擷取一些關于它的搜尋結果,用twitter的搜尋api來探索包含SNL的tweets,然後以json的格式将它們列印出來,如示例1-4描述的:

示例1-4,分頁顯示twitter的搜尋結果

[python]  view plain copy

  1. >>> search_results = []  
  2. >>> for page in range(1,6):  
  3. ...     search_results.append(twitter_search.search(q="SNL", rpp=100, page=page))  

以上代碼擷取和存儲結果為5個連續的片斷(頁),每頁100條記錄。它是很有意義的去看一個相應的REST查詢                                  http://search.twitter.com/

search.json?&q=SNL&rpp=100&page=1。在REST API和twitter子產品之間的映射使得我們很容易用python代碼來和twitter服務互動。在執行完這個搜尋後,search_results包含了5個對象,每個有100條結果記錄,你能夠将這些結果用易讀的形式列印出來,用python 2.6以後自帶的json子產品,如示例1-5:

示例1-5,易讀的twitter資料以json格式

[python]  view plain copy

  1. >>> import json  
  2. >>> print json.dumps(search_results, sort_keys=True, indent=1)  
  3. [  
  4.   {  
  5.     "completed_in": 0.088122000000000006,  
  6.     "max_id": 11966285265,  
  7.     "next_page": "?page=2&max_id=11966285265&rpp=100&q=SNL",  
  8.     "page": 1,  
  9.     "query": "SNL",  
  10.     "refresh_url": "?since_id=11966285265&q=SNL",  
  11.     "results": [  
  12.      {  
  13.        "created_at": "Sun, 11 Apr 2010 01:34:52 +0000",  
  14.        "from_user": "bieber_luv2",  
  15.        "from_user_id": 106998169,  
  16.        "geo": null,  
  17.        "id": 11966285265,  
  18.        "iso_language_code": "en",  
  19.        "metadata": {  
  20.         "result_type": "recent"  
  21.        },  
  22.        "profile_image_url": "http://a1.twimg.com/profile_images/809471978/DSC00522...",  
  23.        "source": "<a href="http://twitter.com/">web</a>",  
  24.        "text": " ...truncated... im nt gonna go to sleep happy unless i see @justin...",  
  25.        "to_user_id": null  
  26.      }  
  27.                ... output truncated - 99 more tweets ...  
  28.     ],  
  29.     "results_per_page": 100,  
  30.     "since_id": 0  
  31.   },  
  32.        ... output truncated - 4 more pages ...  
  33. ]  

注意,據2010年下半年的通知,在搜尋結果中from_user_id字段不對應真實的twitter使用者id,檢視Twitter API Issue #214得到更多細節,這個缺點到本書的章節沒有任何影響,但是如果你要自己建立一些應用就要注意這點了(值得特别關注)

到本書的後面才會仔細推敲這些結果中的細節(請看第5章),這時候要注意的是傳回的結果以results作為關鍵字,我們能提取這500個tweets的文本到清單中,用下面的方法。示例1-6

用一個雙清單推導式,縮進以表明它與嵌套循環沒什麼差別。

示例1-6, 一個簡單的python清單推導式

[python]  view plain copy

  1. >>> tweets = [ r['text'] \  
  2. ...     for result in search_results \  
  3. ...         for r in result['results'] ]  

清單推導式被經常用到在這本書中,雖然它們很容易産生迷惑如果寫在一行,但是将它們以嵌套循環列印出來意思就明了了。這個結果tweets相當于定義一個空的清單tweets,然後調用tweets.append(r['text'])在嵌套循環中。參見“Data Structures"一節在python的官網教程中。清單推導是非常有用的,它們有時候能提供更高的效率比嵌套循環,且更簡潔。

頻率分析和詞彙多樣性

對于非結構化文本一個最直接的度量就是詞彙豐富性(lexical diversity),即不重複的單詞數除以總的單詞數目。如示例1-7

示例1-7, tweets的詞彙豐富性

[python]  view plain copy

  1. >>> words = []  
  2. >>> for t in tweets:  
  3. ...     words += [ w for w in t.split() ]  
  4. ...  
  5. >>> len(words) # total words  
  6. 7238  
  7. >>> len(set(words)) # unique words  
  8. 1636  
  9. >>> 1.0*len(set(words))/len(words) # lexical diversity  
  10. 0.22602928985907708  
  11. >>> 1.0*sum([ len(t.split()) for t in tweets ])/len(tweets) # avg words per tweet  
  12. 14.476000000000001  

詞彙豐富性值0.23表明四個單詞中約有一個是唯一的。已知每條tweet的單詞數量是14, 也就是說僅有3個單詞是唯一的在每條tweet中,不考慮其他因素,也就是說每條tweet載有20%的唯一資訊。對于這點,有趣的是tweets中有多少噪音是由于五毛黨所造成,有哪些常用單詞,又有哪些不常用的單詞。單詞和它們的頻率分布就能解決此問題。雖然這不難解決,我們還是安裝一個工具,它提供了内置的頻率分布以及其它一些文本分析工具。

自然語言工具集(NLTK)是一個非常受歡迎的子產品,這本書中我們将經常用到。它包含大量的文本分析工具,如一般向量計算,資訊提取,自然語言處理(NLP)等,雖然說它在商業上和學術上不是最先進的,但它提供了堅實的和廣泛的基礎,如果這是你第一次來嘗試做自然語言處理的話。如果你的項目對品質或效率要求很高的話,NLTK不能滿足你的需求,這種情況有三個選擇,取決于你能花在這上面的時間和金錢: 1.從開源項目中找替代品,做大量的實驗和測試來對比它們的性能 2.白手起家自己制造工具集 3.買一個商業的産品。 其中任何一種都不便宜(如果你相信時間就是金錢)或容易。

NLTK能通過easy_install來安裝,但你需要重新開機解釋器才能用它。你能夠用cPickle子產品來儲存你的工作會話在重新開機前。如示例1-8

示例1-8, 儲存資料

[python]  view plain copy

  1. >>> f = open("myData.pickle", "wb")  
  2. >>> import cPickle  
  3. >>> cPickle.dump(words, f)  
  4. >>> f.close()  
  5. >>>  
  6. $ easy_install nltk  
  7. Searching for nltk  
  8. ...truncated output...  
  9. Finished processing dependencies for nltk  

在安裝了NLTK後,你可能想要看一看它的官網,那裡有它的文檔,也包含Natural Language Processing with Python(O'Reilly)整部書的電子版。

人們正在談論什麼?

嘗試去回答人們正在談論什麼是挖掘twitter資料最引人入勝的理由。一個最簡單的技術用來解決這個問題的就是頻率分析。NLTK簡化了這個問題,它提供了文本分析的API,是以讓我們減輕工作量,讓NLTK來處理細節吧。示例1-9示範了這個查找過程,通過建立頻率分布,找出50個最常用的和最不常用的詞。

示例1-9, 用NLTK來執行最基本的頻率分析

[python]  view plain copy

  1. >>> import nltk  
  2. >>> import cPickle  
  3. >>> words = cPickle.load(open("myData.pickle"))  
  4. >>> freq_dist = nltk.FreqDist(words)  
  5. >>> freq_dist.keys()[:50] # 50 most frequent tokens  
  6. [u'snl', u'on', u'rt', u'is', u'to', u'i', u'watch', u'justin', u'@justinbieber',  
  7. u'be', u'the', u'tonight', u'gonna', u'at', u'in', u'bieber', u'and', u'you',  
  8. u'watching', u'tina', u'for', u'a', u'wait', u'fey', u'of', u'@justinbieber:',  
  9. u'if', u'with', u'so', u"can't", u'who', u'great', u'it', u'going',  
  10. u'im', u':)', u'snl...', u'2nite...', u'are', u'cant', u'dress', u'rehearsal',  
  11. u'see', u'that', u'what', u'but', u'tonight!', u':d', u'2', u'will']  
  12. >>> freq_dist.keys()[-50:] # 50 least frequent tokens  
  13. [u'what?!', u'whens', u'where', u'while', u'white', u'whoever', u'whoooo!!!!',  
  14. u'whose', u'wiating', u'wii', u'wiig', u'win...', u'wink.', u'wknd.', u'wohh', u'won',  
  15.  u'wonder', u'wondering', u'wootwoot!', u'worked', u'worth', u'xo.', u'xx', u'ya',  
  16. u'ya<3miranda', u'yay', u'yay!', u'ya\u2665', u'yea', u'yea.', u'yeaa', u'yeah!',  
  17. u'yeah.', u'yeahhh.', u'yes,', u'yes;)', u'yess', u'yess,', u'you!!!!!',  
  18. u"you'll", u'you+snl=', u'you,', u'youll', u'youtube??', u'youu<3',  
  19. u'youuuuu', u'yum', u'yumyum', u'~', u'\xac\xac']  

快速的掃一下示例1-9的結果,你會發現最常用的詞比最不常用的詞載有更多有用的資訊。雖然進一步的工作是讓機器來識别,但常用詞涉及的實體如人,時間,事件,而不常用的詞則大都是噪音其中得不出任何有用資訊。

第一點你發現的關于常用詞的可能就是SNL排在了第一位,既已知這是基于原始的搜尋結果,這就不足為奇了。有趣之處上往後面的詞看:有很多談論是關于Justin Bieber, 有以下詞為證,@justinbieber, justin, 和 bieber。任何人熟悉SNL的也應該知道“tina”和“fey"的出現決非巧合,鑒于Tina Fey和該節目的長期合作關系。也不難從這些詞中推斷出Justin Bieber是個有名的人,由于他要上周六晚上的節目,是以許多人非常激動的去搜尋他。

這時候,你可能會想, “這樣啊,那我可以浏覽一些tweets,來推斷出結論“, 也許的确可以這樣,但你想7*24小時來做這件事吧,或是雇傭别人來做。那麼如果是在其他領域,僅靠浏覽随機的幾條文本是得不出可靠的結論呢?要點是頻率分析是非常容易,也很有用的工具,它是如此顯而易見而不應被忽略。另外,這種技術一個基本的作用就是能讓你回答這個問題,"人們正在談論什麼?”

作為最後觀察到的一點,“rt"的出現對于話題的繼續是很重要的線索。詞“RT”是一個特殊的符号,出現在一條tweet之前代表你正轉發某人的tweet.從這個詞的高頻率,可以推斷有大量重複的或是相近的tweet.事實上,這個觀察是我們下面分析的基礎。

從tweets中抽取關系

因為社交網絡是第一個也是最重要的一個關于人們之的聯系, 一個友善的存儲社交網絡資料的形式就是圖。讓我們用NetworkX來建構一個轉發tweet的人們的關系圖。我們将在圖中直接表明資訊的流向,更準确的來說,它是雙向圖。雖然twitter的API有一些能力去判别和分析轉發的狀态,但對于下面的例子不太适合,因為我們要向伺服器作大量的請求,這将是對有限額的API請求的浪費。

除此之外,我們能通過tweet本身的線索以正規表達式來抽取這些資訊。按規定,twitter的人名符号以@符号開頭,僅能包含字母,數字和下劃線。是以,按轉發的規定,我們隻需要探索下而的樣式:

  • RT 後接使用者名
  • via 後接使用者名

雖然第5章介紹來一個子產品來解析tweets中的實體,示例1-10表明你可以用re子產品來編譯一個樣式,以輕量級的方式來抽取tweet的發起人,而不用其它的庫。

示例1-10, 用正規表達式來找到轉發者

[python]  view plain copy

  1. >>> import re  
  2. >>> rt_patterns = re.compile(r"(RT|via)((?:\b\W*@\w+)+)", re.IGNORECASE)  
  3. >>> example_tweets = ["RT @SocialWebMining Justin Bieber is on SNL 2nite. w00t?!?",  
  4. ...     "Justin Bieber is on SNL 2nite. w00t?!? (via @SocialWebMining)"]  
  5. >>> for t in example_tweets:  
  6. ...     rt_patterns.findall(t)  
  7. ...  
  8. [('RT', ' @SocialWebMining')]  
  9. [('via', ' @SocialWebMining')]  

以防不太明顯,調用findall傳回一個元組清單,每一個元組包含一個比對的字元串或是空字元串,注意這個正規表達式留一個空格在開頭,可以很容易的用strip()來解決,如示例1-11。因為示例的tweets中沒有一個包含這兩種樣式,是以,在每一個元組中包含一個空字元串。

已知,這些由twitter API傳回的tweet資料結構中包含發tweet的人,以及上面所示擷取轉發人的方法,很容易将這些資訊載入到NetworkX的圖中。讓我們建立一個圖,結點代表使用者,兩個結點間的有向邊代表一個使用者轉發的另一個使用者的tweet,邊本身包含tweet的id和tweet的文本。

示例1-11示範了圖建立的過程,基本步驟是,首先概括出一個方法來抽取轉發中的使用者名,再将每一頁的tweets資料放入一個清單中,最後,循環掃描每頁的tweets并将邊加入圖中。雖然我們在後面能将圖畫出來,但即使不可視化它,我們也很從圖的特性中得到很多東西。

示例1-11,建立和分析一個圖表明了誰轉發了誰的tweet

[python]  view plain copy

  1. >>> import networkx as nx  
  2. >>> import re  
  3. >>> g = nx.DiGraph()  
  4. >>>  
  5. >>> all_tweets = [ tweet  
  6. ...                for page in search_results  
  7. ...                     for tweet in page["results"] ]  
  8. >>>  
  9. >>> def get_rt_sources(tweet):  
  10. ...     rt_patterns = re.compile(r"(RT|via)((?:\b\W*@\w+)+)", re.IGNORECASE)  
  11. ...     return [ source.strip()  
  12. ...              for tuple in rt_patterns.findall(tweet)  
  13. ...                  for source in tuple  
  14. ...                       if source not in ("RT", "via") ]  
  15. ...  
  16. >>> for tweet in all_tweets:  
  17. ...     rt_sources = get_rt_sources(tweet["text"])  
  18. ...     if not rt_sources: continue  
  19. ...     for rt_source in rt_sources:  
  20. ...         g.add_edge(rt_source, tweet["from_user"], {"tweet_id" : tweet["id"]})  
  21. ...  
  22. >>> g.number_of_nodes()  
  23. 160  
  24. >>> g.number_of_edges()  
  25. 125  
  26. >>> g.edges(data=True)[0]  
  27. (u'@ericastolte', u'bonitasworld', {'tweet_id': 11965974697L})  
  28. >>> len(nx.connected_components(g.to_undirected()))  
  29. 37  
  30. >>> sorted(nx.degree(g))  
  31. [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  
  32. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  
  33. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  
  34. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  
  35. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,  
  36. 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 9, 37]  
第一章, 介紹:挖掘twitter的資料 第一章, 介紹:挖掘twitter的資料

圖1-1,分布圖表明了圖中結點的度數,揭露了圖的聯系

NetworkX内置了非常有用的功能去開始分析twitter資料,但有一點很重要,我們要記住這裡分析的資料隻很少的一部分關于SNL --成千上萬中的500個tweets。從這個圖中我們知道, 有160個人轉發過,但隻有125條邊,160/125(約1.28)是一個很重要的線索,告訴我們點的平均度數接近1,意味着雖然一些結點與另外多個結點有聯系,但平均是約一個聯系一個結點。

調用connected_components顯示圖中包含了37個子圖,且不是完全連通的,輸出的度數可能起初看起來有點神秘,但是它實實在在的證明了我們獲得的一點:它能告訴我們圖的聯系性怎麼樣,而不必去渲染出這個圖。在這個示例中,大部分的值是1,意味着大部分結點為的度數是1,即僅與另外一個結點為連接配接。一些值是在2到9之間,意味着與其他2到9個結點連接配接。特例是那個度數為37的結點。圖中有沒有任何連接配接的結點,也有一個度數為37的結點。圖1-1以直方圖來表明度數的分布。這條趨勢線表明它近似幂律分布(Power Law),有一個很長的“尾巴”。雖然這個長尾的特性在本書中沒什麼用處,但我們會發現我們建立的很多圖中有這個特性,但是我強烈的建議你深入的去挖掘如果你有興趣的話。一個好的出發點是齊普夫定律(Zipf's Law).

在這本書中,我們将發更多的時間來用自動啟發式學習來分析資料。這章作為介紹來激發你的頭腦,使得你來考慮用手邊簡單易行的辦法來挖掘資料。來結束這章之前,讓我們來可視化這個圖,以此確定我們的直覺将我們引向了正确的方向。

虛拟tweet圖

Graphviz是一個重要的工具在虛拟化社群。這一節介紹一個可行的方法來可視化tweet資料圖:把它們導出為DOT語言,一個簡單的文本格式,能夠被Graphviz運用。Graphviz的二進制檔案可以用于任意的平台,在它的官網上可以下載下傳,無論什麼平台其安裝也是很友善的。當Graphviz被安裝後,*nix使用者就可以用easy_install pygraphviz來安裝其python接口,windows使用者安裝PyGraphviz很困難,這裡介紹一個簡單的方法生成DOT格式輸出。

示例1-12介紹了一個方法可用于任意平台

[python]  view plain copy

  1. OUT = "snl_search_results.dot"  
  2. try:  
  3.      nx.drawing.write_dot(g, OUT)  
  4. except ImportError, e:  
  5.      # Help for Windows users:  
  6.      # Not a general-purpose method, but representative of  
  7.      # the same output write_dot would provide for this graph  
  8.      # if installed and easy to implement  
  9.      dot = ['"%s" -> "%s" [tweet_id=%s]' % (n1, n2, g[n1][n2]['tweet_id']) \  
  10.          for n1, n2 in g.edges()]  
  11.      f = open(OUT, 'w')  
  12.      f.write('strict digraph {\n%s\n}' % (';\n'.join(dot),))  
  13.      f.close()  

DOT格式的輸出如示例1-13

示例1-13, DOT語言的輸出

[python]  view plain copy

  1. strict digraph {  
  2. "@ericastolte" -> "bonitasworld" [tweet_id=11965974697];  
  3. "@mpcoelho" -> "Lil_Amaral" [tweet_id=11965954427];  
  4. "@BieberBelle123" -> "BELIEBE4EVER" [tweet_id=11966261062];  
  5. "@BieberBelle123" -> "sabrina9451" [tweet_id=11966197327];  
  6. }  

有了DOT格式的輸出,下一步就将它轉換為圖形了。Graphviz提供了各種布局算法來虛拟化所導出的圖;circo, 一個工具能渲染圖為圓形風格的布局,适用于輻射狀的拓撲結圖,有一個中心點與其它度數為1的結點為相連。*nix使用者,可以用下面的指令将snl_search_results.dot從NetworkX導出為snl_search_results.dot.png,然後就可以用圖形檢視器找開了。

[python]  view plain copy

  1. $ circo -Tpng -Osnl_search_results snl_search_results.dot  

Windows使用者可以用GVedit來渲染這個文本,如圖1-3.你可以讀到更多的選項關于Graphviz線上上文檔。圖的可視化證明了我們前面的分析,且度數最高的結點是@justinbieber,這個最多讨論的話題。要明白一點的是,如果我們收集更多的tweets,我們将得到更多的内部相連的子圖。進一步的分析留給積極的讀者們了,這一章主要是準備好開發環境,并激發讀者們探索有趣話題的欲望。

Graphviz會出現在本書的其他章節,如果你認為自己是一個資料分析科學家,它是一個你要掌握的工具。也就是說,我們也将用到其他可視化工具。接下來的章節,我們将涉及其它社交網絡資料及分析技術。

綜合:用Protovis來可視化轉發的tweets.

一個關鍵的示例腳本綜合了這一節的大部分内容,并且增加了一個可視化方法, 這就是這一節要做的。另外輸出一些有用的資訊到終端,它接受一個搜尋關鍵字作為參數,擷取,解析,并彈出浏覽器來顯示可視化資料作為一個可互動的基于html5的圖。可以從這本書的官方代碼中找到http://github.com/ptwobrussell/Mining-the-Social-Web/blob/master/python_code/introduction__retweet_visualization.py, 強烈建議你試一試。

我們将用再次提到Protovis --這個示例中用到的可視化工具集,在這本書的後面幾章中。圖1-4是這個示例中Protovis的輸出,這隻是一個開始,你可以用它做更多。

結束語

這一章是個開始,讓你認識到它是多麼容易用python的互動解釋器來挖掘和分析twitter的資料。在進入下一章之前,它是很重要的讓你感覺易于使用python的開發環境,并且強烈建議你熟悉twitter的API和Graphviz.如果你還想嘗試其它的,推薦canviz, 一個項目目的是将Graphviz的圖畫到浏覽器中。你可能也想調查一個IPython,一個更好的python解釋器,提供tab補全,曆史追綜,以及其它更多功能。在這本書中許多的工作與可執行腳本有關,但是它是很重要的,你去多嘗試新主意,去調試等等。

第一章, 介紹:挖掘twitter的資料 第一章, 介紹:挖掘twitter的資料

圖1-2, Graphviz渲染的圖形布局搜尋結果

第一章, 介紹:挖掘twitter的資料 第一章, 介紹:挖掘twitter的資料

圖1-3,windows使用者用GVedit代替Graphviz

第一章, 介紹:挖掘twitter的資料 第一章, 介紹:挖掘twitter的資料

圖1-4,一個可互動的Protovis圖

繼續閱讀