使用Python统计小说语言描写的字数

news2024/11/17 16:20:55

说明:最早出现这个需求,来自博主阅读《罪与罚》,书中陀思妥耶夫斯基有太多的语言描述,以至于我想知道这本书中到底出现了多少对白。文本介绍如果使用python程序统计一本书中的对话,角色名称,标点符号。

找到文件

首先,需要找到你要统计的小说文本文件,如下,分别是《罪与罚》、《白鹿原》两本书的文本文件。

在这里插入图片描述

设置统计清单

如果是统计语言描写是不需要的,但如果你需要统计小说中的角色名称,那就需要把角色名称的姓名都罗列出来,当然越多越准确,如下:

# 《白鹿原》中的角色名称
nameTwo = [
    "白灵",
    "皮匠",
    "鹿三",
    "黑娃",
    "兔娃",
    "郑芒",
    "方升"
]

nameThree = [
    "白嘉轩",
    "白秉德",
    "白赵氏",
    "吴仙草",
    "白孝文",
    "白孝武",
    "白孝义",
    "朱先生",
    "鹿泰恒",
    "鹿子霖",
    "鹿兆鹏",
    "鹿兆海",
    "冷先生",
    "鹿惠氏",
    "田小蛾",
    "郭举人",
    "白嘉道",
    "吴长贵",
    "岳维山",
    "胡县长",
    "田福贤",
    "白兴儿",
    "韩裁缝",
    "彭县长",
    "梁县长",
    "郝县长",
    "高玉凤",
    "鹿兆谦",
]

按照角色名称的长度来分。《罪与罚》中的姓名大多是XXX·XXX,反正是统计长度,拆开成两部分即可,如下:

# 《罪与罚》中的角色名称
nameTwo = [
    "罗佳",
    "卢任",
    "谢苗",
    "科赫",
    "伊万",
    "彼得",
    "莉达"
]

nameThree = [
    "罗季昂",
    "阿廖娜",
    "罗季卡",
    "帕申卡",
    "杜尼娅",
    "玛尔法",
    "米季卡",
    "尼古拉",
    "米科拉",
    "杜什金",
    "科利亚",
    "波莉娅",
    "波莲卡",
    "廖尼娅",
    "索尼娅",
    "索菲娅",
    "福米奇",
    "伊利亚",
    "瓦赫鲁",
]
nameFour = [
    "娜塔利娅",
    "莉扎薇塔",
    "扎哈雷奇",
    "杜涅奇卡",
    "卡捷琳娜",
    "阿玛莉娅",
    "阿尔卡季",
    "拉祖米欣",
    "索涅奇卡",
    "德米特里",
    "波列奇卡",
    "切巴罗夫",
    "克留科夫",
    "尼科季姆",
    "米科尔卡",
    "德米特里",
    "莉多奇卡",
    "扎苗托夫",
    "亚历山大",
    "阿凡纳西",
    "波尔菲里",
]
…………

编码

代码思想是:

统计对话,当遇到文本中的左引号时,表示这是语言描写,标记为对话开始;当遇到文本中的右引号时,表示这是对话结束。以此来统计语言描写。

统计文本中的角色姓名,通过角色名称的长度,分长度去遍历文本,如果符合该长度的字符串,在角色名称列表中,说明这是一个角色名称,则统计下来,存入到一个字典中,字典的键为角色名称,值为出现的数量。

统计文本的标点符号,则是通过判断该字符是否处于汉字区间即可,不包括0-9的数字,因为一般文学作品中的数字也会用大写汉字来表示,如一、二、三……,当然,也不绝对。

# 文件路径
path = r"C:\Users\10765\Desktop\books\zuiyufa.txt"

# 总字数统计
str = ""

# 临时字数统计
tempStr = []


nameTwo = [
    "罗佳",
    "卢任",
    "谢苗",
    "科赫",
    "伊万",
    "彼得",
    "莉达"
]

