一、实验目的
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}")