ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

基于Python的文本共现网络构建

2021-12-09 00:02:38  阅读:430  来源: 互联网

标签:node 共现 csv Python edge dict str 文本


目录

一、共现分析概念

二、共现类型

三、代码实现

3.1 构造分词函数 

3.2 字符串存储

3.3 构建字典

3.4 构建共现矩阵

3.5 主函数

3.6 Weight 大于 300

四、导入Gephi 制作网络图

4.1 下载安装Gephi

4.2 绘制共现网络图

五、如何利用CNKI制作关键词共现网络图


一、共现分析概念

“共现”指文献的特征项描述的信息共同出现的现象,这里的特征项包括文献的外部和内部特征,如题名、作者、关键词、机构等。 而“共现分析”是对共现现象的定量研究, 以揭示信息的内容关联和特征项所隐含的知识。

二、共现类型

(一)传统环境下的共现分析类型

(二)网络环境下的共现分析类型 

共词网络方法在知识网络研究中应用普遍,最为常见的就是利用论文关键词及其共现关系构建共词矩阵,进而映射为共词网络并可视化,从而来揭示某一学科某一领域某一主题的研究热点与趋势、知识结构与演化等。引自:共词网络的结构与演化-概念与理论进展。 

其基本含义:在大规模语料中,若两个词经常共同出现(共现)在截取的同一单元(如一定词语间隔/一句话/一篇文档等)中,则认为这两个词在语义上是相互关联的,而且,共现的频率越高,其相互间的关联越紧密。

在这里插入图片描述 图片来自:CiteSpace关键词共现图谱含义详细解析 

在文本挖掘中,有共现矩阵的概念,如下

·I like deep learning.
·I like NLP.
·I enjoy modeling.

在这里插入图片描述

三、代码实现

3.1 构造分词函数 

import pandas as pd
import numpy as np
import os
import jieba 

def my_cut(text): 
    
    word_dict_file = './sport_word.dict'
    # 加载自定义词典
    jieba.load_userdict(word_dict_file)

        
    # 加载停用词
    stop_words = [] 
    with open("./stopwords.txt", encoding='utf-8') as f:
       lines = f.readlines()
       for line in lines:
           stop_words.append(line.strip())
    # stop_words[:10]
           
    return [w for w in jieba.cut(text) if w not in stop_words and len(w)>1]

3.2 字符串存储

def str2csv(filePath, s, x):
    '''
    将字符串写入到本地csv文件中
    :param filePath: csv文件路径
    :param s: 待写入字符串(逗号分隔格式)
    '''
    if x=='node':
        with open(filePath, 'w', encoding='gbk') as f:
            f.write("Label,Weight\r")
            f.write(s)
        print('写入文件成功,请在'+filePath+'中查看')
    else:
        with open(filePath, 'w', encoding='gbk') as f:
            f.write("Source,Target,Weight\r")
            f.write(s)
        print('写入文件成功,请在'+filePath+'中查看')

3.3 构建字典

def sortDictValue(dict, is_reverse):
    '''
    将字典按照value排序
    :param dict: 待排序的字典
    :param is_reverse: 是否按照倒序排序
    :return s: 符合csv逗号分隔格式的字符串
    '''
    # 对字典的值进行倒序排序,items()将字典的每个键值对转化为一个元组,key输入的是函数,item[1]表示元组的第二个元素,reverse为真表示倒序
    tups = sorted(dict.items(), key=lambda item: item[1], reverse=is_reverse)
    s = ''
    for tup in tups:  # 合并成csv需要的逗号分隔格式
        s = s + tup[0] + ',' + str(tup[1]) + '\n'
    return s

3.4 构建共现矩阵

