Python实现《红楼梦》中贾宝玉与十二金钗关系图谱
本文最后更新于 2026年5月6日 下午
AI文章摘要
本文介绍利用Python的jieba库对《红楼梦》文本进行人名提取与共现分析,统计人名频率及关系,输出至文件并用PrettyTable展示,实现人物关系网络的初步构建与可视化。
简介
这个整体功能是从一个红楼梦文本文件中利用python的jieba分词库通过算法提取人名,分析这些人名在文本中的出现频率以及他们之间的关联关系,然后将这些信息输出到两个文件中,并最终在控制台上以prettytable表格的形式展示关系信息。下面我会详细解释每个部分的工作原理:
导入必要的库
codecs:用于读取和写入文件,支持多种编码方式。jieba:中文分词工具。jieba.posseg:用于词性标注的分词工具。PrettyTable:用于创建漂亮的表格输出。
定义相关变量
- names:一个字典,用于存储每个人名及其出现的次数。
- relationships:一个字典,用于存储人名之间的关联关系及其次数。
- line_names:一个列表,用于存储每一行文本中识别出的人名。
加载任务表和分词
- 使用jieba.load_userdict(“./names.txt”)加载用户自定义词典,这里假设names.txt包含了一些人名。
- 读取hlm.txt文件,对每一行进行分词和词性标注。
- 如果一个词的词性为nr(人名)且长度大于或等于2,则将其添加到line_names列表,并更新names和relationships字典。
分析人名关联关系
- 遍历line_names列表,分析每一行中不同人名之间的关联关系。
- 如果两个不同的人名在同一行中出现,则增加他们之间的关联次数。
输出到文件
- 将出现次数大于10的人名及其次数输出到People_node.txt文件。
- 将关联次数大于10的人名对及其关联次数输出到People_edge.txt文件。
过滤和展示关系信息
- 读取People_edge.txt文件,将内容存储到列表a中。
- 根据names.txt中的内容过滤掉一些关系。
- 使用PrettyTable创建一个表格,展示过滤后的关系信息。
细节解释
w.flag != 'nr' or len(w.word) < 2:这里过滤掉了非人名词性的词和长度小于2的词,因为可能有一些很短的词被误判为人名。if relationships[name1].get(name2) is None:如果name1和name2之间的关联关系还没有被记录,则初始化为1;否则,增加关联次数。- 在输出到文件时,代码选择了出现次数和关联次数大于10的人名和关系进行输出,这是一个阈值选择,可以根据需要进行调整。
- 在过滤和展示关系信息时,代码使用了列表推导式和PrettyTable库来简化代码和提高可读性。
具体的代码实现
1 | |
缺陷
这段代码主要用于文本分析中的人物关系提取和可视化,它使用了中文分词和词性标注技术来识别人名,并通过分析人名在文本中的共现关系来构建人物关系网络。但还是会出现误认为某些词语是人名的现象,这个问题还需要对提取人名的算法进行改进。有其他问题也可以直接在下方的评论区中交流哦~
Python实现《红楼梦》中贾宝玉与十二金钗关系图谱
https://www.andyjin.website/2024/03/14/20240314001/