当前位置: 首页 > news >正文

从零实现诗词GPT大模型:数据集介绍和预处理

专栏规划: https://qibin.blog.csdn.net/article/details/137728228

本章将介绍该系列文章中使用的数据集,并且编写预处理代码,处理成咱们需要的格式。

一、数据集介绍

咱们使用的数据集名称是chinese-poetry,是一个在github上开源的中文诗词数据集,根据仓库中readme.md中的介绍,该数据集是最全的中华古典文集数据库,包含 5.5 万首唐诗、26 万首宋诗、2.1 万首宋词和其他古典文集。诗人包括唐宋两朝近 1.4 万古诗人,和两宋时期 1.5 千古词人。
数据集的下载地址:https://github.com/chinese-poetry/chinese-poetry?tab=readme-ov-file,大家可以点击Code按钮,选择Download ZIP将该数据集下载到本地,如下图:
下载数据集
当然,作者收集数据也不易,大家可以顺手点一下star鼓励一下作者,如图:
start
如果你按照上面的步骤,把数据集下载到你本地了,解压后你可以看到如下图所示的目录结构
数据集

作者按照不同诗词类型进行了分类,并且在每个分类下提供了1个到多个的json文件,json文件里按照结构化数据组织了每一个诗词的信息,如下图
诗词结构

二、数据集预处理

上面咱们详细介绍了chinese-poetry数据集的下载方式和作者组织的结构,下面我们将提取每个诗词的标题和内容作为我们需要的部分,并聚合到一个文件中,以方便我们后续训练模型使用。
首先,我们需要把作者提供的诗词类目整理到一个数组中,方便我们后续进行目录的变量

classes = ['五代诗词', '元曲', '全唐诗', '四书五经', '宋词', '幽梦影', '御定全唐詩', '曹操诗集', '楚辞', '水墨唐诗','纳兰性德', '蒙学', '论语', '诗经']

然后,我们可以遍历该数组,拼接一个目录,遍历目录中中的文件,再进行文件处理

for cls in classes:dir = base_dir + clsfiles = os.listdir(dir)for f in files:f = f'{dir}/{f}'if os.path.isdir(f):if 'error' in f:continuefor ff in os.listdir(f):process_json(f'{f}/{ff}')else:process_json(f)

上面代码中,我们遍历每个类别的目录后,会列出该类别中所有的文件,文件如果是一个目录,则继续遍历这个目录,因为作者提供的目录结构会存在二级目录的情况。
最后,拿到每个json文件后,会调用process_json()函数处理对应的json文件。下面我们开始介绍process_json()函数。

process_json()函数会对上面代码中拿到的每个json文件进行处理,并且从json文件中提取我们需要的信息(诗词的标题和内容),重新组织结构,写入到一个新文件中;该函数还会根据一个简单的策略划分出训练集测试集(训练集用来训练我们的模型,测试集用来在训练过程中测试模型的性能)。整体代码如下

def process_json(file):if not file.endswith('.json'):returnwith open(file, 'r') as f:json_content = f.read()array = json.loads(json_content)if type(array) != list:returnif len(array) > 100:train_array = array[:-1]test_array = array[-1:]else:train_array = arraytest_array = Nonefor item in train_array:if 'title' not in item.keys() or 'paragraphs' not in item.keys():continuewrite_file(item, dst_train_file)if test_array is not None:for item in test_array:if 'title' not in item.keys() or 'paragraphs' not in item.keys():continuewrite_file(item, dst_test_file)

在代码中,首先会打开该json文件,并读取json文件中的内容;读到内容后,通过json.loads()函数将它解码成在python中可以识别的数据结构。
接下来,我们根据该分类下诗词的数据决定是否要划分出测试集,策略很简单,如果个数大于100,我们就把最后一个作为测试集的一部分,当然这个策略可以根据你的需求进行调整。
最后,我们从json中拿到titleparagraphs属性通过一个write_file()函数写到我们的新文件中。

