快捷导航

怎样使用Jupyter Notebook计算接近中心度

2021-7-9 18:12| 发布者: Fuller| 查看: 412| 评论: 0

摘要: 1,本Notebook编写背景和应用场景本周我们学习和研讨了二篇经典的基于微博数据做主题传播和关系路径研究的论文:1. 基于LDA模型的新冠疫情微博用户主题聚类图谱及主题传播路径研究该论文基于LDA(latent Dirichlet al ...

1,本Notebook编写背景和应用场景

本周我们学习和研讨了二篇经典的基于微博数据做主题传播和关系路径研究的论文:

1. 基于LDA模型的新冠疫情微博用户主题聚类图谱及主题传播路径研究

该论文基于LDA(latent Dirichlet allocation)模型构建新冠肺炎疫情事件下微博用户的主题聚类图谱,利用困惑度评价指标来确定微博用户的最优主题数和主题分布;利用网络用户转发评论关系构建微博用户主题聚类图谱,提出网络社群间主题传播路径分析方法。

2. 社交网络舆情中意见领袖主题图谱构建及关系路径研究_基于网络谣言话题的分析

该论文是一篇基于大数据驱动的社交网络舆情传播中网络谣言关系路径主题图谱可视化分析的案例,以新浪微博“重庆大巴坠江·非女司机逆行导致”话题为例,使用开源知识图谱工具Neo4j对数据进行主题图谱构建,利用Cypher语言对意见领袖的传播效率、传播路径和关键节点影响力进行分析。

论文提到:通过中间中心度、接近中心度,从影响深度上进行社交网络“大V”的传播路径分析。

我们准备参照这2篇论文的部分内容,进行探索和实践,学习和实践论文中提到的计算方法。首先就是今天做的接近中心度的计算,后续会基于实际的微博数据进行其它的实验。

1.1,GooSeeker文本分词和情感分析软件已有的社会网络图功能

在之前的多个Notebook中,我们使用了GooSeeker文本分词和情感分析软件,进行中文文本分词,词频统计,词云图生成,人工筛选,情感分析,社会网络图生成:

截至今天(2021-07-09),除了社交网络图,GooSeeker文本分词和情感分析软件还没有上线其它的网络图或者相关的计算。

如果需要进一步的计算,比如,LDA聚类、主题分类、中心度等计算,我们会借助Jupyter Notebook,利用从GooSeeker文本分析软件导出的excel做进一步处理。

1.2,为什么做成Jupyter Notebook模板的形式

GooSeeker每年都要支持各个大学的毕业生采集数据完成他们的毕业设计,期望提供一系列辅助工具,跨过不必要的编程门槛,专注于领域设计。

1. 在数据采集方面,GooSeeker有一套微博采集工具,专门面向不希望编写网络爬虫程序的研究者设计的。 例如,可以先从微博关键词搜索入口,把搜到的涉及“xx城市空气”的微博话题采集下来,然后把这些话题的微博博文采集下来。微博博文内容呈现方式很丰富,文字、图片、视频都有。这些内容都可以采集下来,分别进行分析。例如,将视频采集下来以后抽取关键帧图片,利用图片分析方法进行分析。 针对重点的微博内容,可以深入采集转发和评论,转发者和评论者,可分析和描述传播的特征和转发者和评论者的传播者特征。还可以根据博主的粉丝数计算传播的量化特征。

GooSeeker推出多个微博采集工具,匹配高校师生从不同角度、不同传播路径、不同内容呈现采集数据的需求。同样也适用于公共领域和民间舆论场分析,市场和商业环境分析等。

2. 在中文信息处理方面,GooSeeker提供了文本分词和情感分析软件, 导入数据即可导出结果

3. 进一步数据处理方面,GooSeeker推出一系列Jupyter Notebook,借助于python的大量第三方库,为数据分析大量强大的工具。

Jupyter Notebook这类交互式数据探索和分析工具代表了一股不容忽视的潮流,借助于Python编程的强大力量,数据加工的能力和灵活性已经有相当明显的优势,尤其是程序代码和文字描述可以混合编排,数据探索和数据描述做完了,一篇研究报告也基本上成型了。

然而Python毕竟是一个全功能的编程语言,对于非编程出身的数据分析师来说,Pandas,Numpy,Matplotlib这些词让人望而生畏。本系列Notebook将设法解决这个问题,让非编程出身的数据分析师能够忽略复杂的编程过程,专注于数据处理和统计分析部分,就像使用Excel的公式一样驾驭Python。

所以,我们将尝试发布一系列Jupyter Notebook,像文档模板,一些基本的程序环境设置、文件操作等固化下来,在设定的分析场景下不需要改动程序代码。而数据处理部分的代码可以根据需要截取选用。每一项功能用一个code cell存代码,不需要的处理功能可以删除。

2,notebook模板的存储结构

本notebook项目目录都预先规划好了,具体参看Jupyter Notebook项目目录规划参考。如果要做多个分析项目,可以把整个模板目录专门拷贝一份给每个分析项目。

3,简要技术说明

在每个功能项单元,如果不需要关心的编程细节,将注明【编程细节】。

本notebook主要实现以下几个步骤:

1. 进行接近中心度计算实验

4,第三方库

无新增

5,数据源

无。基于构造的测试数据

6,修改历史

2021-07-09:第一版发布

7,版权说明

本notebook是GooSeeker大数据分析团队开发的,所分析的源数据是GooSeeker网络爬虫软件从互联网上收集的公开数据,本notebook中的数据和代码可自由共享使用,包括转发、复制、修改、用于其他项目中。

8,准备程序环境

导入必要的Python程序包,设定需要用到的的目录变量名。

import networkx as nx

import matplotlib.pyplot as plt

import pylab 

import numpy as np

%xmode Verbose

import warnings

warnings.filterwarnings("ignore", category=DeprecationWarning)

9,定义计算接近中心度的函数

以下的函数定义,是为了后面的调用,可以不用关注函数内部细节。只需要知道这里定义了一个计算接近中心度的函数,调用的格式为:getClosenessCentrality(graph)

【编程细节】输入数据是一个图数据结构,利用networkx程序包中的Dijkstra算法,计算两个图节点之间的距离

def getClosenessCentrality(graph):

    closeness=[]

    for i in graph.nodes():

        sumdij = 0;

        for j in graph.nodes():

            if(i != j):

                try:

                    sumdij += nx.dijkstra_path_length(graph, source=i, target=j)

                except:

                    continue

        di = sumdij/nx.number_of_nodes(graph)

        if di ==0:

            closeness.append((i,di))

        else:

            closeness.append((i,1/di))

    return closeness

10,实验一:最简单的情况,2个节点1条边构成的图

10.1,自定义网络

#自定义网络

row=np.array([0])

col=np.array([1])

value=np.array([1])

10.2,生成一个空的有向图

G=nx.DiGraph()

10.3,为这个网络添加节点

for i in range(0,np.size(col)+1):

    G.add_node(i)

10.4,在网络中添加带权重的边

for i in range(np.size(row)):

    G.add_weighted_edges_from([(row[i],col[i],value[i])])

10.5,画网络图

pos=nx.shell_layout(G)

nx.draw(G,pos,with_labels=True, node_color='white', edge_color='red', node_size=800, alpha=1 )

pylab.title('ClosenessCentralityTest',fontsize=25)

pylab.show()

10.6,计算接近中心度并输出值

close = getClosenessCentrality(G)

print("输出接近中心度的计算值:")

print(close)

输出:

输出接近中心度的计算值:

[(0, 2.0), (1, 0.0)]

11,实验二:有8个节点的图

11.1,自定义网络

#自定义网络

row=np.array([0,0,0,3,2,2,4])

col=np.array([1,2,3,6,4,5,7])

value=np.array([1,1,1,1,1,1,1])

11.2,生成一个空的有向图

G=nx.DiGraph()

11.3,为这个网络添加节点

for i in range(0,np.size(col)+1):

    G.add_node(i)

11.4,在网络中添加带权重的边

for i in range(np.size(row)):

    G.add_weighted_edges_from([(row[i],col[i],value[i])])

11.5,画网络图

pos=nx.shell_layout(G)

nx.draw(G,pos,with_labels=True, node_color='white', edge_color='red', node_size=800, alpha=1 )

pylab.title('ClosenessCentralityTest',fontsize=25)

pylab.show()

11.6,计算接近中心度并输出值

close = getClosenessCentrality(G)

print("输出接近中心度的计算值:")

print(close)

输出:

输出接近中心度的计算值:

[(0, 0.6666666666666666), (1, 0.0), (2, 2.0), (3, 8.0), (4, 8.0), (5, 0.0), (6, 0.0), (7, 0.0)]

12,后续的实验

1. 中间中心度计算的实验

2. 基于微博转发,评论,点赞等实际数据的传播路径实验


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2021-9-27 11:44