用jieba库算出聊斋志异的前20词

import jieba
from collections import Counter
import os

def analyze_liaozhai(file_path):
# 1. 检查文件是否存在
if not os.path.exists(file_path):
print(f"错误:找不到文件 '{file_path}'")
print("请确保你的目录下有《聊斋志异》的txt文本文件,并修改下面的文件名。")
return

2. 读取文本内容

try:
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
except UnicodeDecodeError:
# 如果utf-8报错,尝试gbk编码(有些老小说是gbk编码)
with open(file_path, 'r', encoding='gbk') as f:
text = f.read()

print(f"成功读取文件,字数:{len(text)}")

3. 定义同义词字典 (关键步骤:题目要求合并同一人的不同说法)

这里列举了聊斋中常见的别名,你可以根据需要添加

synonym_dict = {
'宁采臣': '宁采臣',
'聂小倩': '聂小倩',
'燕赤霞': '燕赤霞',
'黑山老妖': '黑山老妖',
'姥姥': '黑山老妖', # 假设将树精姥姥归为反派BOSS类,或者你可以单独列出
'蒲松龄': '作者',
'留仙': '作者', # 蒲松龄字留仙
'柳泉居士': '作者',
'画皮鬼': '恶鬼',
'王生': '王生'
}

4. 定义停用词 (去掉这些没有实际意义的虚词)

这是一个基础列表,实际项目中通常会加载一个大的stopwords.txt文件

stopwords = {
'的', '了', '在', '是', '我', '有', '和', '就', '不', '人', '都', '一', '一个',
'上', '也', '很', '到', '说', '要', '去', '你', '会', '着', '没有', '看', '好',
'自己', '这', '他', '她', '它', '们', '那', '些', '什么', '怎么', '如何', '把',
'让', '向', '从', '被', '给', '与', '及', '等', '而', '但', '却', '又', '或',
'之', '其', '以', '于', '为', '所', '者', '如', '此', '若', '然', '则', '虽',
'即', '乃', '亦', '非', '未', '已', '曾', '将', '欲', '可', '能', '应', '当',
'只', '仅', '唯', '独', '皆', '俱', '咸', '悉', '尽', '全', '每', '各', '某',
'该', '本', '该', '该', '该', '该', '该', '该', '该', '该', '该', '该', '该',
'\n', ' ', '\t', '“', '”', '‘', '’', '(', ')', '(', ')', ',', '.', '!', '?',
':', ';', ';', '、'
}

5. 进行分词处理

words = jieba.lcut(text)

6. 清洗数据:过滤停用词 + 合并同义词

cleaned_words = []
for word in words:
# 去除首尾空格
word = word.strip()

过滤掉长度小于2的词(通常单字没有太大统计意义,除非是人名)和停用词

if len(word) > 1 and word not in stopwords:
# 检查是否需要合并同义词
if word in synonym_dict:
cleaned_words.append(synonym_dict[word])
else:
cleaned_words.append(word)

7. 统计词频并获取前20名

word_counts = Counter(cleaned_words)
top_20 = word_counts.most_common(20)

8. 输出结果

print("\n--- 《聊斋志异》词频统计 Top 20 ---")
print(f"{'排名':<5} {'词语':<10} {'次数'}")
print("-" * 30)
for i, (word, count) in enumerate(top_20, 1):
print(f"{i:<5} {word:<10} {count}")

--- 主程序入口 ---

if name == 'main':
# 【重要】请将这里的 'liaozhai.txt' 替换为你实际的 txt 文件名
# 确保这个文件和你的 python 脚本在同一个文件夹下
filename = 'liaozhai.txt'
analyze_liaozhai(filename)

posted @ 2026-06-17 16:22  陈可芊  阅读(8)  评论(0)    收藏  举报