nameThree = [
    "罗季昂",
    "阿廖娜",
    "罗季卡",
    "帕申卡",
    "杜尼娅",
    "玛尔法",
    "米季卡",
    "尼古拉",
    "米科拉",
    "杜什金",
    "科利亚",
    "波莉娅",
    "波莲卡",
    "廖尼娅",
    "索尼娅",
    "索菲娅",
    "福米奇",
    "伊利亚",
    "瓦赫鲁",
]
nameFour = [
    "娜塔利娅",
    "莉扎薇塔",
    "扎哈雷奇",
    "杜涅奇卡",
    "卡捷琳娜",
    "阿玛莉娅",
    "阿尔卡季",
    "拉祖米欣",
    "索涅奇卡",
    "德米特里",
    "波列奇卡",
    "切巴罗夫",
    "克留科夫",
    "尼科季姆",
    "米科尔卡",
    "德米特里",
    "莉多奇卡",
    "扎苗托夫",
    "亚历山大",
    "阿凡纳西",
    "波尔菲里",
]
nameFive = [
    "罗曼诺维奇",
    "伊万诺芙娜",
    "叶戈罗芙娜",
    "娜斯塔西娅",
    "帕夫洛芙娜",
    "扎尔尼岑娜",
    "扎哈罗维奇",
    "彼特罗维奇",
    "谢苗诺芙娜",
    "费多罗芙娜",
    "普莉赫里娅",
    "阿芙多季娅",
    "罗曼诺芙娜",
    "伊万诺维奇",
    "彼特罗芙娜",
    "弗拉祖米欣",
    "赫鲁维莫夫",
    "杰缅季耶夫",
    "尼科拉什卡",
]
nameSix = [
    "普拉斯科维娅",
    "马尔梅拉多夫",
    "利佩韦赫泽尔",
    "普罗科菲伊奇",
    "托尔斯佳科夫",
    "米哈依洛维奇"
]

nameSeven = [
    "佩斯特里亚科夫",
    "拉斯科利尼科夫",
    "娜斯塔西尤什卡",
    "亚历山德罗芙娜",
    "拉斯科利尼科娃",
    "斯维德里盖洛娃",
    "斯维德里盖洛夫",
    "格里戈里耶维奇",
    "卡佩尔纳乌莫夫",
]

# 统计人物名字数目
dic = {}

# 统计人物名字数目
nameSum = 0

# 统计对话/想象字数
wordSum = 0

# 标记对话/想象开始标记
flag = False

# 输出文件名
print("《罪与罚》:")

# 读取文件
with open(path, "r", encoding="utf-8", errors="ignore") as f:  # 设置对象
    str = f.read()  # 读取文件内容

# 输出原著总字符数
print("原著总字符数:%d个" % (str.__len__()))

# 统计人物名字为两个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 2:
        s = "".join(tempStr)
        if s in nameTwo and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameTwo and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameTwo:
            del tempStr[0]

# 统计人物名字为三个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 3:
        s = "".join(tempStr)
        if s in nameThree and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameThree and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameThree:
            del tempStr[0]

# 统计人物名字为四个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 4:
        s = "".join(tempStr)
        if s in nameFour and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameFour and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameFour:
            del tempStr[0]

# 统计人物名字为五个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 5:
        s = "".join(tempStr)
        if s in nameFive and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameFive and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameFive:
            del tempStr[0]

# 统计人物名字为六个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 6:
        s = "".join(tempStr)
        if s in nameSix and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameSix and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameSix:
            del tempStr[0]

# 统计人物名字为七个字的数目
for i in str:
    tempStr.append(i)
    if tempStr.__len__() == 7:
        s = "".join(tempStr)
        if s in nameSeven and s not in dic:
            dic[s] = 1
            tempStr.clear()
        elif s in nameSeven and s in dic:
            dic[s] = dic[s] + 1
            tempStr.clear()
        elif s not in nameSeven:
            del tempStr[0]

# 统计人物名字数目总数
for i in dic:
    nameSum = nameSum + (i.__len__() * dic[i])

print("人物名字数目:%d个" % nameSum)

