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

Transformer中的数据输入构造

文章目录

    • 1. 文本内容
    • 2. 字典构造
      • 2.1 定义一个类用于字典构造
      • 2.2 拆分文本
      • 2.3 构造结果
    • 3. 完整代码

1. 文本内容

假如我们有如下一段文本内容:

Optics

It is the branch of physics that studies the behaviour and properties of light .

Optical Science

  • 这段文本有5行,第一行内容为 ’Optics‘,第二行为空行,第三行内容为 ’It is the branch of physics that studies the behaviour and properties of light .‘, 第四行内容为空行,第五行内容为’Optical Science‘

  • 根据这段文本,可以构造一个字典。在这个字典中,每一个单词有一个编号( i n d e x \mathrm{index} index​),根据这个编号,我们就能知道这个编号对应哪个单词。

  • 将这段文本以 . t x t \mathrm{.txt} .txt 文件的形式放在 d a t a \mathrm{data} data 文件夹下。这里, . t x t \mathrm{.txt} .txt 文件和 d a t a \mathrm{data} data 文件夹都可以自己创建,如下图所示

    在这里插入图片描述

2. 字典构造

2.1 定义一个类用于字典构造

import os
from io import open
import torchclass Dictionary(object):def __init__(self):self.word2idx = {}self.idx2word = []def add_word(self, word):if word not in self.word2idx:self.idx2word.append(word)self.word2idx[word] = len(self.idx2word) - 1return self.word2idx[word]def __len__(self):return len(self.idx2word)
  • self.word2idx = {} 是建立一个空字典来存放每一个单词对应的 i n d e x \mathrm{index} indexself.idx2word = [] 是建立一个空列表来存放 i n d e x \mathrm{index} index 对应的单词;
  • 第二个函数 add_word 用来接收输入的文本数据,然后用 self.idx2word.append(word) 一个一个的放进 self.idx2word = [] 这个空列表里。self.word2idx[word] = len(self.idx2word) - 1 是为每一个加进来的单词分配一个 i n d e x \mathrm{index} index,然后 w o r d : i n d e x \mathrm{word:index} word:index 作为键值对放进self.word2idx = {} 建立的空字典里。
  • 第三个函数返回的是在这个字典中总共有多少个单词(包括标点符号,例如上面文本中的句号 ⋅ \cdot ​)。

2.2 拆分文本

D i c t i o n a r y \mathrm{Dictionary} Dictionary 这个类需要输入数据来产生词典,所以接下来要制作数据,这个数据来源就是 1 1 1 中的文本内容。这里,可以定义如下的一个 D a t a \mathrm{Data} Data 类:

import os
from io import open
import torchclass Data(object):def __init__(self, path):self.dictionary = Dictionary()self.demo = self.tokenize(os.path.join(path, 'demo_text.txt'))def tokenize(self, path):"""Tokenizes a text file."""assert os.path.exists(path)# Add words to the dictionarywith open(path, 'r', encoding="utf8") as f:for line in f:words = line.split() + ['<eos>']for word in words:self.dictionary.add_word(word)# Tokenize file contentwith open(path, 'r', encoding="utf8") as f:idss = []for line in f:words = line.split() + ['<eos>']ids = []for word in words:ids.append(self.dictionary.word2idx[word])idss.append(torch.tensor(ids).type(torch.int64))ids = torch.cat(idss)return ids
  • self.dictionary = Dictionary() 就是将 2.1 2.1 2.1 中构造的字典类实例化,以方便调用。self.demo = self.tokenize(os.path.join(path, 'demo_text.txt')) 是将 d e m o _ t e x t . t x t \mathrm{demo\_text.txt} demo_text.txt 中的内容转化为一个个的 i n d e x \mathrm{index} index​ 。
  • tokenize(self, path) 这个函数就是用来实现将 d e m o _ t e x t . t x t \mathrm{demo\_text.txt} demo_text.txt 中的内容转化为一个个的 i n d e x \mathrm{index} index​ 。
  • tokenize(self, path) 这个函数中,第一个 with open(path, 'r', encoding="utf8") as f: o p e n \mathrm{open} open 函数打开文本内容后,用 f o r \mathrm{for} for 循环,逐行拆分文本为一个个单词(包括标点符号),然后用 self.dictionary.add_word(word) 这个函数将每一个单词放进字典里。注意 words = line.split() + ['<eos>'] ,这里给每一行的末尾加了一个字符 ′ < e o s > ′ \mathrm{'<eos>'} <eos>​ 用于提示一行结束。
  • tokenize(self, path) 这个函数中,第二个 with open(path, 'r', encoding="utf8") as f: o p e n \mathrm{open} open 函数打开文本内容后,用 f o r \mathrm{for} for 循环,逐行拆分文本为一个个单词(包括标点符号),然后用 ids.append(self.dictionary.word2idx[word]) 这个函数将每一个单词对应的 i n d e x \mathrm{index} index​ 放进列表里。
  • idss.append(torch.tensor(ids).type(torch.int64)) 是将每一循环得到的 i d s \mathrm{ids} ids 存起来。
  • 因为每一循环得到 i d s \mathrm{ids} ids 是一个 t e n s o r \mathrm{tensor} tensor ,所以 i d s s \mathrm{idss} idss 里有很多个 t e n s o r \mathrm{tensor} tensor ,最后用 ids = torch.cat(idss) 把所有数据整合成一个 t e n s o r \mathrm{tensor} tensor​ 。

2.3 构造结果

输出字典代码如下:

data = Data('./data') # 给定数据文件夹
data_dict = data.dictionary.word2idx
print(f'由给定文本构造的词典为:\n{data_dict}')

输出结果如下:

由给定文本构造的词典为:
{'Optics': 0, '<eos>': 1, 'It': 2, 'is': 3, 'the': 4, 'branch': 5, 'of': 6, 'physics': 7, 'that': 8, 'studies': 9,
'behaviour': 10, 'and': 11, 'properties': 12, 'light': 13, '.': 14, 'Optical': 15, 'Science': 16}

对比原文本,可以发现,每一个单词有一个对应的编号,其中 '<eos>' 是我们主动添加的代表一行结束的字符。

由给定的文本产生的 i n d e x \mathrm{index} index​ 编码输出为:

data_demo = data.demo
print(f"给定文本所产生的index编码输出为:\n{data_demo}")
# 给定文本所产生的index编码输出为:
# tensor([ 0,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9,  4, 10, 11, 12,  6, 13, 14,
#          1,  1, 15, 16,  1])
  • 第一个数字0代表 O p t i c s \mathrm{Optics} Optics, 第二个数字1代表 O p t i c s \mathrm{Optics} Optics 后的行结束符 '<eos>'
  • 第三个数字1代表空行里的结束符 '<eos>'
  • 第四个数字2代表第三行的第一个单词 I t \mathrm{It} It。 可以类比文本和 i n d e x \mathrm{index} index​ 的编码输出,都可以通过字典一一对应。
  • 这里的 i n d e x \mathrm{index} index 的编码输出就是用于 t r a n s f o r m e r \mathrm{transformer} transformer​ 的训练数据。

3. 完整代码

