Python人物社交网络分析—平凡的世界

Stella981
• 阅读 511

点击上方“IT共享之家”,进行关注

回复“资料”可获赠IT学习福利

上一期的推送,小F做了一些社交网络分析的前期工作。

传送门:Python数据可视化:平凡的世界

比如获取文本信息,人物信息。

最后生成一个人物出现频数词云图。

Python人物社交网络分析—平凡的世界

本次来完成剩下的工作。

实现《平凡的世界》的人物社交网络分析。

/ 01 / 人物联系

人物社交网络分析是用来查看节点、连接边之间社会关系的一种分析方法。

节点是社交网络里的每个参与者,连接边则表示参与者之间的关系。

节点之间可以有很多种连接。

社交网络是一张地图,可以标示出所有与节点间相关的连接边。

社交网络也可以用来衡量每个参与者的“人脉”。

本次以《平凡的世界》为例,可视化其的人物关系。

两两人物关系有以下两种方式。

①两个人名同时出现在同一段落,则联系+1。

②两个人名同时出现在同一章节,则联系+1。

接下来利用之前获取的素材,生成数据包。

import os# 打开文本file_text = open('world1.txt')file_name = open('name.txt')# 人物信息names = []for name in file_name:    names.append(name.replace('\n', ''))# 文本信息content = []for line in file_text:    content.append(line)# 生成下标flags = [x * 0 for x in range(len(names))]# 生成人物联系for a in range(len(names)):    flags[a] = 1    name_1 = names[a]    for b in range(len(names)):        if flags[b] == 0:            name_2 = names[b]            # 为三个字符时,取名字            if len(name_1) == 3:                name_1 = name_1[1:]            if len(name_2) == 3:                name_2 = name_2[1:]            # 遍历章节及段落            num1, num2 = 0, 0            for i in os.listdir('F:\\Python\\Ordinary_world_1'):                worldFile = open('F:\\Python\\Ordinary_world_1\\' + i)                worldContent = worldFile.read()                if (name_1 in worldContent) and (name_2 in worldContent):                    num1 += 1                else:                    continue            for j in content:                if (name_1 in j) and (name_2 in j):                    num2 += 1                else:                    continue            print(names[a], names[b], num1, num2)            # 写入文件中            with open('weight.csv', 'a+') as f:                f.write(names[a] + ',' + names[b] + ',' + str(num1) + ',' + str(num2) + '\n')            f.close()

最后成功获取两两人物间的联系。

Python人物社交网络分析—平凡的世界

左图为无排序的结果,右图为排序后的结果。

/ 02 / 社交网络

使用获取的数据包,通过networkx生成社交网络图。

详细代码如下。

import pandas as pdimport networkx as nximport matplotlib.pyplot as plt# 显示中文,及字体设置plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['font.size'] = 10plt.rcParams['axes.unicode_minus'] = False# 读取文件df = pd.read_csv('weight.csv', header=None, names=['First', 'Second', 'chapweight', 'duanweight'], encoding='gbk')print(df.head())# 计算段落人物关系权重df['weight'] = df.chapweight / 162# 获取联系大于4的数据,重新生成索引df2 = df[df.weight > 0.025].reset_index(drop=True)plt.figure(figsize=(12, 12))# 生成社交网络图G = nx.Graph()# 添加边for ii in df2.index:    G.add_edge(df2.First[ii], df2.Second[ii], weight=df2.weight[ii])# 定义3种边,大于32,16-32,小于16elarge = [(u, v) for (u, v, d) in G.edges(data=True) if (d['weight'] > 0.2)]emidle = [(u, v) for (u, v, d) in G.edges(data=True) if (d['weight'] > 0.1) & (d['weight'] <= 0.2)]esmall = [(u, v) for (u, v, d) in G.edges(data=True) if (d['weight'] <= 0.1)]# 图的布局# 节点在一个圆环上均匀分布pos = nx.circular_layout(G)# 点nx.draw_networkx_nodes(G, pos, alpha=0.6, node_size=350)# 边nx.draw_networkx_edges(G, pos, edgelist=elarge, width=2, alpha=0.9, edge_color='g')nx.draw_networkx_edges(G, pos, edgelist=esmall, width=1, alpha=0.3, edge_color='b', style='dashed')# 标签nx.draw_networkx_labels(G, pos, font_size=10)# 生成结果plt.axis('off')plt.title('平凡的世界')plt.show()

