python统计武侠小说中前20名出现最高频率的人物排名

一、实验目的

1.通过上机实践加深对自然语言处理的理解

2.对TF-IDF算法和TextRank算法实现关键词的词频计算与排列的理解与应用

3.能够开发出相应的源代码以提升动手实践能力

二、实验工具与方法

1.TF-IDF算法和TextRank算法

2.numpy和jieba.analyse库

三、实验结果与分析

读取文件并检测编码:

通过open函数以二进制模式('rb')打开小说文件,读取其内容到raw_data变量。

使用chardet.detect函数检测文件的编码格式,并打印出检测到的编码格式。

根据检测到的编码格式,使用decode方法将二进制数据解码为文本,忽略无法解码的字符。

中文分词:

使用jieba.cut方法对解码后的文本进行分词,得到分词后的生成器对象words。

将分词结果转换为列表word_list,以便后续统计。

统计人物名字出现频率:

定义一个包含小说中人物名字的列表characters。

使用Counter类对word_list进行统计,得到每个词出现的频率。

通过字典推导式,从统计结果中提取出characters列表中人物名字的出现次数,存入character_counts字典。

对character_counts字典按出现次数进行降序排序,得到sorted_character_counts列表。

打印出前20个出现频率最高的人物名字及其出现次数。

使用TextRank算法提取关键词:

使用jieba.analyse.textrank方法对文本进行关键词提取,提取前20个关键词及其权重。

打印出TextRank算法提取的前20个关键词(可能包含人物名)及其权重。

四、源码

import chardet
import jieba
import jieba.analyse
from collections import Counter

# 读取《天龙八部》小说文件路径
file_path = 'D:/Zhao/desktop/天龙八部小说.txt'

# 以二进制模式读取文件内容
with open(file_path, 'rb') as file:
    raw_data = file.read()

# 使用 chardet 检测文件的编码格式
result = chardet.detect(raw_data)
encoding = result['encoding']

# 打印检测到的编码格式
print(f"检测到的文件编码格式: {encoding}")

# 使用检测到的编码格式重新解码文本,忽略无法解码的字符
text = raw_data.decode(encoding, errors='ignore')

# 使用jieba进行分词
words = jieba.cut(text)

# 转为列表,方便统计
word_list = list(words)

# 可以在这里补充更多人物名字
characters = [
    '萧峰', '段誉', '虚竹', '乔峰', '阿朱', '阿紫', '慕容复', '王语嫣', '李秋水', '段正淳',
    '丁春秋',  '鸠摩智', '包不同', '慕容博', '岳老三','钟灵','乌老大','苏星河','阿碧','游坦之'
]

# 统计词语频率
word_counter = Counter(word_list)

# 提取出小说中所有出现的人物名字
# 这里你可以选择从分词中提取出与人物名相符的词语
character_counts = {name: word_counter[name] for name in characters}

# 按照出现频率排序
sorted_character_counts = sorted(character_counts.items(), key=lambda x: x[1], reverse=True)

# 输出前20个出现频率最高的人物
print("《天龙八部》人物排名(前20名):")
for rank, (name, count) in enumerate(sorted_character_counts[:20], 1):
    print(f"排名 {rank}: {name} 出现 {count} 次")


top_keywords = jieba.analyse.textrank(text, topK=20, withWeight=True)

# 输出TextRank排名
print("\nTextRank算法提取的前20个关键词(人物名):")
for rank, (keyword, weight) in enumerate(top_keywords, 1):
    print(f"排名 {rank}: {keyword} 权重 {weight:.4f}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西唯兵欧泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值