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

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

找到文件

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

在这里插入图片描述

设置统计清单

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

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

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

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

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

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

编码

代码思想是:

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

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

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

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

# 总字数统计
sumStr = ""

# 临时字数统计
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:
    sumStr = f.read()

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

# 统计人物名字为两个字的数目
for i in sumStr:
    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 sumStr:
    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 sumStr:
    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 sumStr:
    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 sumStr:
    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 sumStr:
    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 sumStr:
    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 sumStr:
    if i < "\u4e00" or i > "\u9fa5":
        sumStr = sumStr.replace(i, "")

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

运行如下

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Go 语言第一课》课程学习笔记(十一)

控制结构 if 的“快乐路径”原则 针对程序的分支结构&#xff0c;Go 提供了 if 和 switch-case 两种语句形式&#xff1b;而针对循环结构&#xff0c;Go 只保留了 for 这一种循环语句形式。 if 语句 if 语句是 Go 语言中提供的一种分支控制结构&#xff0c;它也是 Go 中最常…

华为手机实用功能介绍

一、内置app介绍 分四块介绍&#xff0c;包括出门款、规划款、工作款和生活款。 出门款&#xff1a;红色框框部分&#xff0c;照镜子化妆/看天气 规划款&#xff1a;黄色框框部分&#xff0c;日程表/计划表/番茄时间/计时 工作款&#xff1a;蓝色框框部分&#xff0c;便笺/录…

六、Json 数据的交互处理

文章目录 一、JSON 数据的交互处理1、为什么要使用 JSON2、JSON 和 JavaScript 之间的关系3、前端操作 JSON3.1 JavaScript 对象与 JSON 字符串之间的相互转换 4、JAVA 操作 JSON4.1 Json 的解析工具&#xff08;Gson、FastJson、Jackson&#xff09;4.2 ResponseBody 注解、Re…

2. HBase中文学习手册之如何运行一个单机版的HBase?

HBase中文学习手册之如何运行一个单机版的HBase? 1.1 介绍1.2 快速开始1.2.1 安装 Open JDK 81.2.2 启动 HBase1.2.3 Shell 练习1.2.4 运行停止脚本来停止HBase 1.1 介绍 上篇博文HBase中文学习手册之揭开Hbase的神秘面纱分享了 HBase 的一些理论基础知识的介绍。 本文将会继…

Spring boot(一)

Spring Boot是一个构建在Spring框架顶部的项目。它提供了一种简便&#xff0c;快捷的方式来设置&#xff0c;配置和运行基于Web的简单应用程序。 它是一个Spring模块&#xff0c;提供了 RAD(快速应用程序开发)功能。它用于创建独立的基于Spring的应用程序&#xff0c;因为它需…

mysql 字符集、比较规则, 比较规则底层逻辑

字符集的级别 show variables like ‘%charecter%’&#xff1b; character_set_server 服务器级别 一般在 5.7&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.7\my.ini 8.0&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.7\my.ini Linux 系列 vim /etc/my.cnf chara…

深入探讨C存储类和存储期——Storage Duration

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

MySQL—MySQL的NULL值是怎么存放的

一、引言 1、MySQL数据存放在哪个文件&#xff1f; 创建一个数据库会产生三种格式的文件&#xff0c;分别是.opt格式、.frm格式、.ibd格式。 opt格式&#xff1a;用来存储当前数据库的默认字符集和字符校验规则。 frm格式&#xff1a;该文件是用来保存每个表的元数据信息的&…

0基础入门C++之类和对象下篇

目录 1.再谈构造函数1.1构造函数赋值1.2初始化列表1.3explicit关键字 2.static成员2.1概念2.1静态成员变量2.2静态成员函数2.3特性 3.匿名对象4.友元函数4.1友元函数4.2友元类 5.内部类6.再次理解类和对象 1.再谈构造函数 首先我们先来回忆一下构造函数&#xff1a; 构造函数是…

【Java 高阶】一文精通 Spring MVC - 数据验证(七)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

用AI + Milvus Cloud搭建着装搭配推荐系统

在上一篇文章中,我们学习了如何利用人工智能技术(例如开源 AI 向量数据库 Milvus Cloud 和 Hugging Face 模型)寻找与自己穿搭风格相似的明星。在这篇文章中,我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改,获得更详细和准确的结果,文末附赠彩蛋。 注:试用此…

【头歌】构建哈夫曼树及编码

构建哈夫曼树及编码 第1关:构建哈夫曼树 任务描述 本关任务:构建哈夫曼树,从键盘读入字符个数n及这n个字符出现的频率即权值,构造带权路径最短的最优二叉树(哈夫曼树)。 相关知识 哈夫曼树的定义 设二叉树具有n个带权值的叶子结点{w1,w2,...,wn},从根结点到每个叶…

《Zookeeper》源码分析(二十三)之 客户端的命令处理过程

目录 客户端的命令处理过程1. ZooKeeper.create()2. ClientCnxn.submitRequest()3. SendThread.run()4. ClientCnxnSocket.doTransport()5. SendThread.readResponse() 客户端的命令处理过程 以创建节点命令为例&#xff0c;整个过程流程如下&#xff1a; CliCommand命令在抽…

uniapp国际化npm install vue-i18n报错

npm install vue-i18n //npmyarn add vue-i18n //yarn在vue2环境下&#xff0c;默认安装 npm install vue-i18n 的版本是 vue-i18n9.1.9&#xff0c;所以报错。 npm view vue-i18n versions --json 用以上命令查看版本&#xff1a; vue2建议5.0版本 npm install vue-i1…

Wireshark数据抓包分析之ARP协议

一、实验目的&#xff1a; 通过wireshark的数据抓包了解这个ARP协议的具体内容 二、预备知识: 1.Address Resolution Protocol协议&#xff0c;就是通过目标IP的值&#xff0c;获取到目标的mac地址的一个协议 2.ARP协议的详细工作过程&#xff0c;下面描述得非常清晰&#xff…

VScode使用SSH连接linux

1、官网下载和安装软件 https://code.visualstudio.com/Download 2、安装插件 单击左侧扩展选项&#xff0c;搜索插件安装 总共需要安装的插件如下所示 3、配置连接服务器的账号 安装完后会在左侧生成了远程连接的图标&#xff0c;单击此图标&#xff0c;然后选择设置图标…

[LitCTF 2023]Flag点击就送!

进入环境后是一个输入框&#xff0c;可以提交名字 然后就可以点击获取flag&#xff0c;结果回显提示&#xff0c;需要获取管理员 可以尝试将名字改为admin 触发报错&#xff0c;说明可能存在其他的验证是否为管理员的方式 通过抓包后&#xff0c;在cookie字段发现了 特殊的东西…

数据隐私与安全在大数据时代的挑战与应对

文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&…

spring框架:简介+依赖注入

目录 一、spring简介 二、创建项目 三、spring创建对象 四、SpringBean管理 1.注入实现-XML 2.注入实现-注解 一、spring简介 spring诞生与2003年&#xff0c;是一个轻量级的、IOC( Inversion Of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)的jav…

【rust/egui】(六)看看template的app.rs:TextEdit

说在前面 rust新手&#xff0c;egui没啥找到啥教程&#xff0c;这里自己记录下学习过程环境&#xff1a;windows11 22H2rust版本&#xff1a;rustc 1.71.1egui版本&#xff1a;0.22.0eframe版本&#xff1a;0.22.0上一篇&#xff1a;这里 TextEdit 文本编辑框 其定义为&#…