基於社區發現算法和圖分析Neo4j解讀《權力的遊戲》下篇

2021-12-22 神機喵算
寫在之前:本文已授權InfoQ首發。

導讀:幾個月前,數學家 Andrew Beveridge和Jie Shan在數學雜誌上發表《權力的網絡》,主要分析暢銷小說《冰與火之歌》第三部《冰雨的風暴》中人物關係,其已經拍成電視劇《權力的遊戲》系列。他們在論文中介紹了如何通過文本分析和實體提取構建人物關係的網絡。緊接著,使用社交網絡分析算法對人物關係網絡分析找出最重要的角色;應用社區發現算法來找到人物聚類。

其中的分析和可視化是用Gephi做的,Gephi是非常流行的圖分析工具。但作者覺得使用Neo4j來實現更有趣。

本文為「下篇」,「上篇」見《基於社區發現算法和圖分析Neo4j解讀《權力的遊戲》上篇》。

節點中心度

節點中心度給出網絡中節點的重要性的相對度量。有許多不同的方式來度量中心度,每種方式都代表不同類型的「重要性」。

度中心性(Degree Centrality)

度中心性是最簡單度量,即為某個節點在網絡中的聯結數。在《權力的遊戲》的圖中,某個角色的度中心性是指該角色接觸的其他角色數。作者使用Cypher計算度中心性:

MATCH (c:Character)-[:INTERACTS]-()RETURN c.name AS character, count(*) AS degree ORDER BY degree DESC

characterdegreeTyrion36Jon26Sansa26Robb25Jaime24Tywin22Cersei20Arya19Joffrey18Robert18

從上面可以發現,在《權力的遊戲》網絡中提利昂·蘭尼斯特(Tyrion)和最多的角色有接觸。鑑於他的心計,我們覺得這是有道理的。

加權度中心性(Weighted Degree Centrality)

作者存儲一對角色接觸的次數作為INTERACTS關係的weight屬性。對該角色的INTERACTS關係的所有weight相加得到加權度中心性。作者使用Cypher計算所有角色的這個度量:

MATCH (c:Character)-[r:INTERACTS]-()RETURN c.name AS character, sum(r.weight) AS weightedDegree ORDER BY weightedDegree DESC

characterweightedDegreeTyrion551Jon442Sansa383Jaime372Bran344Robb342Samwell282Arya269Joffrey255Daenerys232介數中心性(Betweenness Centrality)

介數中心性:在網絡中,一個節點的介數中心性是指其它兩個節點的所有最短路徑都經過這個節點,則這些所有最短路徑數即為此節點的介數中心性。介數中心性是一種重要的度量,因為它可以鑑別出網絡中的「信息中間人」或者網絡聚類後的聯結點。

圖6中紅色節點是具有高的介數中心性,網絡聚類的聯結點。

為了計算介數中心性,作者使用Neo4j 3.x或者apoc庫。安裝apoc後能用Cypher調用其170+的程序:

MATCH (c:Character)WITH collect(c) AS characters
CALL apoc.algo.betweenness(['INTERACTS'], characters, 'BOTH') YIELD node, score
SET node.betweenness = score
RETURN node.name AS name, score ORDER BY score DESC

namescoreJon1279.7533534055322Robert1165.6025171231624Tyrion1101.3849724234349Daenerys874.8372110508583Robb706.5572832464792Sansa705.1985623519137Stannis571.5247305125714Jaime556.1852522889822Arya443.01358430043337Tywin364.7212195528086緊度中心性(Closeness centrality)

緊度中心性是指到網絡中所有其他角色的平均距離的倒數。在圖中,具有高緊度中心性的節點在聚類社區之間被高度聯結,但在社區之外不一定是高度聯結的。

圖7 :網絡中具有高緊度中心性的節點被其它節點高度聯結

MATCH (c:Character)WITH collect(c) AS characters
CALL apoc.algo.closeness(['INTERACTS'], characters, 'BOTH') YIELD node, score
RETURN node.name AS name, score ORDER BY score DESC

namescoreTyrion0.004830917874396135Sansa0.004807692307692308Robert0.0047169811320754715Robb0.004608294930875576Arya0.0045871559633027525Jaime0.004524886877828055Stannis0.004524886877828055Jon0.004524886877828055Tywin0.004424778761061947Eddard0.004347826086956522使用python-igraph

Neo4j與其它工具(比如,R和Python數據科學工具)完美結合。我們繼續使用apoc運行 PageRank和社區發現(community detection)算法。這裡接著使用python-igraph計算分析。Python-igraph移植自R的igraph圖形分析庫。 使用pip install python-igraph安裝它。

從Neo4j構建一個igraph實例

