一·案例 - 红楼梦

1首先准备语料库

http://www.dxsxs.com

这个网址去下载

2 任务一:拆分提取

import os
import redef split_hongloumeng():# ========== 1. 配置路径(关键:根据实际文件位置修改) ==========# 脚本所在文件夹(自动获取,不用改)script_dir = os.path.dirname(os.path.abspath(__file__))# 红楼梦原文路径(和脚本同文件夹就不用改,否则写完整路径,如 D:/xxx/红楼梦.txt)input_path = os.path.join(script_dir, "红楼梦.txt")# 切割后保存的文件夹(自动在脚本目录创建“分卷”文件夹)output_dir = os.path.join(script_dir, "分卷")os.makedirs(output_dir, exist_ok=True)  # 确保输出文件夹存在# ========== 2. 正则规则(精准匹配要过滤/切割的内容) ==========# 过滤开头无关信息(手机电子书...本章字数:xxx)header_pattern = re.compile(r'手机电子书·大学生小说网.*?本章字数:\d+', re.DOTALL)# 匹配回目(第一回、第二回...),优先匹配“第X回”,适配不同写法chapter_pattern = re.compile(r'第([一二三四五六七八九十百千万]+回|[\d]+回)', re.UNICODE)# 过滤结尾无关内容(且听下回分解及之后空行)end_pattern = re.compile(r'且听下回分解.*?$', re.DOTALL)with open(input_path, 'r', encoding='utf-8') as f:# 读取全文 → 过滤开头无关内容 → 按行处理content = f.read()# 先砍头:去掉开头无关信息content = header_pattern.sub('', content).strip()# 按换行拆分,方便逐行处理lines = content.split('\n')current_chapter = None  # 当前回目名称(如“第一回”)current_lines = []      # 当前回的内容chapter_order = []      # 记录回目顺序,保证输出按1、2、3回排序# ========== 3. 逐行处理原文 ==========for line in lines:line = line.strip()  # 去掉每行首尾空格、换行符if not line:         # 空行直接跳过continue# 匹配回目(如“第一回”“第2回”,兼容中文数字和阿拉伯数字)chapter_match = chapter_pattern.search(line)if chapter_match:# ---- 遇到新回目,先保存上一回内容 ----if current_chapter:# 去结尾无关内容(且听下回分解...)clean_content = end_pattern.sub('', '\n'.join(current_lines)).strip()# 保存文件(用回目编号排序,如“001_第一回.txt”)output_path = os.path.join(output_dir,f"{str(len(chapter_order)+1).zfill(3)}_{current_chapter}.txt")with open(output_path, 'w', encoding='utf-8') as f_out:f_out.write(clean_content)chapter_order.append(current_chapter)  # 记录顺序# ---- 开始处理新回目 ----current_chapter = chapter_match.group(0)  # 提取回目名称(如“第一回”)current_lines = [current_chapter]  # 回目名称作为第一行else:# 非回目行,加入当前回内容(已过滤空行,直接存)current_lines.append(line)# ========== 4. 处理最后一回(循环外收尾) ==========if current_chapter:clean_content = end_pattern.sub('', '\n'.join(current_lines)).strip()output_path = os.path.join(output_dir,f"{str(len(chapter_order)+1).zfill(3)}_{current_chapter}.txt")with open(output_path, 'w', encoding='utf-8') as f_out:f_out.write(clean_content)# ========== 5. 完成提示 ==========print(f"✅ 切割完成!共 {len(chapter_order) + (1 if current_chapter else 0)} 回")print(f"📁 保存位置:{output_dir}")print("🔍 文件名按【001_第一回、002_第二回...】排序,可直接用")if __name__ == "__main__":split_hongloumeng()

任务二·把分好后的卷,转移成IF-IDF能识别的卷