# 左引号数目
markLeft = 0

# 右引号数目
markRight = 0

# 统计对话/想象字数
for i in str:
    if i == "“":
        flag = True
        markLeft = markLeft + 1
    elif i == "”":
        flag = False
        wordSum = wordSum - 1
        markRight = markRight + 1
    if flag:
        wordSum = wordSum + 1

print("对话字数:%d个" % wordSum)

for i in str:
    if i < "\u4e00" or i > "\u9fa5":
        str = str.replace(i, "")

print("去掉标点符号:%d个" % str.__len__())

运行如下

《罪与罚》的统计如下:
在这里插入图片描述

《白鹿原》的统计如下(更换一下文件和角色名称列表即可):

在这里插入图片描述
可以看到,《罪与罚》中的对话达到了惊人的22万字,与之相比,总字数差不多的《白鹿原》只有12万不到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/933186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习模型数值稳定性——梯度衰减和梯度爆炸的说明

文章目录 0. 前言1. 为什么会出现梯度衰减和梯度爆炸&#xff1f;2. 如何提高数值稳定性&#xff1f;2.1 随机初始化模型参数2.2 梯度裁剪&#xff08;Gradient Clipping&#xff09;2.3 正则化2.4 Batch Normalization2.5 LSTM&#xff1f;Short Cut&#xff01; 0. 前言 按照…

读取SD卡图片bin文件显示LCD上

读取SD卡bin文件显示图片 Coding 环境搭建&#xff1a; 硬件平台&#xff1a;STM32H750XBH6开发环境&#xff1a;STM32CubeMX V6.8.1KEIL V5.28.0.0STM32H750固件版本&#xff1a;package V1.11.0仿真下载驱动&#xff1a;ST-Link 前言&#xff1a;STM32H750XBH6 的flash只…

零基础学习正演的数值模拟(含代码)

摘要: 本贴从零开始学习正演的数值模拟方法. 包括相应的偏微分基础、声波方程、雷克子波、均匀速度场的模拟、一般速度场的模拟. 1. 偏微分基础 本小节仅涉及高等数学相关知识, 与领域无关. 1.1 导数 引例: 物体从一维坐标的原点开始移动, 在 t t t 时刻, 它在坐标轴的位置…

汤普森采样(Thompson sampling): 理论支持

目录 一、UCB与TS算法数学原理1、Upper Confidence Bounds 数学原理2、Thompson sampling 数学原理a、TS 基本数据原理1. beta 分布2. 共轭分布与共轭先验3. 采样的编程实现 b、TS 算法流程1. TS算法基础版本2. Batched Thompson Sampling 二、UCB与TS算法的优缺点1、TS算法的优…

Ubuntu释放VMware虚拟磁盘未使用空间

By: Ailson Jack Date: 2023.08.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/152.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

基于Java+SpringBoot+Vue前后端分离医院后台管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Spring为什么要专门定义BeanDefinition ,有Class不行吗?

前言 创建一个Java Bean&#xff0c;大概是下面这个流程&#xff1a; 我们写的Java文件&#xff0c;会编译为Class文件&#xff0c;运行程序&#xff0c;类加载器会加载Class文件&#xff0c;放入JVM的方法区&#xff0c;我们就可以愉快的new对象了。 创建一个Spring Bean&am…

项目总结知识点记录(二)

1.拦截器实现验证用户是否登录&#xff1a; 拦截器类&#xff1a;实现HandlerInterception package com.yx.interceptor;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpS…

Mybatis+MybatisPlus拦截器实战之数据的加解密和脱敏

文章目录 一、前言二、拦截器简介三、代码目录结构简介四、核心代码讲解4.1 application.yml文件4.2 自定义注解4.2.1 SensitiveEntity4.2.2 SensitiveData4.2.3 MaskedEntity4.2.4 MaskedField4.2.5 MaskedMethod 4.3 Mybatis-Plus 拦截器数据自动加密4.4 Mybatis 打印完整sql…