得到的社交网络图。

Python人物社交网络分析—平凡的世界

可以看出人物之间的联系交错复杂。

联系较多的则是孙少平、孙少安、田润叶、田福堂以及曹书记。

这里通过网上查看了下《平凡的世界》的简介。

发现少了地主女儿郝红梅这个人物...

算是漏了一个,原本还以为82个人物应该挺全的。

接下来计算一下每个节点(每个人物)的度(入度和出度)。

它在一定程度上反映了该节点的重要程度。

详细的代码如下。

# 计算每个节点的重要程度Gdegree = nx.degree(G)Gdegree = dict(Gdegree)Gdegree = pd.DataFrame({'name': list(Gdegree.keys()), 'degree': list(Gdegree.values())})# 第一张图,所有人物#Gdegree.sort_values(by='degree', ascending=False).plot(x='name', y='degree', kind='bar', color=(136/255, 43/255, 48/255), figsize=(12, 6), legend=False)# 第二张图,前20人物Gdegree.sort_values(by='degree', ascending=True)[-20:].plot(x='name', y='degree', kind='barh', color=(16/255, 152/255, 168/255), figsize=(12, 6), legend=False)plt.xticks(size=8)# 第一张图标签# plt.ylabel('degree')# 第二张图标签plt.ylabel('name')plt.show()

生成节点出、入度直方图。

Python人物社交网络分析—平凡的世界

发现由于信息过多,导致图看得不太清楚。

所以这里选取前20个,进行展示。

Python人物社交网络分析—平凡的世界

可以看出网络图中重要程度高的是曹书记、孙少安、孙少平等人。

当然上面这些都是以章节为联系的。

换成段落联系应该也会有所改变。

Python人物社交网络分析—平凡的世界

Python人物社交网络分析—平凡的世界

/ 03 / 总结

这应该年前写的最后一篇文章了。

所以在此,预祝大家新年快乐。

-----------------END------------------

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【学习】

Python人物社交网络分析—平凡的世界

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python3、Python基础、Python进阶、网络爬虫 、书籍、

自然语言处理、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、

php、mysql、java、Android、其他

本文分享自微信公众号 - IT共享之家(info-share)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SSH 证书登录教程
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
Python解析库lxml与xpath用法总结
点击上方“IT共享之家”,进行关注回复“资料”可获赠Python学习福利今日鸡汤欢笑情如旧,萧疏鬓已斑。本文主要围绕以xpath和lxml库进行展开:一、xpath概念、xpath节点、xpath语法、xpath轴、xpath运算符二、lxml的安装、lxml的使用、lxml案例一、xpa
Wesley13 Wesley13
3年前
25 个实用网站工具推荐!
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
Pycharm在Ubuntu14.04中的基本使用指南
点击上方“Python爬虫与数据挖掘”,进行关注后台回复“书籍”可获赠Python学习10本电子书前几天给大家分享了:如何在VMware虚拟机中安装Ubuntu14.04系统(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%
Wesley13 Wesley13
3年前
VS Code 的 7 个开源替代品!
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
Docker 入门终极指南:边学边用
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Wesley13 Wesley13
3年前
2020年8月程序员工资统计,平均14401元,下跌势头止住了!
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id
Stella981 Stella981
3年前
GitHub 数据告诉你:最幸福的码农在用什么编程语言?
点击关注上方“杰哥的IT之旅”,后台回复“Python自动化(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMjg1NjY3Nw%3D%3D%26mid%3D2247491317%26id