為了在《權力的遊戲》的數據的圖分析中使用igraph,首先需要從Neo4j拉取數據,用Python建立igraph實例。作者使用 Neo4j 的Python驅動庫py2neo。我們能直接傳入Py2neo查詢結果對象到igraph的TupleList構造器,創建igraph實例:

from py2neo import Graphfrom igraph import Graph as IGraphgraph = Graph()query = '''MATCH (c1:Character)-[r:INTERACTS]->(c2:Character)RETURN c1.name, c2.name, r.weight AS weight'''ig = IGraph.TupleList(graph.run(query), weights=True)

現在有了igraph對象,可以運行igraph實現的各種圖算法來。

PageRank

作者使用igraph運行的第一個算法是PageRank。PageRank算法源自Google的網頁排名。它是一種特徵向量中心性(eigenvector centrality)算法。

在igraph實例中運行PageRank算法,然後把結果寫回Neo4j,在角色節點創建一個pagerank屬性存儲igraph計算的值:

pg = ig.pagerank()pgvs = []for p in zip(ig.vs, pg):    print(p)    pgvs.append({"name": p[0]["name"], "pg": p[1]})pgvswrite_clusters_query = '''UNWIND {nodes} AS nMATCH (c:Character) WHERE c.name = n.nameSET c.pagerank = n.pg'''graph.run(write_clusters_query, nodes=pgvs)

現在可以在Neo4j的圖中查詢最高PageRank值的節點:

MATCH (n:Character)RETURN n.name AS name, n.pagerank AS pagerank ORDER BY pagerank DESC LIMIT 10

namepagerankTyrion0.042884981999963316Jon0.03582869669163558Robb0.03017114665594764Sansa0.030009716660108578Daenerys0.02881425425830273Jaime0.028727587587471206Tywin0.02570016262642541Robert0.022292016521362864Cersei0.022287327589773507Arya0.022050209663844467社區發現(Community detection)

圖8

社區發現算法用來找出圖中的社區聚類。作者使用igraph實現的隨機遊走算法( walktrap)來找到在社區中頻繁有接觸的角色社區,在社區之外角色不怎麼接觸。

在igraph中運行隨機遊走的社區發現算法,然後把社區發現的結果導入Neo4j,其中每個角色所屬的社區用一個整數來表示:

clusters = IGraph.community_walktrap(ig, weights="weight").as_clustering()nodes = [{"name": node["name"]} for node in ig.vs]for node in nodes:    idx = ig.vs.find(name=node["name"]).index    node["community"] = clusters.membership[idx]write_clusters_query = '''UNWIND {nodes} AS nMATCH (c:Character) WHERE c.name = n.nameSET c.community = toInt(n.community)'''graph.run(write_clusters_query, nodes=nodes)

我們能在Neo4j中查詢有多少個社區以及每個社區的成員數:

MATCH (c:Character)WITH c.community AS cluster, collect(c.name) AS  membersRETURN cluster, members ORDER BY cluster ASC

clustermembers0[Aemon, Alliser, Craster, Eddison, Gilly, Janos, Jon, Mance, Rattleshirt, Samwell, Val, Ygritte, Grenn, Karl, Bowen, Dalla, Orell, Qhorin, Styr]1[Aerys, Amory, Balon, Brienne, Bronn, Cersei, Gregor, Jaime, Joffrey, Jon Arryn, Kevan, Loras, Lysa, Meryn, Myrcella, Oberyn, Podrick, Renly, Robert, Robert Arryn, Sansa, Shae, Tommen, Tyrion, Tywin, Varys, Walton, Petyr, Elia, Ilyn, Pycelle, Qyburn, Margaery, Olenna, Marillion, Ellaria, Mace, Chataya, Doran]2[Arya, Beric, Eddard, Gendry, Sandor, Anguy, Thoros]3[Brynden, Catelyn, Edmure, Hoster, Lothar, Rickard, Robb, Roose, Walder, Jeyne, Roslin, Ramsay]4[Bran, Hodor, Jojen, Luwin, Meera, Rickon, Nan, Theon]5[Belwas, Daario, Daenerys, Irri, Jorah, Missandei, Rhaegar, Viserys, Barristan, Illyrio, Drogo, Aegon, Kraznys, Rakharo, Worm]6[Davos, Melisandre, Shireen, Stannis, Cressen, Salladhor]7[Lancel]角色「大合影」

《權力的遊戲》的權力圖。節點的大小正比於介數中心性,顏色表示社區(由隨機遊走算法獲得),邊的厚度正比於兩節點接觸的次數。
現在已經計算好這些圖的分析數據,讓我們對其進行可視化,讓數據看起來更有意義。

