【Python】 -- 实现统计《红楼梦》人物名称出现次数

本文介绍了如何使用jieba库对《红楼梦》中的人物名称进行统计,首先展示了初级实现,然后通过添加别称并改进代码实现加强版,确保人物别称被正确归一化,从而提高统计准确性。通过比较两次运行结果,显示加强版统计更严谨,人物出场次数和排名发生变化。

前面文章已经具体讲解了对统计《三国演义》人物名称出现次数的操作和实现思路,如有需要可以浏览。

初级实现代码

import jieba
excludes = {"什么","一个","我们","那里","如今","你们","说道","起来",
            "姑娘","这里","出来","他们","众人","奶奶","自己","一面",
            "太太","只见","怎么","两个","没有","不是","不知","这个",
            "知道","听见","这样","进来","告诉","东西","咱们","就是",
            "回来","大家","只是","老爷","只得","丫头","这些","不敢",
            "出去","所以","不过"}
txt = open("红楼梦.txt","r",encoding='gb18030').read()
words = jieba.lcut(txt)
counts = {}
for word in words:
    if len(word) == 1:
        continue
    elif word == '宝玉':
        rword = '贾宝玉'
    elif word == '凤姐':
        rword = '王熙凤'
    elif word == '老太太':
        rword = '贾母'
    elif word == '宝钗':
        rword = '薛宝钗'
    elif word == '黛玉':
        rword = '林黛玉'
    elif word == '二太太':
        rword = '王夫人'
    elif word == '琏二爷':
        rword = '贾琏'
    elif word == '平姐姐':
        rword = '平儿'
    elif word == '薛夫人':
        rword = '薛姨妈'
    else:
        rword = word
    counts[rword] = counts.get(rword,0) + 1
for word in excludes:
    del(counts[word])
items = list(counts.items())
items.sort(key = lambda x:x[1],reverse=True)
for i in range(10):
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word,count))

运行结果

 为什么说是初级代码?因为可以数据更加严谨统计,我们都知道人物名称在文章中不可能都只出现一次,还可能有别称,如贾宝玉可能有“宝二爷”的别称,因此可以将这些别称都统计为一个名称,为防止jieba库可能分词不理想,可以手动将这些别称添加到jieba库中。

加强版实现代码

import jieba
excludes = {"什么","一个","我们","那里","如今","你们","说道","起来",
            "姑娘","这里","出来","他们","众人","奶奶","自己","一面",
            "太太","只见","怎么","两个","没有","不是","不知","这个",
            "知道","听见","这样","进来","告诉","东西","咱们","就是",
            "回来","大家","只是","老爷","只得","丫头","这些","不敢",
            "出去","所以","不过"}
txt = open("红楼梦.txt","r",encoding='gb18030').read()
words = jieba.lcut(txt)
jieba.add_word('宝二爷')
jieba.add_word('凤辣子')
jieba.add_word('凤哥儿')
jieba.add_word('凤丫头')
jieba.add_word('二太太')
jieba.add_word('林妹妹')
jieba.add_word('林姑娘')
jieba.add_word('琏二爷')
jieba.add_word('宝丫头')
jieba.add_word('宝姑娘')
jieba.add_word('宝姐姐')
jieba.add_word('平姐姐')
jieba.add_word('平姑娘')
jieba.add_word('薛夫人')
jieba.add_word('姨太太')
counts = {}
for word in words:
    if len(word) == 1:
        continue
    elif word == '宝玉' or word == '宝二爷':
        rword = '贾宝玉'
    elif word == '凤姐' or word == '凤姐儿' or word == '凤丫头' or word == '凤哥儿' or word == '凤辣子':
        rword = '王熙凤'
    elif word == '老太太' or word == '老祖宗':
        rword = '贾母'
    elif word == '宝钗' or word == '宝姐姐' or word == '宝姑娘' or word== '宝丫头':
        rword = '薛宝钗'
    elif word == '黛玉' or word == '林妹妹' or word == '林姑娘':
        rword = '林黛玉'
    elif word == '二太太':
        rword = '王夫人'
    elif word == '琏二爷':
        rword = '贾琏'
    elif word == '平姐姐' or word == '平姑娘':
        rword = '平儿'
    elif word == '薛夫人' or word == '姨太太':
        rword = '薛姨妈'
    else:
        rword = word
    counts[rword] = counts.get(rword,0) + 1
for word in excludes:
    del(counts[word])
items = list(counts.items())
items.sort(key = lambda x:x[1],reverse=True)
for i in range(10):
    word,count = items[i]
    print("{0:<10}{1:>5}".format(word,count))

运行结果

 对比两次的运行结果可知,大多数人物出场次数发生了变化,甚至顺序也随之改变。


### 使用Python对《红楼梦》文本进行情感分析 #### 方法概述 为了对《红楼梦》这样的大型古典文学作品进行情感分析,可以采用自然语言处理技术和机器学习模型相结合的方式。具体来说,通过加载并预处理文本数据后,利用专门的情感分析库来进行情绪识别和分类。 #### 预处理阶段 在开始之前,确保已经准备好了《红楼梦》的纯文本版本,并且安装了必要的Python包,如`jieba`用于中文分词、`scikit-learn`或其他适合做特征提取和支持向量机(SVM)训练的库[^3]。 ```bash pip install jieba scikit-learn snownlp pandas numpy ``` 对于原始文本文件,先要读入内存: ```python with open('hongloumeng.txt', 'r', encoding='utf8') as f: text = f.read() ``` 接着执行基本的数据清理操作,比如去除标点符号和其他非汉字字符;再应用结巴(Jieba)分词器将连续字符串分割成有意义词语列表形式。 #### 应用SnownLP库进行简单情感评分 SnownLP是一个专门为汉语设计的情绪检测工具,在这里可以直接拿来计算每句话或者章节里正面/负面倾向的程度得分。 ```python from snownlp import SnowNLP def analyze_sentiment(text): s = SnowNLP(text) return { "positive_prob": round(s.sentiments, 4), # 正面概率值介于0~1之间 "summary": ("积极" if s.sentiments >= 0.5 else "消极") + "(%d%%)" % int(100 * abs(s.sentiments - 0.5)) } sample_text = "黛玉听了这话,心里又是一阵酸楚..." result = analyze_sentiment(sample_text) print(f'样本文字:“{sample_text}”\n情感极性: {result["summary"]}, 置信度={result["positive_prob"]}') ``` 这段代码会输出给定样本文档的情感倾向以及相应的置信水平。 #### 构建更复杂的模型 如果想要获得更加细致的结果,则可能需要构建自定义的情感分类器。这通常涉及到以下几个方面的工作: - 收集标注好的正负例句作为训练集; - 提取出有用的词汇特征(TF-IDF权重等); - 训练监督式算法(例如逻辑回归、随机森林或神经网络),并通过交叉验证调整超参数达到最佳性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四月天行健

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

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

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

打赏作者

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

抵扣说明:

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

余额充值