点击查看代码
import jieba
from collections import Counter
# 添加自定义词典确保人物名称正确切分
character_names = [
'孙悟空', '孙行者', '行者孙', '齐天大圣', '美猴王', '弼马温',
'唐僧', '唐三藏', '玄奘', '御弟圣僧',
'猪八戒', '猪悟能', '天蓬元帅', '呆子',
'沙僧', '沙和尚', '沙悟净', '卷帘大将',
'如来', '如来佛祖', '释迦牟尼',
'观音', '观世音', '菩萨',
'玉帝', '玉皇大帝',
'太白金星',
'太上老君',
'菩提祖师'
]
for name in character_names:
jieba.add_word(name)
# 人物别名映射字典
name_mapping = {
'孙行者': '孙悟空', '行者孙': '孙悟空', '齐天大圣': '孙悟空',
'美猴王': '孙悟空', '弼马温': '孙悟空',
'唐三藏': '唐僧', '玄奘': '唐僧', '御弟圣僧': '唐僧',
'猪悟能': '猪八戒', '天蓬元帅': '猪八戒', '呆子': '猪八戒',
'沙和尚': '沙僧', '沙悟净': '沙僧', '卷帘大将': '沙僧',
'如来佛祖': '如来', '释迦牟尼': '如来',
'观世音': '观音', '菩萨': '观音',
'玉皇大帝': '玉帝'
}
# 读取《西游记》文本
with open('xiyouji.txt', 'r', encoding='utf-8') as f:
text = f.read()
# 分词处理
words = jieba.lcut(text)
# 统一人物名称并统计
character_counter = Counter()
for word in words:
# 统一人物称呼
normalized_name = name_mapping.get(word, word)
# 只统计主要人物
if normalized_name in ['孙悟空', '唐僧', '猪八戒', '沙僧',
'如来', '观音', '玉帝',
'太白金星', '太上老君', '菩提祖师']:
character_counter[normalized_name] += 1
# 获取出现频率最高的前十位
top_characters = character_counter.most_common(10)
print("《西游记》主要人物出现频率:")
for character, count in top_characters:
print(f"{character}: {count}次")