知识图谱(Knowledge Graph)是一种用点来代替实体,用边代替实体之间关系的一种语义网络。

第1关:构建关键词共现矩阵所需数据集

import pandas as pd
import numpy as np


def authors_stat(co_authors_list):
    au_dict = {}  # 单个作者频次统计
    au_group = {}  # 两两作者合作
#********** Begin **********#

    for authors in co_authors_list:
        authors = authors.split(',')  # 按照逗号分开每个作者
        authors_co = authors  # 合作者同样构建一个样本
        for au in authors:            # 统计单个作者出现的频次 
            if au not in au_dict:  
                au_dict[au] = 1   
            else:     
                au_dict[au] += 1            # 统计合作的频次
            authors_co = authors_co[1:]  # 去掉当前作者   
            for au_c in authors_co:        
                A, B = au, au_c  # 不能用本来的名字,否则会改变au自身  
                if A > B:       
                    A, B = B, A  # 保持两个作者名字顺序一致 
                co_au = A+','+B  # 将两个作者合并起来,依然以逗号隔开   
                if co_au not in au_group: 
                    au_group[co_au] = 1       
                else:     
                    au_group[co_au] += 1


#********** End **********# 
    print(au_group)
    print(au_dict)
    return au_group, au_dict

if __name__ == '__main__':
    co_authors = '张三,李四,王五,赵二//张三,钱七,李四//王五,赵二,钱七'
    co_authors_list = co_authors.split('//')
    au_group, au_dict = authors_stat(co_authors_list)

相关知识:

1、处理输入数据

输入数据是一段已经定义在主函数中的字符串,首先对数据进行有效地分割。第二关我们需要单个作者频次统计和两两作者合作频次统计这两组数据来构造最终的共现矩阵,所以本关的输出如下所示。两个输出是为了检测答案,第三个return是为了第二关。

print(au_group)
print(au_dict)
return au_group, au_dict//第一个代表两两作者合作频次,第二个代表单个作者频次

第2关:构建netdraw所需关键词共现矩阵

import pandas as pd
import numpy as np


def authors_stat(co_authors_list):
    au_dict = {}  # 单个作者频次统计
    au_group = {}  # 两两作者合作
    for authors in co_authors_list:
        authors = authors.split(',')  # 按照逗号分开每个作者
        authors_co = authors  # 合作者同样构建一个样本
        for au in authors:
            # 统计单个作者出现的频次
            if au not in au_dict:
                au_dict[au] = 1
            else:
                au_dict[au] += 1
            # 统计合作的频次
            authors_co = authors_co[1:]  # 去掉当前作者
            for au_c in authors_co:
                A, B = au, au_c  # 不能用本来的名字,否则会改变au自身
                if A > B:
                    A, B = B, A  # 保持两个作者名字顺序一致
                co_au = A+','+B  # 将两个作者合并起来,依然以逗号隔开
                if co_au not in au_group:
                    au_group[co_au] = 1
                else:
                    au_group[co_au] += 1
    #print(au_group)
    #print(au_dict)
    return au_group, au_dict


def generate_matrix(au_group, matrix):
#********** Begin **********#
    for key, value in au_group.items():  
        A = key.split(',')[0] 
        B = key.split(',')[1]
        Fi = au_dict[A]
        Fj = au_dict[B]
        Eij = value*value/(Fi*Fj)
        matrix.ix[A, B] = Eij
        matrix.ix[B, A] = Eij
#********** End **********#
    return matrix


if __name__ == '__main__':
    #co_authors = 'a,b,n,d,y//b,d,a,s//a,n,d,b,s'
    co_authors = '张三,李四,王五,赵二//张三,钱七,李四//王五,赵二,钱七'
    #co_authors = 'a,b,c//a,c,d//b,c,d'
    co_authors_list = co_authors.split('//')
    au_group, au_dict = authors_stat(co_authors_list)
    #print(au_group)
    #print(au_dict)
    au_list = list(au_dict.keys())  # 取出所有单个作者
    # 新建一个空矩阵
    matrix = pd.DataFrame(np.identity(len(au_list)), columns=au_list, index=au_list)
    #print(matrix)
    matrix = generate_matrix(au_group, matrix)
    print(matrix)

相关知识:

1、如何构造矩阵并对其进行填充

共现矩阵中的元素采用Equivalence系数进行归一化,公式如下: Eij=Fij·Fij/(Fi·Fj) 其中,Eij为共现矩阵元素的值,Fij为两个目标对象ij共现的字数,Fi为目标对象i出现的总频次,Fj为目标对象j出现的总频次。

最终得到如下矩阵:

XX XX XX XX XX
XX 1.00 ? ? ? ?
XX ? 1.00 ? ? ?
XX ? ? 1.00 ? ?
XX ? ? ? 1.00 ?
XX ? ? ? ? 1.00

?是需要我们根据公式求出的。

-END-

知识图谱 Python代码 知识图谱算法实现_自然语言处理