#
import pandas as pd  # 数据预处理库
import os  # 用于文件和目录操作
import jieba  # 用于中文分词# 获取当前脚本所在的目录路径
current_dir = os.path.dirname(os.path.abspath(__file__))# 初始化列表,用于存储文件路径和文件内容
filePaths = []  # 保存文件路径
fileContents = []  # 保存文件路径对应的内容# 遍历文件夹,获取文件路径和内容
# 使用绝对路径拼接,确保能正确找到分卷文件夹
fenjuan_dir = os.path.join(current_dir, "分卷")
for root, dirs, files in os.walk(fenjuan_dir):  # 遍历文件夹及其子文件夹for name in files:filePath = os.path.join(root, name)  # 拼接得到文件完整路径filePaths.append(filePath)  # 将文件路径添加到列表# 读取文件内容并添加到列表with open(filePath, 'r', encoding='utf-8') as f:fileContent = f.read()fileContents.append(fileContent)# 将文件路径和内容转换为DataFrame
corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents
})# 导入红楼梦专属词库,提升分词准确性
# 红楼梦词库与脚本在同一目录下
user_dict_path = os.path.join(current_dir, "红楼梦词库.txt")
jieba.load_userdict(user_dict_path)# 读取停用词库,用于过滤无关词汇
# 修正路径,假设StopwordsCN.txt在当前脚本所在的红楼梦目录下
stopwords_path = os.path.join(current_dir, "StopwordsCN.txt")
stopwords = pd.read_csv(stopwords_path, encoding='utf8', engine='python', index_col=False)# 创建新文件,用于保存分词后结果
output_file = os.path.join(current_dir, "wj.txt")
file_to_jieba = open(output_file, 'w', encoding='utf-8')# 遍历DataFrame,对每个文件内容进行分词和停用词过滤
for index, row in corpos.iterrows():  # 按行遍历DataFramejuan_ci = ''  # 用于存储当前文件分词后的结果fileContent = row['fileContent']  # 获取当前文件内容segs = jieba.cut(fileContent)  # 进行分词for seg in segs:# 过滤停用词和空字符串if seg not in stopwords.stopword.values and len(seg.strip()) > 0:juan_ci += seg + ' '  # 拼接分词结果file_to_jieba.write(juan_ci + '\n')  # 将结果写入文件# 关闭文件
file_to_jieba.close()

1. 导入所需库

python

运行

import pandas as pd  # 数据预处理库
import os  # 用于文件和目录操作
import jieba  # 用于中文分词

  • 导入pandas库,用于数据的结构化处理(如创建 DataFrame)
  • 导入os库,用于处理文件路径和目录遍历
  • 导入jieba库,用于中文文本的分词处理

2. 获取当前脚本所在目录

python

运行

current_dir = os.path.dirname(os.path.abspath(__file__))

  • os.path.abspath(__file__)获取当前脚本的绝对路径
  • os.path.dirname()提取该路径中的目录部分
  • 目的是获取可靠的基准路径,避免相对路径带来的问题

3. 初始化存储数据的列表

python

运行

filePaths = []  # 保存文件路径
fileContents = []  # 保存文件路径对应的内容

  • 创建两个空列表,分别用于存储后续读取的文件路径和文件内容

4. 遍历文件夹并读取文件内容

python

运行

fenjuan_dir = os.path.join(current_dir, "分卷")
for root, dirs, files in os.walk(fenjuan_dir):for name in files:filePath = os.path.join(root, name)filePaths.append(filePath)with open(filePath, 'r', encoding='utf-8') as f:fileContent = f.read()fileContents.append(fileContent)

  • 拼接得到 "分卷" 文件夹的完整路径
  • 使用os.walk()遍历 "分卷" 文件夹下的所有文件
  • 对每个文件,拼接完整路径并添加到filePaths列表
  • 以 UTF-8 编码打开文件,读取内容并添加到fileContents列表

5. 创建数据框存储文件信息

python

运行

corpos = pd.DataFrame({'filePath': filePaths,'fileContent': fileContents
})
  • 使用pandas.DataFrame()创建数据框
  • 将文件路径和内容分别作为两列存储,便于后续按行处理

