《权利的游戏》
导读
几个月前,数学家 Andrew Beveridge 和Jie Shan在数学杂志上发表《权力的网络》( 链接: 权力的网络),主要分析畅销小说《冰与火之歌》第三部《冰雨的风暴》中人物关系,其已经拍成电视剧《权力的游戏》系列。他们在论文中介绍了如何通过文本分析和实体提取构建人物关系的网络。紧接着,使用社交网络分析算法对人物关系网络分析找出最重要的角色;应用社区发现算法来找到人物聚类。
其中的分析和可视化是用Gephi做的,Gephi是非常流行的图分析工具。但作者觉得使用Neo4j来实现更有趣。
导入原始数据到neo4j
数据下载
上面是人物关系的之邻接表以及关系权重。作者使用简单的数据模型:
(:Character {
name})-[:INTERACTS]->(:Character {
name})
- 带有标签Character的节点代表小说中的角色, 用单向关系类型INTERACTS代表小说中的角色有过接触。
- 节点属性会存储角色的名字name, 两角色间接触的次数作为关系的属性:权重(weight)。
首先创建节点c,并做唯一限制性约束,c.name唯一,保证schema的完整性:
CREATE CONSTRAINT ON (c:Character) ASSERT c.name IS UNIQUE;
一旦约束创建即相应的创建索引,这将有助于通过角色的名字查询的性能。作者使用Neo4j的Cypher(Cypher是一种声明式图查询语言,能表达高效查询和更新图数据库)LOAD CSV语句导入数据:
# 使用网络直接加载数据(自己尝试没有成功)
LOAD CSV WITH HEADERS FROM "https://www.macalester.edu/~abeverid/data/stormofswords.csv" AS row
MERGE (src:Character {
name: row.Source})
MERGE (tgt:Character {
name: row.Target})
MERGE (src)-[r:INTERACTS]->(tgt)
SET r.weight = toInt(row.Weight)
![请添加图片描述](https://img-blog.csdnimg.cn/008d456e35df40bdb4807c5a8ea0dcbe.webp)
##########################################
# 下载到本地,加载到nei4j中
LOAD CSV WITH HEADERS FROM "file:/stormofswords.csv" AS row
MERGE (src:Character {
name: row.Source})
MERGE (tgt:Character {
name: row.Target})
MERGE (src)-[r:INTERACTS]->(tgt)
SET r.weight = toInt(row.Weight)
我们能可视化整个图形,但是这并不能给我们很多信息,比如哪些是最重要的人物,以及他们相互接触的信息:
MATCH p=(:Character)-[:INTERACTS]-(:Character)
RETURN p
人物网络分析
作者使用Neo4j的图查询语言Cypher来做《权力的游戏》图分析,应用到了网络分析的一些工具,具体见《网络,人群和市场:关于高度连接的世界》
人物数量
万事以简单开始。先看看上图上由有多少人物:
MATCH (c:Character)
RETURN count(c)
概要统计
统计每个角色接触的其它角色的数目:
MATCH (c:Character)-[:INTERACTS]->()
WITH c, count(*)