7年经验之谈 —— 如何实现高效的Web自动化测试?

随着互联网的快速发展&#xff0c;Web应用程序的重要性也日益凸显。为了保证Web应用程序的质量和稳定性&#xff0c;Web自动化测试成为必不可少的一环。然而&#xff0c;如何实现高效的Web自动化测试却是一个值得探讨的课题。 首先&#xff0c;选择合适的测试工具是关键。市面…

低通滤波器和高通滤波器

应用于图像低通滤波器和高通滤波器的实现 需要用到傅里叶变换 #include <opencv2/opencv.hpp> #include <Eigen> #include <iostream> #include <vector> #include <cmath> #include <complex>#define M_PI 3.14159265358979323846…

五、多表查询-3.4连接查询-联合查询union

一、概述 二、演示 【例】将薪资低于5000的员工&#xff0c;和 年龄大于50岁的 员工全部查询出来 1、查询薪资低于5000的员工 2、查询年龄大于50岁的员工 3、将薪资低于5000的员工&#xff0c;和 年龄大于50岁的 员工全部查询出来&#xff08;把上面两部分的结果集直接合并起…

最新敏感信息和目录收集技术

敏感信息和目录收集 目标域名可能存在较多的敏感目录和文件&#xff0c;这些敏感信息很可能存在目录穿越漏洞、文件上传漏洞&#xff0c;攻击者能通过这些漏洞直接下载网站源码。搜集这些信息对之后的渗透环节有帮助。通常&#xff0c;扫描检测方法有手动搜寻和自动工具查找两…

requestAnimationFrame(RAF)

1、RAF介绍 requestAnimateFrame&#xff08;RAF&#xff09;动画帧&#xff0c;是一个做动画的API。 如果想要一个动画流畅&#xff0c;就需要以60帧/s来更新视图&#xff0c;那么一次视图的更新就是16.67ms。 想要达到上述目标&#xff0c;可以通过setTimeout定时器来手动控…

JSON文件教程之【jsoncpp源码编译】

目录 1 数据下载(jsoncpp源码)2 文件编译内容: JSON文件的读取与保存可以使用jsoncpp库来实现,这里介绍该库的下载及编译方法。 1 数据下载(jsoncpp源码) 数据下载:Github地址 图1 github源码示意图 2 文件编译 2.1 点击Download ZIP,下载源码。 图2 压缩包数据 2.2 将压…

在 macOS 中安装 TensorFlow 1g

tensorflow 需要多大空间 pip install tensorflow pip install tensorflow Looking in indexes: https://pypi.douban.com/simple/ Collecting tensorflowDownloading https://pypi.doubanio.com/packages/1a/c1/9c14df0625836af8ba6628585c6d3c3bf8f1e1101cafa2435eb28a7764…

2022年06月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;公共子序列 我们称序列Z < z1, z2, …, zk >是序列X < x1, x2, …, xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, …, ik >&#xff0c;使得对j 1, 2, … ,k, 有xij zj。比如Z < a, b, f, c > 是X < a, b, c, f, b, …

软考:中级软件设计师:关系代数:中级软件设计师:关系代数,规范化理论函数依赖,它的价值和用途,键,范式,模式分解

软考&#xff1a;中级软件设计师:关系代数 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &…

一篇文章带你彻底了解Java常用的设计模式

文章目录 前言1. 工厂模式使用示例代码优势 2. 单例模式说明使用示例代码优势 3. 原型模式使用示例代码优势 4. 适配器模式使用示例代码优势 5. 观察者模式使用示例代码优势 6. 策略模式使用示例代码优势 7. 装饰者模式使用示例代码优势 8. 模板方法模式使用示例代码优势 总结 …

python-数据可视化-下载数据-CSV文件格式

数据以两种常见格式存储&#xff1a;CSV和JSON CSV文件格式 comma-separated values import csv filename sitka_weather_07-2018_simple.csv with open(filename) as f:reader csv.reader(f)header_row next(reader)print(header_row) # [USW00025333, SITKA AIRPORT, A…