python+gephi构建文本知识图谱
构建文本知识图谱主要分为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.附件
代码链接