def build_matrix(co_authors_list, is_reverse):
    '''
    根据共同列表,构建共现矩阵(存储到字典中),并将该字典按照权值排序
    :param co_authors_list: 共同列表
    :param is_reverse: 排序是否倒序
    :return node_str: 三元组形式的节点字符串(且符合csv逗号分隔格式)
    :return edge_str: 三元组形式的边字符串(且符合csv逗号分隔格式)
    '''
    node_dict = {}  # 节点字典,包含节点名+节点权值(频数)
    edge_dict = {}  # 边字典,包含起点+目标点+边权值(频数)
    # 第1层循环,遍历整表的每行信息
    for row_authors in co_authors_list:
        row_authors_list = row_authors.split(' ') # 依据','分割每行,存储到列表中
        # 第2层循环
        for index, pre_au in enumerate(row_authors_list): # 使用enumerate()以获取遍历次数index
            # 统计单个词出现的频次
            if pre_au not in node_dict:
                node_dict[pre_au] = 1
            else:
                node_dict[pre_au] += 1
            # 若遍历到倒数第一个元素,则无需记录关系,结束循环即可
            if pre_au == row_authors_list[-1]:
                break
            connect_list = row_authors_list[index+1:]
            # 第3层循环,遍历当前行词后面所有的词,以统计两两词出现的频次
            for next_au in connect_list:
                A, B = pre_au, next_au
                # 固定两两词的顺序
                # 仅计算上半个矩阵
                if A==B:
                    continue
                if A > B:
                    A, B = B, A
                key = A+','+B  # 格式化为逗号分隔A,B形式,作为字典的键
                # 若该关系不在字典中,则初始化为1,表示词间的共同出现次数
                if key not in edge_dict:
                    edge_dict[key] = 1
                else:
                    edge_dict[key] += 1
    # 对得到的字典按照value进行排序
    node_str = sortDictValue(node_dict, is_reverse)  # 节点
    edge_str = sortDictValue(edge_dict, is_reverse)   # 边
    return node_str, edge_str

3.5 主函数

if __name__ == '__main__':
    os.chdir(r'.\')#os.chdir() 方法用于改变当前工作目录到指定的路径
    filePath1 = r'.\node.csv'
    filePath2 = r'.\edge.csv'
    # 读取csv文件获取数据并存储到列表中
    df = pd.read_csv('./人工智能11706.csv',encoding='utf-8')
    df_ = [w for w in df['摘要'] if len(w)>20]
    co_ist = [ " ".join(my_cut(w)) for w in df_] 
    # 根据共同词列表, 构建共现矩阵(存储到字典中), 并将该字典按照权值排序
    node_str, edge_str = build_matrix(co_ist, is_reverse=True)
    #print(edge_str)
    # 将字符串写入到本地csv文件中
    str2csv(filePath1,node_str,'node')
    str2csv(filePath2,edge_str,'edge')

生成的edge.csv文件预览                                                         生成的node.csv文件预览 

                       

3.6 Weight 大于 300

由于对1000篇文献(数据集市1w多篇,但是训练了一天还没有出来结果,所以就用前1000篇来做测试,由于数据集较小,所以结果并不是非常精确,这里我们主要是讲一下方法)摘要训练结果,weight大于300的就非常多,为了保证可视化程度,我们截取weight大于300的词。 

import pandas as pd
edge_str = pd.read_csv('./edge.csv',encoding='utf-8')
edge_str.shape

edge_str1 = edge_str[edge_str['Weight']>300]
edge_str1.shape

Source = edge_str1['Source'].tolist()
Target = edge_str1['Target'].tolist()
co = Source + Target
co =list(set(co))

node_str = pd.read_csv('./node.csv',encoding='utf-8')
#node_str

node_str=node_str[node_str['Label'].isin(co)]
node_str['id']=node_str['Label']
node_str = node_str[['id','Label','Weight']] # 调整列顺序
#node_str

node_str.to_csv(path_or_buf="node300.txt", index=False) # 写入csv文件
edge_str1.to_csv(path_or_buf="edge300.txt", index=False) # 写入csv文件

四、导入Gephi 制作网络图

4.1 下载安装Gephi

主要过程可参考【绘制关系网络图】Gephi 入门使用_积一时之步,臻千里之遥程-CSDN博客

利用Gephi软件绘制网络图_刘永鑫的博客——宏基因组公众号-CSDN博客_gephi生成网络关系图

注意事项:由于我用的java的JDK安装的比较早,是老版本,与最新的Gephi-0.9.2不匹配,所以我下载了Gephi-0.9.1,可以正常使用。

4.2 绘制共现网络图

以下是我绘制的第一张图,然后稍微摸索了一会绘制了第二张图,可以发现效果有所提升,哈哈,由于我使用的语料比较小,所以下图展示结果仅供参考。

五、如何利用CNKI制作关键词共现网络图

进入知网,可以选择跳转至旧版界面,可以发现与搜索关键词相关的主题内容

选择一些内容,然后计量可视化分析 

 跳转至关键词共现分析可视化界面

标签:node,共现,csv,Python,edge,dict,str,文本
来源: https://blog.csdn.net/weixin_43734080/article/details/121782267

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有