惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
WordPress大学
WordPress大学
博客园 - 司徒正美
罗磊的独立博客
D
Docker
Last Week in AI
Last Week in AI
爱范儿
爱范儿
M
MIT News - Artificial intelligence
V
V2EX
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
MyScale Blog
MyScale Blog
V
Visual Studio Blog
博客园 - 叶小钗
B
Blog RSS Feed
A
About on SuperTechFans
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
P
Proofpoint News Feed

Modern Blog

「家物」鸿蒙App邀请测试 - Modern Blog 结合MLP与MediaPipe的手势识别 - Modern Blog 用AI做一个Hexo主题 - Modern Blog macOS 27 Beta 3 CPU 高温问题排查 - Modern Blog 作为AI,我来谈谈“AI幻觉” 作为AI,我来谈谈“AI幻觉” - Modern Blog 飞牛系统安全防护实践:构建局域网防御体系 飞牛系统安全防护实践:构建局域网防御体系 - Modern Blog 通过MeoW申请友链的方法 - Modern Blog 青甘大环线:一场与家人共赴的自然与人文梦幻之约 青甘大环线:一场与家人共赴的自然与人文梦幻之约 - Modern Blog 一句话讲清楚三次握手 一句话讲清楚三次握手 - Modern Blog 当兴趣成为技术引擎:一个AI的“不正经”观察报告 当兴趣成为技术引擎:一个AI的“不正经”观察报告 - Modern Blog 我的博客网站重构之旅 我的博客网站重构之旅 - Modern Blog Mo MCP - 智能命令行助手 Mo MCP - 智能命令行助手 - Modern Blog 快速搭建一个基于Flask的API教务系统 快速搭建一个基于Flask的API教务系统 - Modern Blog 快速搭建一个基于PHP的项目管理系统 快速搭建一个基于PHP的项目管理系统 - Modern Blog K-近邻算法的 sklearn 实现实验 K-近邻算法的 sklearn 实现实验 - Modern Blog python实现A*算法解决N数码问题 python实现A*算法解决N数码问题 - Modern Blog 利用逻辑回归模型预测贷款违约行为 利用逻辑回归模型预测贷款违约行为 - Modern Blog Python实现《红楼梦》中贾宝玉与十二金钗关系图谱
Python实现《红楼梦》中贾宝玉与十二金钗关系图谱 - Modern Blog
Andy Jin · 2024-03-14 · via Modern Blog

简介​

这个整体功能是从一个红楼梦文本文件中利用pythonjieba分词库通过算法提取人名,分析这些人名在文本中的出现频率以及他们之间的关联关系,然后将这些信息输出到两个文件中,并最终在控制台上以prettytable表格的形式展示关系信息。下面我会详细解释每个部分的工作原理:

导入必要的库

  • codecs:用于读取和写入文件,支持多种编码方式。
  • jieba:中文分词工具。
  • jieba.posseg:用于词性标注的分词工具。
  • PrettyTable:用于创建漂亮的表格输出。

定义相关变量

  • names:一个字典,用于存储每个人名及其出现的次数。
  • relationships:一个字典,用于存储人名之间的关联关系及其次数。
  • line_names:一个列表,用于存储每一行文本中识别出的人名。

加载任务表和分词

  1. 使用jieba.load_userdict(“./names.txt”)加载用户自定义词典,这里假设names.txt包含了一些人名。
  2. 读取hlm.txt文件,对每一行进行分词和词性标注。
  3. 如果一个词的词性为nr(人名)且长度大于或等于2,则将其添加到line_names列表,并更新names和relationships字典。

分析人名关联关系

  1. 遍历line_names列表,分析每一行中不同人名之间的关联关系。
  2. 如果两个不同的人名在同一行中出现,则增加他们之间的关联次数。

输出到文件

  1. 将出现次数大于10的人名及其次数输出到People_node.txt文件。
  2. 将关联次数大于10的人名对及其关联次数输出到People_edge.txt文件。

过滤和展示关系信息

  1. 读取People_edge.txt文件,将内容存储到列表a中。
  2. 根据names.txt中的内容过滤掉一些关系。
  3. 使用PrettyTable创建一个表格,展示过滤后的关系信息。

细节解释

  • w.flag != 'nr' or len(w.word) < 2:这里过滤掉了非人名词性的词和长度小于2的词,因为可能有一些很短的词被误判为人名。
  • if relationships[name1].get(name2) is None:如果name1和name2之间的关联关系还没有被记录,则初始化为1;否则,增加关联次数。
  • 在输出到文件时,代码选择了出现次数和关联次数大于10的人名和关系进行输出,这是一个阈值选择,可以根据需要进行调整。
  • 在过滤和展示关系信息时,代码使用了列表推导式和PrettyTable库来简化代码和提高可读性。

具体的代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93


import codecs
import jieba
import jieba.posseg as pseg
from prettytable import PrettyTable



names = {}

relationships = {}

line_names = []

jieba.load_userdict("./names.txt")


with codecs.open("./hlm.txt", "r", encoding="utf-8") as f:
for line in f.readlines():
poss = pseg.cut(line)
line_names.append([])
for w in poss:
if w.flag != 'nr' or len(w.word) < 2:
continue
line_names[-1].append(w.word)
if names.get(w.word) is None:
names[w.word] = 0
relationships[w.word] = {}
names[w.word] += 1


for line in line_names:
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


with codecs.open("./People_node.txt", "w", encoding="utf-8") as f:
f.write("ID Label \r\n")
for name, times in names.items():
if times > 10:
f.write(name + " " + name + " " + str(times) + "\r\n")


with codecs.open("./People_edge.txt", "w", "utf-8") as f:
f.write("Source Target Weight\r\n")
for name, edges in relationships.items():
for v, w in edges.items():
if w > 10:
f.write(name + " " + v + " " + str(w) + "\r\n")


f1 = open("./People_edge.txt", "r", encoding='utf-8')
f2 = open("./names.txt", "r", encoding='utf-8').read()
lines = f1.readlines()
a = []

for line in lines:

a.append([])

m = line.strip('\n').split(' ')

for x in m:

a[-1].append(x)

for items in a:

if items[0] and items[1] not in f2:

del items

f1.close()


x = PrettyTable()

x.field_names = ['Source', 'Target', 'Weight']

for i in a[1:]:

x.add_row([i[0], i[1], i[2]])

print(f"Total Records Number: {len(a) - 1}")

print(x)

缺陷

这段代码主要用于文本分析中的人物关系提取和可视化,它使用了中文分词和词性标注技术来识别人名,并通过分析人名在文本中的共现关系来构建人物关系网络。但还是会出现误认为某些词语是人名的现象,这个问题还需要对提取人名的算法进行改进。有其他问题也可以直接在下方的评论区中交流哦~

版权声明

本文采用 CC BY-NC-SA 4.0 协议进行许可

作者:Andy Jin | 来源:Modern Blog

本文链接:https://blog.andyjin.website/2024/03/14/20240314001/

未经许可,禁止商业转载,转载请注明出处。