社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python文本挖掘:基于共现提取《釜山行》人物关系

大数据挖掘DT数据分析 • 7 年前 • 880 次点击  



大数据挖掘DT数据分析  公众号: datadw


《釜山行》是一部丧尸灾难片,其人物少、关系简单,非常适合我们学习文本处理。这个项目将介绍共现在关系中的提取,使用python编写代码实现对《釜山行》文本的人物关系提取,最终利用Gephi软件对提取的人物关系绘制人物关系图。实体间的共现是一种基于统计的信息提取。关系紧密的人物往往会在文本中多段内同时出现,可以通过识别文本中已确定的实体(人名),计算不同实体共同出现的次数和比率。当比率大于某一阈值,我们认为两个实体间存在某种联系。这种联系可以具体细化,但提取过程也更加复杂。因此在此课程只介绍最基础的共现网络。 
1.开发环境 
剧本 

http://7xktmz.com1.z0.glb.clouddn.com/Train%20to%20Busan.txt


字典 

http://labfile.oss.aliyuncs.com/courses/677/dict.txt


gephi 
Python2+jieba库 
2.实验过程 
开始编写我们的代码。

import os, sys

import jieba, codecs, math

import jieba.posseg as pseg


names = {}

relationships = {}

lineNames = []


字典类型names保存人物,该字典的键为人物名称,值为该人物在全文中出现的次数。字典类型relationships保存人物关系的有向边,该字典的键为有向边的起点,值为一个字典edge,edge的键是有向边的终点,值是有向边的权值,代表两个人物之间联系的紧密程度。lineNames是一个缓存变量,保存对每一段分词得到当前段中出现的人物名称,lineNames[i]是一个列表,列表中存储第i段中出现过的人物。

jieba.load_userdict("dict.txt")

with codecs.open("to_train.txt", "r", "utf8") as f:

    for line in f.readlines():

        poss = pseg.cut(line)

        lineNames.append([])

        for w in poss:

            if w.flag != "nr" or len(w.word) < 2:

                continue

            lineNames[-1].append(w.word)

            if names.get(w.word) is None:

                names[w.word] = 0

                relationships[w.word] = {}

            names[w.word] += 1


在具体实现过程中,读入剧本的每一行,对其做分词。提取该行中出现的人物集存入lineNames中。之后对出现的人物,更新他们在names中的出现次数。

for line in lineNames:

    for name1 in line:

        for name2 in line:

            if name1 == name2:

                continue

            if relationships[name1].get(name2) is None:

                relationships[name1][name2]= 1

            else:

                relationships[name1][name2] = relationships[name1][name2]+ 1


对于lineNames中每一行,我们为该行中出现的所有人物两两相连。如果两个人物之间尚未有边建立,则将新建的边权值设为1,否则将已存在的边的权值加1。这种方法将产生很多的冗余边,这些冗余边将在最后处理。

with codecs.open("node.txt", "w", "gbk") as f:

    f.write("Id Label Weight\r\n")

    for name, times in names.items():

        f.write(name + " " + name + " " + str(times) + "\r\n")


with codecs.open("edge.txt", "w", "gbk") as f:

    f.write("Source Target Weight\r\n")

    for name, edges in relationships.items():

        for v, w in edges.items():

            if w > 3:

                f.write(name + " " + v + " " + str(w) + "\r\n")


将已经建好的names和relationships输出到文本,以方便gephi可视化处理。输出边的过程中可以过滤可能是冗余的边,这里假设共同出现次数少于3次的是冗余边,则在输出时跳过这样的边。 
完整的代码如下。


运行得到节点集合node.txt,边集合edge.txt。 


下面使用gephi这个软件来将人物关系可视化。启动gephi,分别选择节点表格和边表格导入上面代码中生成的两个文件,分隔符选择空格,编码选择GB2312。 


 
 
可以在最上方的数据资料选项卡中查看图中所有的边和节点,对于分词不准确导致的噪音可以手动删除。分别点击右侧统计栏中平均度和模块化运行计算。模块化运算时Resolution值填写0.5。 


 
点击左上角外观中节点第一个选项卡,选择数值设定,选择Modularity Class,点击应用。 


 

点击左上角外观中节点第二个选项卡,选择数值设定,选择连入度,最小尺寸填10,最大尺寸填40,点击应用。 


 


选择左下角布局中的Force Atlas,斥力强度填写20000.0,吸引强度填写 1.0。点击运行,稍后点击停止。 


 
点染色根据模块化计算结果不定,但染色效果大致相同。点击最上方的预览按钮,选中左侧节点标签中显示标签选项,并选择一种字体。 



点击刷新按钮,右侧显示最终的人物关系图。为了优化显示的效果,还可以调整左边的参数。 


人工智能大数据与深度学习

搜索添加微信公众号:weic2c


长按图片,识别二维码,点关注



大数据挖掘DT数据分析

搜索添加微信公众号:datadw


教你机器学习,教你数据挖掘


长按图片,识别二维码,点关注



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/0kAdcVevpy
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/3450
 
880 次点击