write_file()函数的实现也很简单,作用就是拿到titleparagraphs,组织好结构写入到一个新文件中;我们预处理后的文件不会像原数据集那样提供多个文件,而是全部写到同一个文件中,所以,此时就得考虑一个问题:所有的诗词在一个文件中,怎么标识出一首诗结束了呢?办法很简单,我们在没首诗结束的时候添加一个<|endoftext|>特殊标识,该标识很重要,因为在后面我们训练模型的时候,该标识也会根据此标识学习一首诗到哪结束了(不需要结束,咱们模型就无止境的输出了)。

def write_file(item, dst_file):global error_counttitle = item['title']paragraphs = item['paragraphs']content = f'\n{title}'for p in paragraphs:content = f'{content}\n{p}'content = converter.convert(content)if '𫗋' in content:print(f'{content}----')error_count += 1returncontent = content + '<|endoftext|>'dst_file.write(content)

上面代码中,处理前面我们介绍的部分,存在两个特殊的地方

...
content = converter.convert(content)
...
if '𫗋' in content

第一个的作用是将繁体中文转换成简体字,因为原数据集中存在大量的繁体字,显然,我们不想让咱们的模型生成的诗词是繁体字形式,所以这里我选择将繁体字转换成简体字,这里借助了一个python的转换库opencc实现,大家可以通过pip3 install opencc-python-reimplemented进行安装,该库的使用方法如下

import opencc
# 繁转简
converter = opencc.OpenCC('t2s')
content = converter.convert(content)

第二个特殊的地方就是我们代码中有一个𫗋,这是因为,通过上述代码转换成简体字的时候会有一些字转换错误,所以我们这里直接将存在转换错误情况的诗过滤掉,当然,这种情况不会很多,大概几十首诗词,对于咱们几十万首诗词的数据集来说都是毛毛雨。

好了,上面就是咱们数据预处理的全部过程,最终你会得到一个如下结构的train.txttest.txt分别代表咱们前面提到过的训练集测试集
预处理后的数据集
最后,我把全部代码整理出来,方便大家可以复制到本地直接运行

import os, json
import openccbase_dir = 'chinese-poetry-master/'
classes = ['五代诗词', '元曲', '全唐诗', '四书五经', '宋词', '幽梦影', '御定全唐詩', '曹操诗集', '楚辞', '水墨唐诗','纳兰性德', '蒙学', '论语', '诗经']dst_train_file = open('./train.txt', 'w')
dst_test_file = open('./test.txt', 'w')converter = opencc.OpenCC('t2s')
error_count = 0def write_file(item, dst_file):global error_counttitle = item['title']paragraphs = item['paragraphs']content = f'\n{title}'for p in paragraphs:content = f'{content}\n{p}'content = converter.convert(content)if '𫗋' in content:print(f'{content}----')error_count += 1returncontent = content + '<|endoftext|>'dst_file.write(content)def process_json(file):if not file.endswith('.json'):returnwith open(file, 'r') as f:json_content = f.read()array = json.loads(json_content)if type(array) != list:returnif len(array) > 100:train_array = array[:-1]test_array = array[-1:]else:train_array = arraytest_array = Nonefor item in train_array:if 'title' not in item.keys() or 'paragraphs' not in item.keys():continuewrite_file(item, dst_train_file)if test_array is not None:for item in test_array:if 'title' not in item.keys() or 'paragraphs' not in item.keys():continuewrite_file(item, dst_test_file)for cls in classes:dir = base_dir + clsfiles = os.listdir(dir)for f in files:f = f'{dir}/{f}'if os.path.isdir(f):if 'error' in f:continuefor ff in os.listdir(f):process_json(f'{f}/{ff}')else:process_json(f)dst_train_file.close()
dst_test_file.close()dst_train_file = open('./train.txt', 'r')
dst_test_file = open('./test.txt', 'r')train_count = 0
test_count = 0for line in dst_train_file:if '<|endoftext|>' in line:train_count += 1for line in dst_test_file:if '<|endoftext|>' in line:test_count += 1print(f'train_count: {train_count}, test_count: {test_count}, error_count: {error_count}')

下一篇,我们将对pytorch框架做一个简单的入门介绍

相关文章:

从零实现诗词GPT大模型:数据集介绍和预处理

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 本章将介绍该系列文章中使用的数据集&#xff0c;并且编写预处理代码&#xff0c;处理成咱们需要的格式。 一、数据集介绍 咱们使用的数据集名称是chinese-poetry&#xff0c;是一个在github上开源的中文诗…...

45.HarmonyOS鸿蒙系统 App(ArkUI)创建列表(List)

列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、音乐列…...

推荐算法之协同过滤

算法原理 透过百科&#xff0c;我们了解到协同过滤推荐&#xff08;Collaborative Filtering recommendation&#xff09;是在信息过滤和信息系统中正迅速成为一项很受欢迎的技术。与传统的基于内容过滤直接分析内容进行推荐不同&#xff0c;协同过滤算法结合用户行为分析用户…...

Kotlin 面试题

lifecycleScope.launchWhenResumed launchWhenResumed是一个扩展函数,它是LifecycleCoroutineScope的一部分,并且它是在Android的Lifecycle库中引入的。 这个函数的主要目的是在Lifecycle的对应组件(通常是Activity或Fragment)处于“resumed”状态时启动协程。 public fun …...

TCM(Tightly Coupled Memory)紧密耦合存储器简介

在ARM Cortex处理器中&#xff0c;TCM通常指的是紧密耦合存储器&#xff08;Tightly Coupled Memory&#xff09;。TCM是一种位于处理器核心旁边的高速存储器&#xff0c;它的设计目的是为了提供低延迟和高带宽的内存访问性能。 TCM的特点是它与处理器内核紧密耦合&#xff0c;…...

《自动机理论、语言和计算导论》阅读笔记:p172-p224

《自动机理论、语言和计算导论》学习第 8 天&#xff0c;p172-p224总结&#xff0c;总计 53 页。 一、技术总结 1.Context-Free Grammar(CFG) 2.parse tree (1)定义 p183&#xff0c;But perhaps more importantly, the tree, known as a “parse tree”, when used in a …...

typescript playwright 笔记

录制调式 命令 npx playwright codegen url npx playwright codegen https://www.baidu.com/typescript 中 format 和 split 的使用 import * as util from util;const str1 hellow %s; const format util.format; const str2 format(str1, word);// 提取taskId const str3…...

从零实现诗词GPT大模型:了解Transformer架构

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 这篇文档我们开始对GPT的核心组件Transformer进行一个详细的讲解, 加急编写中…...

温故知新之-TCP Keepalive机制及长短连接

[学习记录] 前言 TCP连接一旦建立&#xff0c;只要连接双方不主动 close &#xff0c;连接就会一直保持。但建立连接的双方并不是一直都存在数据交互&#xff0c;所以在实际使用中会存在两种情况&#xff1a;一种是每次使用完&#xff0c;主动close&#xff0c;即短连接&…...

架构师系列-搜索引擎ElasticSearch(七)- 集群管理之分片

集群健康检查 Elasticsearch 的集群监控信息中包含了许多的统计数据&#xff0c;其中最为重要的一项就是集群健康&#xff0c;它在 status字段中展示为 green&#xff08;所有主分片和副本分片都正常&#xff09;、yellow&#xff08;所有数据可用&#xff0c;有些副本分片尚未…...

基于Spring Boot实现的图书个性化推荐系统

基于Spring Boot实现的图书个性化推荐系统 开发语言&#xff1a;Java语言 数据库&#xff1a;MySQL工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统实现 前台首页功能模块 学生注册 登录 图书信息 个人信息 管理员功能模块 学生管理界面图 图书分类管理界面图 图书信息管…...

安全加速SCDN带的态势感知能为网站安全带来哪些帮助

随着安全加速SCDN被越来越多的用户使用&#xff0c;很多用户都不知道安全加速SCDN的态势感知是用于做什么的&#xff0c;德迅云安全今天就带大家来了解下什么是态势感知&#xff0c;态势感知顾名思义就是对未发生的事件进行预知&#xff0c;并提前进行防范措施的布置&#xff0…...

java面向对象.day21(继承02--super)

说明 super父 this当前 使用super时&#xff0c;首先要继承父类&#xff0c;其次是在子类里面才能使用super。 继承父类后&#xff0c;运行子类时会同时调用父类的构造方法&#xff0c;如果要显性调用父类的构造方法必须在子类的第一行调用。 单使用super()表示调用父类构造…...

