我们可以使用 Python 来完成这个任务。以下是一个完整的解决方案,假设我们选择的小说是《红楼梦》(作为中文小说的代表),我们将:
1. 读取文本;
2. 使用中文分词工具 `jieba` 进行分词;
3. 去除停用词(如“的”、“了”、“是”等无意义词);
4. 只保留**名词**和**动词**(如果是小说,则进一步筛选出**人物名词**);
5. 统计词频并显示前20位。
由于《红楼梦》中的人物众多,我们可以结合一个常见人物名单来提取人物名词。
---
### ✅ 示例:统计《红楼梦》中人物名词的词频(前20)
```python
import jieba
import jieba.posseg as pseg
from collections import Counter
import re
# 加载停用词表(可以自定义或使用通用停用词)
def load_stopwords(file_path=None):
# 如果没有提供文件,使用默认常用停用词
stopwords = set([
' ', '\n', '\t', ',', '。', '?', '!', ';', ':', '“', '”', '‘', '’',
'、', '(', ')', '【', '】', '…', '·', '—', ' ',
'我', '你', '他', '她', '它', '这', '那', '都', '也', '还', '就',
'在', '上', '下', '里', '外', '从', '向', '对', '给', '与', '为',
'着', '了', '过', '的', '地', '得', '之', '而', '以', '及', '或'
])
if file_path:
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
stopwords.add(line.strip())
return stopwords
# 加载《红楼梦》文本(需提前准备txt文件)
def load_text(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read()
# 清洗文本:去除页码、注释等非正文内容(根据实际文本调整)
text = re.sub(r'第.{1,4}回', '', text) # 简单去除回目标题干扰
return text
# 提取所有人名(基于jieba的词性标注)
def extract_person_names(text, stopwords):
words = pseg.cut(text)
person_list = []
for word, flag in words:
# jieba 中人名的词性标记为 'nr'
if len(word) < 2: # 排除单字
continue
if word in stopwords:
continue
if flag == 'nr': # nr 表示人名
person_list.append(word)
return person_list
# 主函数
def main():
# 步骤1:加载文本和停用词
text_file = 'hongloumeng.txt' # 请确保该文件存在
try:
text = load_text(text_file)
except FileNotFoundError:
print(f"未找到文件 {text_file},请下载《红楼梦》全文txt并命名为 hongloumeng.txt")
return
stopwords = load_stopwords()
# 步骤2:提取人名
print("正在分词并提取人物名词...")
persons = extract_person_names(text, stopwords)
# 步骤3:统计词频
counter = Counter(persons)
top_20 = counter.most_common(20)
# 步骤4:输出结果
print("\n《红楼梦》人物词频统计(前20位):")
print("-" * 30)
for name, freq in top_20:
print(f"{name}: {freq}")
# 如果没有现成文件,可以用下面这段测试代码模拟部分内容
TEST_MODE = False
if TEST_MODE:
sample_text = """
宝玉见黛玉来了,忙迎上去。黛玉道:“你又胡闹。”宝钗在一旁冷笑。
贾母最爱宝玉,王熙凤最能干。探春精明,惜春爱画。袭人温柔,晴雯刚烈。
林黛玉葬花,贾宝玉哭灵。薛宝钗劝学,王夫人念佛。
"""
with open('hongloumeng.txt', 'w', encoding='utf-8') as f:
f.write(sample_text)
print("测试文本已生成。")
# 运行主程序
if __name__ == '__main__':
main()
```
---
### 🔍 解释说明:
- `jieba.posseg`:支持词性标注,`nr` 是“人名”的标签;
- `load_stopwords()`:过滤掉常见虚词、标点、代词等无关词汇;
- `extract_person_names()`:只保留被识别为人名(`nr`)且不在停用词中的词语;
- `Counter`:高效统计频率;
- 输出的是按出现次数排序的前20个人物名称。
> ⚠️ 注意事项:
> - 需要安装 `jieba`:`pip install jieba`
> - 文本文件 `hongloumeng.txt` 需与脚本同目录,或修改路径;
> - jieba 对古文的人名识别有一定误差,可后续通过自定义词典增强(如添加 `宝玉/nr`, `黛玉/nr` 等);
---
### 📦 如何改进?
你可以进一步:
- 添加自定义词典提升识别准确率:
```python
jieba.add_word('宝玉', freq=200, tag='nr')
jieba.add_word('黛玉', freq=200, tag='nr')
```
- 使用更完整的人名列表进行后处理匹配;
- 将“贾宝玉”、“宝玉”统一归为同一人物(消歧处理);
---