快捷导航

怎样利用集搜客的共词矩阵表计算点度中心性(Degree centrality)

2021-7-14 10:56| 发布者: Fuller| 查看: 518| 评论: 0

摘要: 昨天已经发布了如何使用Jupyter Notebook计算中介中心度(betweenness centrality),今天这篇是怎样基于GooSeeker分词工具导出的共词矩阵表计算点度中心度。1,背景介绍这2周我们分享了几篇基于知乎和微博数据做知识 ...

昨天已经发布了如何使用Jupyter Notebook计算中介中心度(betweenness centrality),今天这篇是怎样基于GooSeeker分词工具导出的共词矩阵表计算点度中心度。

1,背景介绍

这2周我们分享了几篇基于知乎和微博数据做知识传播,主题传播,知识分享和关系路径的研究论文:

1. 网络问答社区“知乎”的知识分享与传播行为研究

该论文将社会网络分析应用于问答社区,辅以内容分析法,将目前国内发展势头最为迅猛的网络问答社区“知乎”作为分析对象,将成员进行知识分享时的互动关系视为社会网络关系,并利用社会网络指标将论坛成员的互动关系量化,探讨成员在知识分享活动中的互动模式,从而探究“知乎”网络问答社区的成员知识分享与传播行为。

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

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

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

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

这些论文案例中有提到:通过中间中心度、接近中心度,从影响深度上进行社交网络“大V”的传播路径分析或者是知识传播和知识分享。

我们准备针对这几个案例的部分内容,进行探索和实践。

1. 上周我们发布了怎样使用Jupyter Notebook计算接近中心度

2. 昨天已经发布了如何使用Jupyter Notebook计算中介中心度(betweenness centrality)

3. 今天的这个实验就是基于GooSeeker分词工具生成的共词矩阵excel表来计算点度中心度。


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

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

在GooSeeker软件上展示的社交网络图上,鼠标浮动到节点上可以看到点度中心度,但是导出的excel数据表中没有含有这个数值,而只有共现词矩阵,那么本文将讲解基于该表怎样计算点度中心性,怎样用Python构建一个共现关系无向图。

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

GooSeeker每年都要支持各个大学的毕业生采集数据完成他们的毕业设计,在这个过程中,GooSeeker会不断推出一些数据分析和内容分析的工具,让研究者专注于领域问题,少受编程和技术问题困扰。

1. 微博数据采集工具箱

GooSeeker有一套微博采集工具,专门面向不希望编写网络爬虫程序的研究者设计的。例如,可以先从微博关键词搜索入口,把搜到的涉及“xx城市空气”的微博话题采集下来,然后把这些话题的微博博文采集下来。微博博文内容呈现方式很丰富,文字、图片、视频都有。这些内容都可以采集下来,分别进行分析。例如,将视频采集下来以后抽取关键帧图片,利用图片分析方法进行分析。

针对重点的微博内容,可以深入采集转发和评论,转发者和评论者,可分析和描述传播的特征和转发者和评论者的传播者特征。还可以根据博主的粉丝数计算传播的量化特征。

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

2. 自然语言处理软件

数据采集下来之后,需要趁手的工具来做数据处理和数据分析,GooSeeker提供了文本分词和情感分析软件, 导入数据以后,只要些许操作,就可导出处理结果。处理结果是多张excel表格,便于后续的数据处理和分析。

3. 用Python和Jupyter Notebook扩展数据处理能力

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. 读取data/raw文件夹中的从分词工具导出的共词矩阵表

2. 计算点度中心度并显示输出

4,第三方库

decorator库版本5和network配合时有bug,需要安装4.2.2. 安装步骤如下:

1. 以管理员打开Anaconda PowerShell Prompt

2. 执行命令:pip install decorator==4.4.2

5,数据源

1.GooSeeker文本分词和情感分析软件导出的共词矩阵表,文件名格式为:共词矩阵_202107131111498890.xlsx

6,修改历史

2021-07-12:第一版发布

7,版权说明