【数据结构】4.List的介绍

目录 1.什么是List 2.常见接口介绍 3.List的使用 1.什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下&#xff1a; Iterable也是一个接口…...

acwing算法提高之图论--最近公共祖先

目录 1 介绍2 训练 1 介绍 本博客用来记录"对于有根图中&#xff0c;求最近公共祖先"的题目。 求解方法&#xff1a; 向上标记法。每次求两个结点的最近公共祖先的时间复杂度是O(N)。由于时间复杂度较高&#xff0c;通常不用。倍增法。 倍增法重要思路&#xff1…...

C语言 函数——断言与防御式编程

目录 如何确定假设的真假&#xff1f; 断言 防御式编程&#xff08;Defensive programming&#xff09; 如何确定假设的真假&#xff1f; 程序中的假设 *某个特定点的某个表达式的值一定为真 *某个特定点的某个表达式的值一定位于某个区间等 问题&#xff1a;如何确定这些…...

【opencv】示例-travelsalesman.cpp 使用模拟退火算法求解旅行商问题

// 载入 OpenCV 的核心头文件 #include <opencv2/core.hpp> // 载入 OpenCV 的图像处理头文件 #include <opencv2/imgproc.hpp> // 载入 OpenCV 的高层GUI(图形用户界面)头文件 #include <opencv2/highgui.hpp> // 载入 OpenCV 的机器学习模块头文件 #includ…...

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…...

xss常用标签和触发事件

无过滤情况 <script> <scirpt>alert("xss");</script> <img> 图片加载错误时触发 <img src"x" οnerrοralert(1)> <img src"1" οnerrοreval("alert(xss)")> 鼠标指针移动到元素时触发 <im…...

WPF中Binding的原理和应用

WPF中Binding的原理和应用 在WPF中&#xff0c;Binding机制是实现数据与界面的连接和同步的重要工具。了解Binding的原理和应用&#xff0c;对于开发人员来说是非常重要的。本文将详细介绍WPF中Binding的原理和应用&#xff0c;帮助读者更好地理解和运用这一强大的机制。 Bin…...

探索设计模式的魅力:深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 挖掘响应式模式&#xff0c;优化AI与机器学习项目性能&#xff0c;引领技术新潮流 ✨机器学习界的…...

《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法

word2vec使用语言天生具备序列这一特性训练得到词语的向量表示。而在图结构上&#xff0c;则存在无法序列的难题&#xff0c;因为图结构它不具备序列特性&#xff0c;就无法得到图节点的表示。deepwalk 的作者提出&#xff1a;可以使用在图上随机游走的方式得到一串序列&#x…...

Java实现二叉树(下)

1.前言 http://t.csdnimg.cn/lO4S7 在前文我们已经简单的讲解了二叉树的基本概念&#xff0c;本文将讲解具体的实现 2.基本功能的实现 2.1获取树中节点个数 public int size(TreeNode root){if(rootnull){return 0;}int retsize(root.left)size(root.right)1;return ret;}p…...

Hello 算法10:搜索

https://www.hello-algo.com/chapter_searching/binary_search/ 二分查找法 给定一个长度为 n的数组 nums &#xff0c;元素按从小到大的顺序排列&#xff0c;数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素&#xff0c;则返回 -1 。 # 首…...

常见分类算法详解

在机器学习和数据科学的广阔领域中&#xff0c;分类算法是至关重要的一环。它广泛应用于各种场景&#xff0c;如垃圾邮件检测、图像识别、情感分析等。本文将深入剖析几种常见的分类算法&#xff0c;帮助读者理解其原理、优缺点以及应用场景。 一、K近邻算法&#xff08;K-Nea…...

推送恶意软件的恶意 PowerShell 脚本看起来是人工智能编写的

威胁行为者正在使用 PowerShell 脚本&#xff0c;该脚本可能是在 OpenAI 的 ChatGPT、Google 的 Gemini 或 Microsoft 的 CoPilot 等人工智能系统的帮助下创建的。 攻击者在 3 月份的一次电子邮件活动中使用了该脚本&#xff0c;该活动针对德国的数十个组织来传播 Rhadamanthy…...

