翻譯:陳丹html
校對:王雨桐node
本文約4700字,建議閱讀15分鐘python
本文爲你們介紹了多種圖挖掘工具,並運用Spark爲你們展現了一個標籤傳播算法LPA構建圖的實例。git
本教程分爲兩部分:github
第1部分:無監督學習圖算法
(https://towardsdatascience.com/large-scale-graph-mining-with-spark-750995050656)shell
第2部分(就是本文!):數據庫
如何運用神奇的圖。咱們將討論標籤傳播,Spark GraphFrame和結果。apache
下文可回顧示例圖和筆記:網頁爬蟲
https://github.com/wsuen/pygotham2018_graphmining
在第1部分,咱們看到了如何使用圖來解決無監督的機器學習問題,由於社區是集羣。咱們能夠利用節點之間的邊做爲類似性或相關性的指標,特徵空間中的距離可用於其餘類型的聚類。
本文將深刻探討社區檢測的方式。咱們構建和挖掘一個大型網絡圖,學習如何在Spark中實現標籤傳播算法(LPA)的社區檢測方法。
經過標籤傳播檢測社區
儘管有許多社區檢測技術,但本文僅關注一種:標籤傳播。有關其餘方法的概述,我推薦Santo Fortunato的「圖形中的社區檢測」(https://arxiv.org/pdf/0906.0612.pdf)。
Raghavan,Usha Nandini,RékaAlbert和Soundar Kumara「在大型網絡中檢測社區結構的近線性時間算法。」物理評論E 76.3(2007):036106
一、最初每一個節點都始於其所在的社區。
二、每次迭代會隨機遍歷全部節點。用其大多數鄰居的標籤來更新每一個節點的社區標籤,隨意打破任何聯繫。
三、若是如今全部節點都是用大多數鄰居的標籤標記的,則該算法已達到中止標準。若是不是,重複步驟2。
標籤傳播很直觀。假設某個工做日,你的同事得了感冒並「傳播」病毒,辦公區中的每一個人都會和周圍的人同樣病重。與此同時,FoobarCo的員工在街上感染並開始傳播流感。你與FoobarCo之間的聯繫並很少,所以當每一個社區的成員患上疾病時,「傳播」就會中止,達到融合!雖然流鼻涕和頭痛太糟糕了。
爲何使用LPA?
帶標籤的數據很好,但不是必需的。使LPA適用於咱們的無監督機器學習用例。
參數調整很是簡單。LPA使用max_iterations參數運行,而且使用默認值5就能夠得到良好的結果。Raghavan和她的合做者針對幾個標記的網絡測試了LPA。他們發現至少有95%的節點在5次迭代中被正確分類。
集羣的先驗數量,集羣的大小,不須要其餘指標。若是你不但願圖形具備特定的結構或層次結構,那麼這一點相當重要。我沒有關於網絡圖的網絡結構、擁有數據的社區數量或這些社區的預期規模的先驗假設。
接近線性運行時間。LPA的每次迭代均爲O(m),與邊數成線性。與此前某些社區檢測解決方案的O(n log n)或O(m + n)相比,整個步驟的順序接近線性時間。
可解釋性。能夠給別人解釋爲何將節點分到某個社區。
比利時移動網絡中的語言社區(紅色=法語,綠色=荷蘭語)。圖片來自Blondel,Vincent D.等人。「大型網絡中社區的快速發展。」統計力學雜誌:理論與實驗2008.10(2008):P10008
工具選擇
首先對工具領域進行一個簡要的分析。我根據圖的大小,該庫是否適配Python以及可否生成簡單的可視化效果來劃分工具。
一些常見的圖形挖掘工具
一份非詳盡的工具菜單:
對於適合在一臺計算機上計算的數據,networkx(https://networkx.github.io/) Python軟件包是探索圖的理想選擇,它實現了最多見的算法(包括標籤傳播,PageRank,最大集團檢測等),簡單的可視化也是可能的。
Gephi(https://gephi.org/)是一個開源的圖分析工具。Gephi不是Python軟件包,而是具備強大UI和強大圖形可視化功能的獨立工具。若是你的圖較小,須要強大的可視化效果,而且但願使用UI而不是使用Python,Gephi是個不錯的選擇。
Spark有2個圖形庫:GraphX(https://spark.apache.org/docs/latest/graphx-programming-guide.html)和GraphFrames(https://graphframes.github.io/)。
當圖形數據太大而沒法容納在一臺機器上(受限於分配的Spark應用程序的資源量),想要利用並行處理以及一些Spark的內置容錯功能時,Spark是一個很好的解決方案。Spark的Python API Pyspark很是適合集成到scikit-learn,matplotlib或networkx等其餘庫中。
Apache Giraph(https://giraph.apache.org/)是Pregel(https://kowshik.github.io/JPregel/pregel_paper.pdf)的開源實現,Pregel是Google建立的圖形處理架構。與之前的解決方案相比,Giraph的進入壁壘更高。
儘管Giraph對於大規模圖形分析部署很是強大,但我選擇了同時具備Scala和Python API的輕量級產品。
Neo4j是一個圖形數據庫系統。它確實有一個Python客戶端,可是必須單獨安裝Neo4j。因爲個人分析只是一個POC,所以我想避免維護和部署徹底獨立的工具,它沒有與現有代碼集成。
最後,理論上你能夠直接實現本身的解決方案。對於初步的數據科學探索,我不建議這樣作。許多定製的圖挖掘算法都針對很是特定的用例(例如,僅在圖聚類方面超級有效,而在其餘方面則沒有效率)。若是確實須要使用很是大的數據集,則首先考慮對圖形進行採樣,過濾感興趣的子圖,從示例中推斷關係,能夠從現有任意工具中得到更多收益。
根據我正在研究的數據大小,我選擇了Spark GraphFrames。
請記住:適合您的項目的最佳圖形庫取決於語言,圖形大小,存儲圖形數據的方式以及我的喜愛!
創建Common Crawl的網絡圖
我以爲圖表很是棒,它們是有史以來最酷的東西!如何開始對真實數據使用社區檢測呢?
步驟
一、獲取數據:Common Crawl數據集(https://commoncrawl.org/the-data/get-started/)是一個很是適合網頁圖研究的開源網頁爬蟲語料庫。搜尋結果以WARC(網絡存檔)格式存儲。除頁面內容外,數據集還包含爬網日期,使用的標題和其餘元數據。
我從2017年9月的爬蟲數據(https://commoncrawl.org/2017/09/september-2017-crawl-archive-now-available/)中採樣了100個文件。文件warc.paths.gz包含路徑名;使用這些路徑名,從s3下載相應的文件。
二、解析和清理數據:首先咱們須要每一個頁面的html內容。對於每一個頁面,咱們收集URL和全部連接的URL以建立圖。
爲了從原始WARC文件中提取邊,我編寫了一些數據清理代碼,這些代碼可能永遠被壓在箱底。至少完成了工做,因此我能夠專一於更多有趣的事情!個人解析代碼是用Scala編寫的,但個人演示是在pyspark中進行的。我使用了WarcReaderFactory和Jericho解析器。python中,像warc這樣的庫能夠知足數據處理需求。
在我將全部href連接都移出html內容以後,
我在域之間畫出了邊,而不是完整的URL。我沒有建立medium.com/foo/bar和medium.com/foobar,而是建立了一個節點medium.com,該節點捕獲了與其餘域之間的連接關係。
我過濾掉了環。環是將節點鏈接到自身的邊,對於個人目標沒有用。若是medium.com/foobar連接到同一域,例如medium.com/placeholderpage,則不會繪製任何的邊。
我刪除了許多最受歡迎的資源連接,包括熱門的CDN,trackers和assets。個人初步探索只想關注人可能訪問的網頁。
三、初始化Spark上下文:對於那些在本地進行嘗試的人,請參見https://github.com/wsuen/pygotham2018_graphmining上的演示。該演示僅在本地計算機上運行。沒法得到分佈式集羣的全部計算資源,可是能夠了解如何開始使用Spark GraphFrames。
我將使用Spark 2.3導入pyspark和其餘所需的庫,包括圖形框架。而後建立一個SparkContext,它能夠運行pyspark應用程序。
# add GraphFrames package to spark-submitimport osos.environ['PYSPARK_SUBMIT_ARGS'] = '--packages graphframes:graphframes:0.6.0-spark2.3-s_2.11 pyspark-shell' import pyspark # create SparkContext and Spark Sessionsc = pyspark.SparkContext("local[*]")spark = SparkSession.builder.appName('notebook').getOrCreate() # import GraphFrames
四、建立一個圖框架:在清除數據後,你就能夠將頂點和邊加載到Spark DataFrames中。
vertices包含每一個節點的id,以及該節點的name(表示域)。
edges包含個人有向邊,從源域src到源連接到的域dst。
# show 10 nodesvertices.show(10)+--------+----------------+| id| name|+--------+----------------+|000db143| msn.com||51a48ea2|tradedoubler.com||31312317| microsoft.com||a45016f2| outlook.com||2f5bf4c8| bing.com|+--------+----------------+only showing top 5 rows# show 10 edgesedges.show(10)+--------+--------+| src| dst|+--------+--------+|000db143|51a48ea2||000db143|31312317||000db143|a45016f2||000db143|31312317||000db143|51a48ea2|+--------+--------+only showing top 5 rows
而後,可使用頂點和邊建立GraphFrame對象。你有圖了!
# create GraphFramegraph = GraphFrame(vertices, edges)
五、運行LPA:一行代碼容許您運行LPA。在這裏,我以5次迭代(maxIter)運行LPA。
# run LPA with 5 iterationscommunities = graph.labelPropagation(maxIter=5)communities.persist().show(10)+--------+--------------------+-------------+| id| name| label|+--------+--------------------+-------------+|407ae1cc| coop.no| 781684047881||1b0357be| buenacuerdo.com.ar|1245540515843||acc8136a| toptenreviews.com|1537598291986||abdd63cd| liberoquotidiano.it| 317827579915||db5c0434| meetme.com| 712964571162||0f8dff85| ameblo.jp| 171798691842||b6b04a58| tlnk.io|1632087572480||5bcfd421| wowhead.com| 429496729618||b4d4008d|investingcontrari...| 919123001350||ce7a3185| pokemoncentral.it|1511828488194|+--------+--------------------+-------------+only showing top 10 rows
運行graph.labelPropagation()將返回一個帶有節點和label的數據框,該標籤指示該節點所屬的社區。您可使用label來了解社區大小的分佈並放大感興趣的區域。例如,要發現與pokemoncentral.it在同一社區中的全部其餘網站(老實說,誰不肯意),請過濾掉label = 1511828488194的全部其餘節點。
結果
當我在示例Common Crawl Web圖上運行LPA時發生了什麼?
我最初在原始數據中擁有超過1500萬個網站。有不少節點,其中許多包含冗餘信息。我描述的數據清洗過程將圖壓縮成更少,更有意義的邊。
LPA發現了4,700多個社區。可是這些社區中有一半以上僅包含一個或兩個節點。
在規模範圍的另外一端,最大的社區是3500多個不一樣的網站!爲了給出範圍的概念,這大約是我最終圖形後過濾中節點的5%。
社區規模的極端說明了LPA的一個缺點。收斂太多可能會致使簇太大(由某些標籤主導密集鏈接的網絡)。融合太少,可能會獲得更多、更有用的較小社區。我發現最有趣的簇經常位於兩個極端之間。
融合與小世界網絡效應
在個人數據集中,LPA確實收斂了約5次迭代。能夠看到社區數量趨於穩定,大約爲4,700。Raghavan和她的同事們也經過其帶有標籤的圖表顯示了此屬性。
解釋這種狀況的一種可能機制是小世界網絡效應–圖趨於彙集的趨勢,但與節點數相比,路徑長度也較短。換句話說,儘管圖具備聚類,可是還但願可以在5到6步以內從一個朋友到網絡中的另外一個朋友。許多現實世界的圖形(包括Internet和社交網絡)也有這個特色,也能夠稱爲六度分離現象。
樣本集羣
讓咱們簡單看一些樣本集羣。與傳統的無監督羣集同樣,社區能夠是不一樣站點的混合,可是若是沒有LPA,咱們將錯過一些有趣的話題!從左到右:
電子學習站點:與電子學習頁面相關或連接到該站點的站點。是時候找一些新的數據科學MOOC了!
Bedbug網站:與房地產和臭蟲相關的網站。全部這些站點都使用相同的模板/圖像,只是域名略有不一樣,數量不止於此。
《星球大戰》社區:談論《星球大戰》電影,事件和記念品的站點常常相互連接。
值得強調的是,咱們在沒有文本處理和功能選擇、手動標記、域名功能甚至不知道能夠找到多少個社區的狀況下得到了這些集羣。咱們利用網絡圖的底層網絡結構找到了感興趣的社區!
下一步
這僅僅是網絡圖社區的冰山一角,將來的研究能夠有不少方向。例如:
分層並傳播元數據:若是咱們向數據添加諸如邊權重,連接類型或外部標籤之類的信息,那麼如何在圖中傳播此信息呢?
刪除/添加節點並衡量對社區的影響:我很好奇如何添加或刪除具備較高邊緣集中度的節點會改變LPA的有效性和最終社區的質量。
觀察網絡圖隨時間的演變:每月都有一個新的Common Crawl數據集!觀察隨着時間的推移會出現什麼集羣會頗有趣。相反,哪些社區保持不變?咱們知道,互聯網不是一成不變的。
該示例的Github存儲庫(https://github.com/wsuen/pygotham2018_graphmining)包含一個由1萬個節點組成的小樣本網絡圖形。還有關於使用Docker進行設置和運行pyspark筆記本的說明。我但願這將有助於開始使用Web圖數據進行實驗,並幫助你在數據科學問題中學習Spark GraphFrame。
探索愉快!
咱們是先驅者!
致謝
感謝Yana Volkovich博士加深了我對圖論的學習,併成爲一名出色的導師。也要感謝個人其餘同事對個人演講提供了反饋。
參考文獻
Adamic, Lada A., and Natalie Glance. 「The political blogosphere and the 2004 US election: divided they blog.」 Proceedings of the 3rd international workshop on Link discovery. ACM, 2005.
Common Crawl dataset (September 2017).
Farine, Damien R., et al. 「Both nearest neighbours and long-term affiliates predict individual locations during collective movement in wild baboons.」 Scientific reports 6 (2016): 27704
Fortunato, Santo. 「Community detection in graphs.」 Physics reports 486.3–5 (2010): 75–174.
Girvan, Michelle, and Mark EJ Newman. 「Community structure in social and biological networks.」 Proceedings of the national academy of sciences99.12 (2002): 7821–7826.
Leskovec, Jure, Anand Rajaraman, and Jeffrey David Ullman. Mining of massive datasets. Cambridge University Press, 2014.
Raghavan, Usha Nandini, Réka Albert, and Soundar Kumara. 「Near linear time algorithm to detect community structures in large-scale networks.」 Physical review E 76.3 (2007): 036106.
Zachary karate club network dataset — KONECT, April 2017.
原文標題:
Large-scale Graph Mining with Spark: Part 2
原文連接:
https://towardsdatascience.com/large-scale-graph-mining-with-spark-part-2-2c3d9ed15bb5
編輯:王菁
校對:林亦霖
譯者簡介
陳丹,復旦大學大三在讀,主修預防醫學,輔修數據科學。對數據分析充滿興趣,但初入這一領域,還有不少不少須要努力進步的空間。但願從此能在翻譯組進行相關工做的過程當中拓展文獻閱讀量,學習到更多的前沿知識,同時認識更多有共同志趣的小夥伴!
翻譯組招募信息
工做內容:須要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。若是你是數據科學/統計學/計算機類的留學生,或在海外從事相關工做,或對本身外語水平有信心的朋友歡迎加入翻譯小組。
你能獲得:按期的翻譯培訓提升志願者的翻譯水平,提升對於數據科學前沿的認知,海外的朋友能夠和國內技術應用發展保持聯繫,THU數據派產學研的背景爲志願者帶來好的發展機遇。
其餘福利:來自於名企的數據科學工做者,北大清華以及海外等名校學生他們都將成爲你在翻譯小組的夥伴。
點擊文末「閱讀原文」加入數據派團隊~
轉載須知
如需轉載,請在開篇顯著位置註明做者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待受權公衆號名稱及ID】至聯繫郵箱,申請白名單受權並按要求編輯。
發佈後請將連接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,咱們將依法追究其法律責任。
點擊「閱讀原文」擁抱組織