Neo4j自帶瀏覽器可以對Cypher查詢的結果進行很好的可視化,但如果我們想把可視化好的圖嵌入到其它應用中,可以使用Javascript可視化庫Vis.js。從Neo4j拉取數據,用Vis.js的neovis.js構建可視化圖。Neovis.js提供簡單的API配置,例如:

var config = {  container_id: "viz",  server_url: "localhost",  labels: {    "Character": "name"  },  label_size: {    "Character": "betweenness"  },  relationships: {    "INTERACTS": null  },  relationship_thickness: {    "INTERACTS": "weight"  },  cluster_labels: {    "Character": "community"  }};var viz = new NeoVis(config);viz.render();

其中:

俠天,專注於大數據、機器學習和數學相關的內容,並有個人公眾號:bigdata_ny分享相關技術文章。

若發現以上文章有任何不妥,請聯繫我。


相關焦點

  • 15種算法玩轉Neo4j資料庫
    Neo4j包含一個不斷增長的開放式高性能圖形算法庫,可以揭示連接數據中的隱藏模式和結構。 本文將為大家介紹Neo4j中提供的諸多圖算法以及它們的功能。使用Neo4j圖形算法,用戶可以建模並預測複雜的動態特性,例如資源或信息的流動,傳染或網絡故障傳播的途徑,以及組的影響和彈性。
  • 基於Graph的Learning問題
    標籤傳播,社區發現等算法,代表工作有LBP/Louvain/PageRank等。在neo4j中默認支持兩大類算法:中心度算法和社區發現算法。除此之外包括:圖染色,節點相似性等。Neo4j Lab在算法大類上支持:中心度算法,社區發現算法,路徑發現算法,相似度算法,連結預測算法等,每個大類算法下都實現了多種算法。
  • 知識圖譜實戰系列四:neo4j的介紹和使用
    圖資料庫(Graph database)指的是以圖數據結構的形式來存儲和查詢數據的資料庫。從 http://db-engines.com/en/ranking 可以發現,Neo4j 是目前用的最多的圖資料庫,世界資料庫排行榜上排名21位。
  • 盤點Neo4j中的15種不同圖表算法及其功能
    【IT168 技術】圖表分析在企業決策中能夠發揮極大的價值,而好的圖形算法不僅易於使用,執行速度快,而且能夠產生強大的結果。Neo4j包含一個不斷增長的開放式高性能圖形算法庫,可以揭示連接數據中的隱藏模式和結構。  本文將為大家介紹Neo4j中提供的諸多圖算法以及它們的功能。
  • ACL 2018論文解讀 | 基於排序思想的弱監督關係抽取選種與降噪算法
    基於HITS的算法Hypertext-induced topic search(HITS)算法又稱為 hubs-and-authorities 算法,它是一種廣泛用於對 web 頁面排序的連結分析方法。
  • Neo4j 1.3 Milestone 2 發布
    Neo是一個網絡——面向網絡的資料庫——也就是說,它是一個嵌入式的、基於磁碟的網絡(從數學角度叫做圖)是一個靈活的數據結構,可以應用更加敏捷和快速的開發模式。 Neo4j 1.3.M02 now contains: neo4j-kernel: core graphdb engine neo4j-graph-algo: optimized graph algorithm library neo4j-kernel-com
  • 精品教學案例 | Twitter好友網絡分析及社區發現
    首先介紹了數據中的主要內容,然後統計了節點和邊的基本信息、進行了節點與邊的渲染等等,並基於社區網絡算法對社交網絡進行社區發現分析,最後繪製布局網絡圖。提高學生動手實踐能力。在本案例中使用Gephi完成社交網絡數據的讀取 ,使用Gephi統計網絡的基本信息,並基於Gephi提供的方法進行複雜的網絡分析。
  • 關於圖算法 & 圖分析的基礎知識概覽
    LabelPropagation AlgorithmLouvainModularity Algorithm結論圖算法 & 圖分析圖分析使用基於圖的方法來分析連接的數據。我們可以:查詢圖數據,使用基本統計信息,可視化地探索圖、展示圖,或者將圖信息預處理後合併到機器學習任務中。圖的查詢通常用於局部數據分析,而圖計算通常涉及整張圖和迭代分析。圖算法是圖分析的工具之一。圖算法提供了一種最有效的分析連接數據的方法,它們描述了如何處理圖以發現一些定性或者定量的結論。圖算法基於圖論,利用節點之間的關係來推斷複雜系統的結構和變化。
  • 圖論與圖學習(二):圖算法
    近日,數據科學家 Maël Fabien 在其博客上發布了涉及圖論、圖算法和圖學習的系列文章《圖論與圖學習》。本文是其中第二篇,介紹了圖算法。networkx 是一個用於複雜網絡的結構、動態和功能的創建、操作和研究的 Python 軟體包。前一篇文章介紹了圖的主要種類以及描述一個圖的基本特性。現在我們更加詳細地介紹圖分析/算法以及分析圖的不同方式。
  • 這本社會學研究的經典著作,深入解讀權力的「遊戲」
    這本社會學研究的經典著作,深入解讀權力的「遊戲」 2019-06-07 18:11 來源:澎湃新聞·澎湃號·湃客
  • 《權力的遊戲》人物關係圖:一張圖看懂權力遊戲人物關係介紹
    新東方網>英語>英語學習>娛樂英語>影視英語>影視資訊>正文《權力的遊戲》人物關係圖:一張圖看懂權力遊戲人物關係介紹 2019-03-01 16:16 來源:新東方網整理 作者
  • 圖形資料庫之Neo4j核心概念介紹(二)
    言歸正傳,做項目期間大致看了一遍neo4j官網的文檔和它提供的查詢語言cypher(英文為翻譯的意思)什麼是Cypher?cypher是neo4j官網的提供的聲明式圖譜查詢語言,用來可視化查詢展示圖譜裡面的節點和關係,圍繞圖譜查詢提供了可讀性好和容易使用,功能強大的眾多優點。
  • TapTap產品分析:發現好遊戲
    本文主要是針對TapTap進行產品分析,了解整個遊戲行業的現狀和未來的發展,並通過對競品的分析,來給TapTap提出相關的優化建議。),處於主導地位,客戶端與網頁遊戲佔比分別降至26.6%和4.3%。
  • Task 5 Neo4j 圖資料庫查詢
    github.com/datawhalechina/team-learning-nlp/blob/master/KnowledgeGraph_Basic/task04.md原項目地址:https://github.com/zhihao-chen/QASystemOnMedicalGraphCypher作為Neo4j的查詢語言,是一個描述性的圖形查詢語言,允許不必編寫圖形結構的遍歷代碼對圖形存儲有表現力和效率的查詢
  • 胡凌 | 數字社會權力的來源:評分、算法與規範的再生產
    同時,算法黑箱對主體的行為卻能基於過去的數據進行預測,並創設新規則,調整社會規範,形成了新的信息不對稱,仍需要像理性化的法律制度一樣提供程序和實體上的保障。隨著這一機制的開展,有必要逐漸對評分活動進行成本收益分析和社會影響評估,以便調整納入失信行為目錄的行為類型。
  • 人工智慧時代的算法權力:邏輯、風險及規制
    大數據是人工智慧技術發展的基石;機器學習能對數據進行分析、決策和預測,是實現智能的方法;深度學習是使用包括複雜結構在內的多個處理層,對數據進行高維抽象的算法[1]。人工智慧相關技術的本質是基於數據的算法。數據是現實世界的數位化反映,可以被收集,但不能被創新,算法的發展決定了智能革命的進程。
  • AAAI論文解讀:基於轉移的語義依存圖分析(11月24日周五晚8點直播)
    值得一提的是,本周五(11 月 24 日)晚上 8 點,第一作者王宇軒將在雷鋒網(公眾號:雷鋒網)旗下頻道AI慕課學院(http://www.mooc.ai/)進行第 34 期的 GAIR 大講堂直播,主題為《AAAI論文解讀:基於轉移的語義依存圖分析》,掃描本文底部海報AI科技評論二維碼,添加社長微信,備註「王宇軒」即可。
  • Procleave: 基於蛋白質序列和結構特徵的蛋白酶特異性底物和裂解位點的預測算法
    我們的「要文譯薦」欄目很高興邀請到宋教授親自為大家解讀Procleave這種準確的基於機器學習技術的蛋白酶底物和裂解位點預測算法。蛋白酶的底物特異性通常可以通過肽特異性分析或高通量質譜技術來識別,但實驗手段鑑定蛋白質裂解比較困難、耗時且成本很高,因此開發成本效益高的計算方法和工具作為實驗工作的補充具有重要的價值。在此背景下,識別蛋白酶潛在靶底物的計算方法和工具可以幫助有效發現新的底物蛋白質或者裂解位點,並且指導蛋白酶—底物相互作用的假設驅動實驗研究。
  • 萬物皆可Embedding之Deepwalk算法解讀
    前言自從word representation中的神奇算法word2vec出現之後,無論是學術界還是工業界都有這樣一個共識——萬物皆可Embedding,基於句子、文檔表達的word2vec、doc2vec算法,基於物品序列的item2vec算法,基於圖結構的Graph Embedding技術,無論是在推薦、廣告還是反欺詐領域,各網際網路公司基於自身業務與Embedding結合的論文相繼問世