微服务之Consul 注册中心介绍以及搭建

一、微服务概述 1.1单体架构 单体架构&#xff08;monolithic structure&#xff09;&#xff1a;顾名思义&#xff0c;整个项目中所有功能模块都在一个工程中开发&#xff1b;项目部署时需要对所有模块一起编译、打包&#xff1b;项目的架构设计、开发模式都非常简单。 当项…...

MES生产管理系统:私有云、公有云与本地化部署的比较分析

随着信息技术的迅猛发展&#xff0c;云计算作为一种新兴的技术服务模式&#xff0c;已经深入渗透到企业的日常运营中。在众多部署方式中&#xff0c;私有云、公有云和本地化部署是三种最为常见的选择。它们各自具有独特的特点和适用场景&#xff0c;并在不同程度上影响着企业的…...

【core analyzer】core analyzer的介绍和安装详情

目录 &#x1f31e;1. core和core analyzer的基本概念 &#x1f33c;1.1 coredump文件 &#x1f33c;1.2 core analyzer &#x1f31e;2. core analyzer的安装详细过程 &#x1f33c;2.1 方式一 简单但不推荐 &#x1f33c;2.2 方式二 推荐 &#x1f33b;2.2.1 安装遇到…...

个人练习之-jenkins

虚拟机环境搭建(买不起服务器 like me) 重点: 0 虚拟机防火墙关闭 systemctl stop firewalld.service systemctl disable firewalld.service 1 (centos7.6)网络配置 (vmware 编辑 -> 虚拟网络编辑器 -> 选择NAT模式 ->NAT设置查看网关) vim /etc/sysconfig/network-sc…...

合作社做网站有用吗/百度认证中心

Your Mono toolset 到这里的时候你可能已经放弃了&#xff0c;或者跟了下来.我们剩下要做的已经不多了.我们已经安装好了Mono和一些我们准备用来编译并运行C#应用程序的工具.在我们开始编写并运行应用程序之前,我觉得最好先稍微看一下目前已经可以使用的那些工具的简介,这只是其…...

wordpress如何更新缓存/网络营销推广方式有哪些

队名 火箭少男100组长博客 林燊大哥作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭&#xff01;成员冲刺阶段情况 林燊&#xff08;组长&#xff09; 过去两天完成了哪些任务 协调各成员之间的工作学习MSI、CUDA试运行软件并调试展示GitHub当日代码/文档签入记录(组内共享)接下来的计划 测试…...

wordpress 链接跳转/网站seo分析案例

目录 (?)[] 本文地址&#xff1a;http://blog.csdn.net/spch2008/article/details/9005885 Paste环境准备 1. 下载paste&#xff0c;放于eclipse目录中 paste库&#xff1a;http://download.csdn.net/detail/spch2008/5500979 2.目录结构 现在将之前的程序改写&#xff0c;改…...

企业网站优化的弊端/合肥seo网站排名

因为总是记不住&#xff0c;还要百度或者试验一下&#xff0c;不如干脆记下来 tran属性&#xff1a;position、rotation、scale transform.SetParent(Transform parent, bool worldPositionStays) worldPositionStays&#xff1a;是否保持原本的tran属性 worldPositionStay…...

供应链网站开发/个人如何加入百度推广

原标题&#xff1a;王者可以跨系统转移账号了&#xff0c;需要花99&#xff0c;大家怎么看&#xff1f;相信有很多同学一直以来&#xff0c;都希望可以腾讯可以开放跨系统角色转移服务。因为部分同学在更换手机后&#xff0c;原有角色因系统更换而无法在新手机中登录使用。但每…...

传媒公司做网站编辑 如何/自媒体发稿

上篇只是简单的介绍了插件的组成 这次准备进行更深一步的研究 官网下载plugin模板 sublime 打开3个js文件 首先common.js是不需要研究的 打开edittime.js 我们先来看这几个&#xff1a; 我们将其中的值更改为&#xff1a; 安装插件看看效果 以这种形式压缩&…...