# %%
import os
from io import open
import torch# %% Dictionary
class Dictionary(object):def __init__(self):self.word2idx = {}self.idx2word = []def add_word(self, word):if word not in self.word2idx:self.idx2word.append(word)self.word2idx[word] = len(self.idx2word) - 1return self.word2idx[word]def __len__(self):return len(self.idx2word)# %% Data
class Data(object):def __init__(self, path):self.dictionary = Dictionary()self.demo = self.tokenize(os.path.join(path, 'demo_text.txt'))def tokenize(self, path):"""Tokenizes a text file."""assert os.path.exists(path)# Add words to the dictionarywith open(path, 'r', encoding="utf8") as f:for line in f:words = line.split() + ['<eos>']for word in words:self.dictionary.add_word(word)# Tokenize file contentwith open(path, 'r', encoding="utf8") as f:idss = []for line in f:words = line.split() + ['<eos>']ids = []for word in words:ids.append(self.dictionary.word2idx[word])idss.append(torch.tensor(ids).type(torch.int64))ids = torch.cat(idss)return ids# %%
data = Data('./data')  # 给定数据文件夹
data_dict = data.dictionary.word2idx
print(f'由给定文本构造的词典为:\n{data_dict}')
# 由给定文本构造的词典为:
# {'Optics': 0, '<eos>': 1, 'It': 2, 'is': 3, 'the': 4, 'branch': 5, 'of': 6, 'physics': 7, 'that': 8, 'studies': 9,
# 'behaviour': 10, 'and': 11, 'properties': 12, 'light': 13, '.': 14, 'Optical': 15, 'Science': 16}
data_demo = data.demo
print(f"给定文本所产生的index编码输出为:\n{data_demo}")
# 给定文本所产生的index编码输出为:
# tensor([ 0,  1,  1,  2,  3,  4,  5,  6,  7,  8,  9,  4, 10, 11, 12,  6, 13, 14,
#          1,  1, 15, 16,  1])

相关文章:

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…...

完美实现vue3异步加载组件

经过几个小时的努力&#xff0c;终于实现了&#xff0c;根据组件名异常加载组件&#xff0c;直接上代码&#xff0c;网上的很多代码方都有坑&#xff0c;先贴出比较坑的代码&#xff1a; <template><view class"main"> <view class"tops"…...

点云成图原理

点成图&#xff08;Point Cloud&#xff09;是指由一组离散的点构成的图形&#xff0c;它们在空间中没有任何连接关系。点成图通常是由激光雷达、相机或其他传感器获取的三维数据&#xff0c;用于表示现实世界中的物体或场景。 三角成图&#xff08;Triangulation&#xff09;…...

如何将jsp项目转成springboot项目

昨天说过&#xff0c;springboot推荐使用Thymeleaf作为前后端渲染的模板引擎&#xff0c;为什么推荐用Thymeleaf呢&#xff0c;有以下几个原因&#xff1a; 动静结合&#xff1a;Thymeleaf支持HTML原型&#xff0c;允许在HTML标签中增加额外的属性来实现模板与数据的结合。这样…...

C语言:环形链表

1.例子1&#xff1a;环形链表 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们先定义两个变量slow和fast&#xff0c;slow每次走一步&#xff0c;fast每次走两步&#xff0c;如果链表是环形链表&#xff0c;那么必定存在fast不会走到链表的最后…...

typescript综合练习1(展开音乐播放列表)

Playlist Soundness What’s up, friend?! I’m so pumped you’re joining us. We’ve got a sick project we could totally use your help on! See, someone’s giving us amazing recommendations for songs to play. But they’re not just coming in as songs. Someti…...

零基础入门学习Python第二阶02面向对象,迭代器生成器,并发编程

Python语言进阶 面向对象相关知识 三大支柱&#xff1a;封装、继承、多态 例子&#xff1a;工资结算系统。 """月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成"""from abc import ABCMeta, abstractmethodcl…...

Unity | Shader基础知识(第十三集:编写内置着色器阶段总结和表面着色器的补充介绍)

目录 前言 一、表面着色器的补充介绍 二、案例viewDir详解 1.viewDir是什么 2.viewDir的作用 3.使用viewDir写shader 前言 注意观察的小伙伴会发现&#xff0c;这组教程前半部分我们在编写着色器的时候&#xff0c;用的是顶点着色器和片元着色器的组合。 SubShader{CGPRO…...

JavaScript map对象/set对象详解

文章目录 一、map对象二、map对象应用场景1. 数组元素转换2. 对象数组的属性提取或转换3. 数组元素的复杂转换4. 与其他数组方法结合使用5. 与异步操作结合&#xff08;使用 Promise&#xff09;6. 生成新的数据结构7. 数学和统计计算 三、set对象1. 基本使用2. 特性3. 注意事项…...