本notebook是GooSeeker大数据分析团队开发的,本notebook中的代码可自由共享使用,包括转发、复制、修改、用于其他项目中。

8,什么是点度中心度(degree centrality)

点度中心度也可以理解为"连接中心度",顾名思义就是一个点与其他点直接连接的总和。 比如,想知道某个人在网络社交圈中处于哪种程度的凝聚力,就可以通过中心性的概念进行分析。 拿26个英文字母来代表一个由26个人组成的微博圈为例,想知道在这个26人的微博圈中,哪个人跟其圈中他人的连接最多,通过这个来判断谁具有最大的中心性,这就需要知道这个人和多少人有链接,这就是度中心度能够进行判断的。有时也用节点的大小(Size)来表达,一个节点的size越大,就说明其所占据的中心性越高。比如在上面的26个人的微博圈中,A和15个人有连接,B和10个人有连接,就可以知道A比B的度中心性高,A比B在这个26个人的微博圈中的社交面要广。

参看《Spark大数据分析-图算法,中心性算法》,详细讲解了各种中心性和PageRank,以及他们的算法。

9,怎样使用GooSeeker分词工具得到共词矩阵数据

步骤如下:

1.新建分词任务

2.基于自动分词结果进行人工筛选

3.启动共词匹配

4.下载“共词矩阵表”,会得到一个excel表格

10,怎样在共词矩阵excel数据表中计算点度中心度

从GooSeeker分词工具下载得到的共词矩阵表,是一个 n * n 的二维表,n 就是筛选后的词语数。

在共词矩阵excel数据表中计算点度中心度的步骤:

1. 在B列之前新添加1列,命名为“点中心度”

2. 选中B列的第2行单元格,填入公式:=COUNTIF(C2:DX2,">0")-1 后回车

3. 鼠标指向此单元格右下角,双击加号,让公式作用于整列的单元格

下面的内容将演示怎样在Jupyter Notebook中打开共词矩阵excel表,并用python来计算点度中心度

11,准备程序环境

导入必要的Python程序包,设定要分析的文件名变量。使用以下变量对应GooSeeker分词结果表:

file_co_word_matrix: 共词矩阵表

【编程细节】本节下面的代码将对上述词频表名变量赋值


import networkx as nx

import matplotlib.pyplot as plt

import pylab 

import numpy as np

import pandas as pd

import os

%xmode Verbose

import warnings

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

# 存原始数据的目录

raw_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\raw')

# 存处理后的数据的目录

processed_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\processed')

filename_temp = pd.Series(['共词矩阵'])

file_co_word_matrix = ''


12,检测data\raw目录下是否有共词矩阵表

# 0:'词频', 1:'分词效果', 2:'选词矩阵', 3:'选词匹配', 4:'选词结果', 5:'共词矩阵'

print(raw_data_dir + '\r\n')

for item_filename in os.listdir(raw_data_dir):

    if filename_temp[0] in item_filename:

        file_co_word_matrix = item_filename

        continue

if file_co_word_matrix:

    print("共词矩阵excel表:", "data\\raw\\", file_co_word_matrix)

else:

    print("共词矩阵excel表:不存在")


输出结果:

C:\Users\work\workspace_219\notebook\怎样利用集搜客的共词矩阵表计算点度中心性(Degree centrality)\notebook\eda\..\..\data\raw

共词矩阵excel表: data\raw\ 共词矩阵_202107131111498890.xlsx


13,读取共词矩阵表

以下的演示以GooSeeker分词和文本分析软件生成的共词矩阵excel表为例,需要把共词矩阵表放到本notebook的data/raw文件夹下

df = pd.read_excel(os.path.join(raw_data_dir, file_co_word_matrix),index_col=False)


14,显示前10行数据

df.head(10)

输出结果:

15,方法一:直接在pandas的dataframe里计算点度中心度

15.1,在dataframe最后新增1列“点度中心度”

df["点度中心度"] = 0

df.head(10)

15.2,计算点度中心度

