今天做一下你们感兴趣的事情,带你们用 neo4j 构建明星关系图谱,这次爬取一下娱乐圈专业的娱乐综合门户网站下载“明星”页的“更多明星”里所有9141条数据。
筛选出个人主页中含“明星关系”的数据,进一步爬取并解析出后续关系图谱所需的数据。以“张国荣-个人主页”为例,其直接相关的明星并不多,可见数据质量不一定多高,仅供练手,所以不在此处过多纠缠。
数据到手后,存成 csv,丢掉 neo4j 里,就能查询出“张国荣”的关系。
如果想进一步查看“张国荣”扩散出去的关系,也很方便。
因缘际会
有没有觉得很酷炫,很想赶紧学起来。不急,neo4j 部分很简单的,所以先照旧讲讲那些“因缘际会”的事。
细数过往,已经用 Gephi 搞过好几次关系图谱,相对于微博转发图谱和知乎大V关注图谱的中规中矩(见于:Gephi绘制微博转发图谱:以“@老婆孩子在天堂”为例、374名10万+知乎大V(一):相互关注情况),拿自己的日记进行分析就显得别出心裁、令人眼前一亮,算得上自己蛮中意的作品,虽然技术细节非常粗糙(见于:2017,那些出现在日记中的人:简单的文本挖掘)。不过回头看来,这几个的数据格式完全可以无缝应用到 neo4j 里,感兴趣的朋友可以去微博转发图谱一文里领取数据并实现一波。
而说是“新近”其实也是半年前安利的红楼梦人物关系及事件的可视化图谱,才是正儿八经用到 neo4j 的,当初自己也曾兴致高昂地分析了下支撑该项目的json数据,手动写了稍显复杂的函数来提取“私通”相关的人物关系链,现在看来 neo4j 一行代码就能解决。(见于:安利一个惊艳的红楼梦可视化作品、左手读红楼梦,右手写BUG,闲快活)
def word2id(word):
df = edges_df[edges_df.label== word]
from_id = df['from'].values.tolist()
to_id = df['to'].values.tolist()
return from_id, to_id
def id2label(ids):
tables = []
for ID in ids:
tables.append(person_df[person_df['id']==ID])
labels = pd.concat(tables)['label'].values.tolist()
return labels
def get_relation(from_id,to_id):
for from_label, to_label in zip(id2label(from_id), id2label(to_id)):
print(from_label, '--> {} -->'.format(word), to_label)
word = "私通"
from_id,to_id = word2id(word)
get_relation(from_id,to_id)
############################
# 以下为输出结果
贾蔷 --> 私通 --> 龄官
贾珍 --> 私通 --> 秦可卿
贾琏 --&