【kettle017】kettle访问DB2数据库并处理数据至execl文件(最近完善中)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下DB2数据库&#xff08;IBM公司开发的一套关系型数据库管理系统&#xf…...

Spring Cloud原理详解和作用特点

当涉及到构建和管理分布式系统的微服务架构时&#xff0c;Spring Cloud 是一个备受欢迎的选择。它提供了一套强大的工具和组件&#xff0c;使开发者能够轻松地构建、部署和管理微服务应用程序。本文将深入探讨 Spring Cloud 的原理和作用特点。 1. Spring Cloud 的原理 Sprin…...

Linux —— 进程间通信

目录 一、进程间通信的介绍二、管道三、匿名管道四、命名管道五、system V进程间通信 一、进程间通信的介绍 1.进程间通信的概念 进程通信&#xff08;Interprocess communication&#xff09;&#xff0c;简称&#xff1a;IPC&#xff1b; 本来进程之间是相互独立的。但是…...

ASP.NET信息安全研究所设备管理系统的设计与实现

摘 要 以研究所的设备管理系统为背景&#xff0c;以研究所设备管理模式为研究对象&#xff0c;开发了设备管理系统。设备管理系统是设备管理与计算机技术相结合的产物&#xff0c;根据系统的功能需求分析与定义的数据模式&#xff0c;分析了应用程序的主要功能和系统实现的主…...

<网络安全>《81 微课堂<安全产品微简介(1)>》

1 简单的了解复杂的安全产品 产品简要防火墙网络区域边界上部署&#xff0c;主要作用是隔离阻断。安全审计一般包括网络日志的分析、网络流量的监控和用户行为的跟踪等。发现网络中的潜在问题和漏洞。入侵检测IDS实时监控和检测网络中的异常活动和入侵行为。入侵防御IPS防病毒…...

【6D位姿估计】FoundationPose 跑通demo 训练记录

前言 本文记录在FoundationPose中&#xff0c;跑通基于CAD模型为输入的demo&#xff0c;输出位姿信息&#xff0c;可视化结果。 然后分享NeRF物体重建部分的训练&#xff0c;以及RGBD图为输入的demo。 1、搭建环境 方案1&#xff1a;基于docker镜像&#xff08;推荐&#xf…...

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中&#xff0c;yield 关键字用于定义生成器函数&#xff0c;它的作用是将函数变成一个生成器&#xff0c;可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中&#xff0c;“yield” 是一种生成器&#xff0…...

迅睿CMS中实现关键词搜索高亮

在迅睿CMS系统中实现关键词搜索高亮是提升用户体验和搜索效果的重要手段。当用户搜索某个关键词时&#xff0c;将搜索结果中的关键词高亮显示&#xff0c;可以帮助用户更快速地定位到所需信息。 关键词高亮的实现 在迅睿CMS中&#xff0c;你可以使用内置的dr_keyword_highlig…...

晶振的精度与稳定性有什么关系?

晶振的精度和稳定性是电子设备中非常重要的参数&#xff0c;它们受到多种因素的影响&#xff0c;主要包括&#xff1a; 精度的影响因素&#xff1a; 温度变化&#xff1a;晶体的温度系数会使得频率随温度变化而变化&#xff0c;通常在0C到55C的工业标准温度范围内&#xff0c;…...

【C】137 只出现一次的数字

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 解法一 #include <stdio.h>int singleNumber(i…...

51单片机入门:DS1302时钟

51单片机内部含有晶振&#xff0c;可以实现定时/计数功能。但是其缺点有&#xff1a;精度往往不高、不能掉电使用等。 我们可以通过DS1302时钟芯片来解决以上的缺点。 DS1302时钟芯片 功能&#xff1a;DS1302是一种低功耗实时时钟芯片&#xff0c;内部有自动的计时功能&#x…...

LInux(gcc处理器,库文件,动静态库)