计算的方法为:以词A为基准,如果词A和词B,在共现矩阵里的共现次数大于0,那么词A的点度中心度加1。以此类推

for row in df.index:

    for column in df.columns:

        if str(df.loc[row][column]).isnumeric() and float(df.loc[row][column]) > 0 and column != "点度中心度" and df.loc[row,"Unnamed: 0"]!=column:

            df.loc[row,"点度中心度"] = df.loc[row,"点度中心度"] + 1

15.3,显示计算后的表格

df

16,方法二:生成一个network无向图,然后基于无向图获取点度中心度

16.1,生成一个空的无向图

G=nx.Graph()


16.2,为这个无向图添加节点和边

for row in df.index:

    for column in df.columns:

        if str(df.loc[row][column]).isnumeric() and float(df.loc[row][column]) > 0 and column != "点度中心度" and df.loc[row,"Unnamed: 0"]!=column:

            G.add_edge(df.loc[row,"Unnamed: 0"],column) #添加边


16.3,计算点度中心度并输出值

degree = nx.degree(G) #点度中心度

print('点度中心度: ', degree)

degree = nx.degree(G) #点度中心度

print('点度中心度: ', degree)


输出结果:

点度中心度:  [('感觉', 125), ('没有', 125), ('速度', 125), ('很快', 125), ('外观', 125), ('效果', 125), ('系统', 125), ('手感', 125), ('拍照', 125), ('流畅', 125), ('好看', 125), ('屏幕', 124), ('音效', 124), ('待机时间', 124), ('外形', 124), ('一直', 123), ('漂亮', 123), ('满意', 123), ('价格', 123), ('特色', 123), ('清晰', 123), ('特别', 122), ('活动', 122), ('显示', 122), ('电池', 121), ('问题', 121), ('颜色', 121), ('很棒', 121), ('物流', 120), ('续航', 120), ('紫色', 120), ('充电', 120), ('舒服', 120), ('白色', 119), ('包装', 119), ('绿色', 119), ('音质', 117), ('卡顿', 116), ('边框', 115), ('设计', 115), ('完美', 115), ('经典', 115), ('充电器', 114), ('照片', 114), ('正品', 114), ('视频', 114), ('质感', 113), ('黑色', 113), ('快递', 113), ('颜值', 113), ('直角', 112), ('信号', 112), ('安卓', 111), ('声音', 111), ('夜景', 109), ('内存', 109), ('轻薄', 109), ('还行', 109), ('色彩', 109), ('大气', 106), ('晚上', 105), ('发货', 105), ('拍摄', 105), ('很轻', 103), ('蓝色', 103), ('电量', 102), ('尺寸', 101), ('顺畅', 101), ('耐用', 101), ('玩游戏', 100), ('扬声器', 100), ('处理器', 100), ('力度', 100), ('安全', 99), ('做工', 99), ('反应', 98), ('升级', 98), ('自营', 97), ('芯片', 95), ('强大', 95), ('分辨率', 95), ('游戏', 94), ('摄像头', 94), ('机身', 93), ('便宜', 93), ('信赖', 93), ('灵敏', 93), ('耳机', 93), ('清晰度', 93), ('轻巧', 92), ('华为', 92), ('网络', 92), ('红色', 92), ('开心', 91), ('精致', 90), ('软件', 90), ('外观设计', 89), ('相机', 89), ('开机', 89), ('老婆', 87), ('发烫', 86), ('原装', 86), ('杠杠', 86), ('官网', 85), ('造型', 85), ('送货', 85), ('惊喜', 85), ('单手操作', 83), ('发热', 82), ('女生', 81), ('手机壳', 79), ('顺滑', 79), ('会员', 79), ('无敌', 79), ('数据', 78), ('激活', 76), ('官方', 75), ('时尚', 74), ('实惠', 73), ('保障', 70), ('小巧', 69), ('毛病', 68), ('女朋友', 57), ('老公', 56), ('媳妇', 56), ('服务态度', 47)]


17,后续的实验

1. 基于知乎主题传播的实验

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


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2021-10-28 04:18