6. 加载自定义词库

python

运行

user_dict_path = os.path.join(current_dir, "红楼梦词库.txt")
jieba.load_userdict(user_dict_path)
  • 拼接得到红楼梦专属词库的路径
  • 加载自定义词库,让 jieba 分词更符合《红楼梦》的语言特点

7. 读取停用词库

python

运行

stopwords_path = os.path.join(current_dir, "StopwordsCN.txt")
stopwords = pd.read_csv(stopwords_path, encoding='utf8', engine='python', index_col=False)
  • 拼接得到停用词文件的路径
  • 读取中文停用词表,用于后续过滤无意义词汇(如 "的"、"了" 等)

8. 准备输出文件

python

运行

output_file = os.path.join(current_dir, "wj.txt")
file_to_jieba = open(output_file, 'w', encoding='utf-8')
  • 定义分词结果的输出文件路径
  • 以写入模式打开文件,准备存储处理后的结果

9. 分词处理并过滤停用词

python

运行

for index, row in corpos.iterrows():juan_ci = ''fileContent = row['fileContent']segs = jieba.cut(fileContent)for seg in segs:if seg not in stopwords.stopword.values and len(seg.strip()) > 0:juan_ci += seg + ' 'file_to_jieba.write(juan_ci + '\n')

  • 遍历数据框中的每一行(每个文件内容)
  • 对文件内容进行分词处理
  • 过滤掉停用词和空字符串
  • 将处理后的分词结果拼接成字符串
  • 写入到输出文件中

10. 关闭文件

python

运行

file_to_jieba.close()

  • 完成写入后关闭文件,释放系统资源

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LaTeX(排版系统)Texlive(环境)Vscode(编辑器)环境配置与安装

LaTeX、Texlive 和 Vscode 三者之间的关系,可以把它们理解成语言、工具链和编辑器的配合关系。 1.下载Texlive 华为镜像网站下载 小编这边下载的是texlive2025.iso最新版的,下载什么版本看自己需求,只要下载后缀未.iso的即可。为避免错误&am…

【深入浅出STM32(1)】 GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解

GPIO 深度解析:引脚特性、工作模式、速度选型及上下拉电阻详解一、GPIO概述二、GPIO的工作模式1、简述(1)4种输入模式(2)4种输出模式(3)4种最大输出速度2、引脚速度(1)输…

第1节 大模型分布式推理基础与技术体系

前言:为什么分布式推理是大模型时代的核心能力? 当我们谈论大模型时,往往首先想到的是训练阶段的千亿参数、千卡集群和数月的训练周期。但对于商业落地而言,推理阶段的技术挑战可能比训练更复杂。 2025年,某头部AI公司推出的130B参数模型在单机推理时面临两个选择:要么…

《软件工程导论》实验报告一 软件工程文档

目 录 一、实验目的 二、实验环境 三、实验内容与步骤 四、实验心得 一、实验目的 1. 理解软件工程的基本概念,熟悉软件,软件生命周期,软件生存周期过程和软件生命周期各阶段的定义和内容。 2. 了解软件工程文档的类别、内容及撰写软件工…

基于elk实现分布式日志

1.基本介绍 1.1 什么是分布式日志 在分布式应用中,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。所以我们使用集中化的日志管理,分布式日志…

多模态RAG赛题实战之策略优化--Datawhale AI夏令营

科大讯飞AI大赛(多模态RAG方向) - Datawhale 项目流程图 1、升级数据解析方案:从 fitz 到 MinerU PyMuPDF(fitz)是基于规则的方式提取pdf里面的数据;MinerU是基于深度学习模型通过把PDF内的页面看成是图片…

09--解密栈与队列:数据结构核心原理