//Dbug版本为可调试版本 生成的可执行的文件在包含调试信息 //Release版本为用户版本 无可调试信息 用gcc生成的就是Release版本 //用gcc生成的就是Release版本 -g 可以变成Dbug版本 //e.g gcc 1.c -o 1 -g // 变成Dbug版本后 输入gdb 文件名 进入调试模式 // 在完成调试…...

Day3:拆箱ROS2|一起搭建机器人开发车间

Day1:一起学习了ros2是什么以及ros2为机器人开发提供了哪些核心功能. Day2一起安装了ros2。 接下来自然会想到如果现在要用ROS2开发一个机器人&#xff0c;应该怎样开始&#xff1f; 下面我们以雷达小车机器人举例说明&#xff1a; 1、需要为机器人创建一个【工作空间】作为顶层…...

别再为本科毕业论文熬大夜!Paperxie 智能写作,一键搞定终稿的正确姿势

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 又到了本科毕业论文冲刺的季节&#xff0c;多少同学还在对着空白文档发呆&#xff1f;选题纠结半天定不下来&…...

Perplexity无法解析Springer LaTeX公式?2024.06最新MathJax兼容补丁+3类数学文献精准摘要生成术

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Perplexity解析Springer文献的底层机制与失效归因 Perplexity 作为衡量语言模型预测能力的关键指标&#xff0c;在学术文献解析场景中常被误用为“质量代理”&#xff0c;尤其在处理 Springer 出版集团…...

Python 爬虫数据处理:重复页面数据智能合并去重

前言 在规模化 Python 爬虫采集项目中&#xff0c;重复页面数据是高频出现的核心问题&#xff0c;源于站点分页逻辑错乱、镜像页面分发、动态接口返回冗余数据、多入口同源页面采集等多重因素。重复数据若不做处理&#xff0c;不仅会造成数据库存储冗余、占用服务器资源&#…...

FastAPI部署演进:从Gunicorn+Uvicorn镜像到原生多进程的迁移指南

1. 项目背景与演进&#xff1a;从“黄金搭档”到“历史遗产”如果你在过去几年里用 FastAPI 部署过 Web 服务&#xff0c;大概率听说过或者用过tiangolo/uvicorn-gunicorn-fastapi-docker这个 Docker 镜像。它一度是 FastAPI 官方文档里推荐的部署方案之一&#xff0c;由 FastA…...

AI时代工程师的超能力进化

好的&#xff0c;这是一篇关于AI时代工程师能力进化的技术文章大纲&#xff1a; 标题&#xff1a; AI时代工程师的“超能力”进化论&#xff1a;从工具使用者到智能架构师 导言&#xff1a; 简述AI技术的迅猛发展及其对各行业的深刻影响。提出问题&#xff1a;在AI成为强大“…...

Sora 2正式版突然开放API灰度权限?我们逆向解析了127行响应头与rate limit策略,发现3个隐藏调用阈值

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Sora 2正式版核心能力与架构演进 Sora 2正式版标志着视频生成大模型从研究原型迈向工业级部署的关键跃迁。其底层架构采用分层时空联合建模&#xff08;Hierarchical Spatio-Temporal Transformer&…...

基于MCP协议与FFmpeg构建AI视频处理服务器:原理、部署与实战

1. 项目概述&#xff1a;一个面向视频处理的MCP服务器 最近在折腾一些AI应用&#xff0c;发现很多工具在处理视频内容时&#xff0c;总感觉差了那么一口气。要么是功能太单一&#xff0c;只能做简单的剪辑或转码&#xff1b;要么就是流程太复杂&#xff0c;需要把视频下载、处…...

工业 AI 赋能采购:智能供应商匹配重构招标流程

Q1&#xff1a;传统企业采购招标&#xff0c;供应商对接与筛选存在哪些固有痛点&#xff1f;传统工业企业采购招标模式高度依赖人工经验&#xff0c;存在三大核心痛点&#xff1a;供应商资源固化&#xff1a;每次招标都需从零手动联络供应商&#xff0c;仅依靠采购人员个人记忆…...