Python数据分析初学者

python+gephi构建文本知识图谱

2019-02-02  本文已影响28人  f5065e26181b

构建文本知识图谱主要分为3部分,首先对文本中的关键词进行提取,其次是根据提取信息构建关键词之间的共现矩阵,最后通过gephi软件导入矩阵进行画图。本文以《倚天屠龙记》小说文本为例进行分析,先上效果图:


倚天屠龙.png

文章主要参考:
(1)利用Python+Gephi构建金庸人物知识图谱(该文代码为Python2.7,代码不能直接用,主要参照文章爬虫和关键词提取)
(2)python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——人物关系可视化
(3)python构建关键词共现矩阵(主要参照共现矩阵构造)
(4)Gephi简易学习[二]————创建矩阵网络文件,并使用Gephi打开matrix.csv
(5)Gephi实例教程----手把手实现基于共现关系的剧本分析(主要参照Gephi软件的操作)

1.文本爬取

参考众多大神的经验,关键词之间的关联(即:边)大部分是以小说章节或者段落为基本分析单元,因此将同一章节中任意连续两个段落作为基本的分析单元,视为发生一次关联。而爬取的网页数据会将段落通过<p>与</p>进行分割,因此采取边文本爬取和文本分析同步的方式进行分析。
具体爬虫代码可以看参考文章(1),对于Python3的使用者,存在一些版本的影响,比如:urllib2在Python3中已不再使用,需要替换为urllib.request。
适合Python3的版本如下:

import urllib.request
from bs4 import BeautifulSoup
import re

class PaChong:
    def __init__(self, URL, URL_ID, URL_Base):
        self.URL = URL
        self.URL_ID = URL_ID
        self.URL_Base = URL_Base
        self.listpath = None

    def OpenSeeion(self):  # 获取小说所有章节链接;
        try:
            respond = urllib.request.urlopen(self.URL)
            html = respond.read()
            soup = BeautifulSoup(html, 'lxml', from_encoding='utf-8')
            OringialPath = soup.find_all(class_="mlist");
            pattern = re.compile('(?<=href=").*?(?=")')
            self.listpath = re.findall(pattern, str(OringialPath))
        except:
            print('Error')

    def gettext(self, sessionURL):  # 获取该章节所有段落
        web = self.URL_Base + sessionURL
        respond = urllib.request.urlopen(web)
        html = respond.read()
        soup = BeautifulSoup(html, 'lxml', from_encoding='utf-8')
        pattern = re.compile('(?<=<p>).*?(?=</p>)')
        text = re.findall(pattern, str(soup))
        return text

2.数据提取

本文数据提取参考文章(1),只需对《倚天屠龙记》中的武侠人物进行分析。因此,首先在mysql数据库中建立武侠人物字典;然后调用jieba对爬取的文本进行分词,最后与人物字典进行比对,将相关信息存到新的表中。


人物字典.PNG

文本分析部分代码为,其中几类namelist为上图的人物字典中的数据,text为爬取的文本段落:

    def tongji(namelist, namelist_1, namelist_2, namelist_3, text):
        result = [0] * (len(namelist))
        for t in range(len(result)):
            result[t] = 0
        seg_list = jieba.cut(text)
        c = Counter()
        for x in seg_list:
            if len(x) > 1 and x != '\r\n':
                c[x] += 1
        for (key, value) in c.items():
            k = "%s" % (key)
            v = int(value)
            if k in namelist:
                num = namelist.index(k)
                result[num] = result[num] + v
            elif k in namelist_1:
                num = namelist_1.index(k)
                result[num] = result[num] + v
            elif k in namelist_2:
                num = namelist_2.index(k)
                result[num] = result[num] + v
            elif k in namelist_3:
                num = namelist_3.index(k)
                result[num] = result[num] + v
            else:
                continue
        return result

构建mysql数据表存储分析结果,结果如图:


分析结果.PNG

其中每一行数据为相邻两个段落的分析结果,处于一行的ID说明发生了联系,Nm为该名字出现的频次。

3.构建共现矩阵

共现分析在数据分析中经常使用到,这里的关键词可以指的是文献中的关键词、作者、作者机构等等。在其他领域中,如电影电视剧也可以用来研究演员共现矩阵等等。在得出共现矩阵后,可以使用UCINET、NETDRAW或者Gephi来进行共现图谱的绘制,达到数据可视化的效果。
构建共现矩阵分为建立矩阵(矩阵大小为人物的数量)、初始化矩阵(将第一行、第一列赋值为人物名称)、将对两个出现于同一段落的人物对应的matrix[i][j]加1。

def buildmatrix(x, y):
    return [[0 for j in range(y)] for i in range(x)]

def inimatrix(matrix, dic, length):
    matrix[0][0] = '+'
    for i in range(1, length):
        matrix[0][i] = dic[i]
    for i in range(1, length):
        matrix[i][0] = dic[i]
    return matrix

def countmatirx(matrix, sValue, mlength):
    for ech in sValue:
        data = str(ech[2])
        Value = json.loads(data)
        lst = []
        for med in Value:
            lst.append(med["ID"])
        for row_id in range(1,mlength):
            for col_id in range(1,mlength):
                if row_id in lst and col_id in lst:
                    matrix[row_id][col_id] += 1
                else:
                    continue
    return matrix

输出结果为:


共现矩阵.PNG

4.Gephi软件画图

(1)软件安装,官网免费下载,安装前要确保系统安装JDK;
(2)共现矩阵导入,具体参照文章4;
(3)具体画图设置,参照文章2和5。

5.附件

代码链接

上一篇下一篇

猜你喜欢

热点阅读