1. 栈 1.1. 栈的简介 栈 是一种 特殊的线性表,具有数据 先进后出 特点。 注意: stack本身 不支持迭代器操作 主要原因是因为stack不支持数据的随机访问,必须保证数据先进后出的特点。stack在CPP库中实现为一种 容器适配器 所谓容器适配器&a…

打造专属 React 脚手架:从 0 到 1 开发 CLI 工具

前言: 在前端开发中,重复搭建项目环境是个低效的事儿。要是团队技术栈固定(比如 React AntD Zustand TS ),每次从零开始配路由、状态管理、UI 组件,既耗时又容易出错。这时候,自定义 CLI 脚手架 就派上…

Python day43

浙大疏锦行 Python day43 import torch import numpy as np import pandas as pd import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torch.utils.data import Da…

python基于Hadoop的超市数据分析系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具:Navicat/SQLyog等都可以 摘要&…

如何用 COLMAP 制作 Blender 格式的数据集

如何用 COLMAP 制作 Blender 格式的数据集并划分出 transforms_train.json、transforms_val.json 和 transforms_test.json。 一、什么是 Blender 格式数据集? Blender 格式数据集是 Nerf 和 Nerfstudio 常用的输入格式,其核心是包含了相机内外参的 JSON 文件,一般命名为:…

[GESP202309 六级] 2023年9月GESP C++六级上机题题解,附带讲解视频!

本文为GESP 2023年9月 六级的上机题目详细题解和讲解视频,觉得有帮助或者写的不错可以点个赞。 题目一讲解视频 GESP2023年9月六级上机题一题目二讲解视频 题目一:小羊买饮料 B3873 [GESP202309 六级] 小杨买饮料 - 洛谷 题目大意: 现在超市一共有n种饮料&#…

linux 操作ppt

目录 方法1:用 libreoffice 打开PPT文件 播放脚本: 方法2:用 python-pptx 创建和编辑PPT 方法3:其他方法 在Linux中,可以使用Python通过python-pptx库来创建和编辑PPT文件,但直接播放PPT文件需要借助其…

元数据管理与数据治理平台:Apache Atlas 基本搜索 Basic Search

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 Apache Atlas 框架是一套可扩展的核心基础治理服务,使企业能够有效、高效地满足 Hadoop 中的合规性要求,并支持与整个…

LangChain4J-(1)-Hello World

一、LangChain4J是什么? LangChain4J 是一个专为 Java 生态系统设计的开源框架,用于简化与大语言模型(LLM,如 OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude 等)的集成和交互。它借鉴了 Python 生态中 L…

HTTPS应用层协议-中间攻击人

HTTPS应用层协议-中间攻击人 • Man-in-the-MiddleAttack,简称“MITM 攻击” 确实,在方案 2/3/4 中,客户端获取到公钥 S 之后,对客户端形成的对称秘钥 X 用服务端给客户端的公钥 S 进行加密,中间人即使窃取到了数据&am…

利用 Makefile 高效启动 VIVADO 软件:深入解析与实践

利用 Makefile 高效启动 VIVADO 软件:深入解析与实践 系列文章目录 1、VMware Workstation Pro安装指南:详细步骤与配置选项说明 2、VMware 下 Ubuntu 操作系统下载与安装指南 3.基于 Ubuntu 的 Linux 系统中 Vivado 2020.1 下载安装教程 文章目录利用 …

[前端算法]排序算法

默认情况下,sort() 会将元素转换为字符串,然后按照 Unicode 编码的顺序进行排序: const fruits [apple, banana, cherry, date]; fruits.sort(); console.log(fruits); // 输出: ["apple", "banana", "cherry"…

C#标签批量打印程序开发

C#标签批量打印程序开发(集成Bartender解决方案)一、系统架构设计 1. 核心模块划分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 数据加载器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作机制和数学基础

ECC的原理、背景、工作机制和数学基础摘要:本文首先详细介绍ECC(Error-Correcting Code,纠错码)的原理,包括背景、工作机制和数学基础。然后,解释ECC在SRAM(Static Random-Access Memory&#x…