Pytorch基本使用——NLP数据集构建总结

news2025/2/3 7:56:08

构建NLP数据集,分为如下几步:
1.单词分割形式
2.词汇表
3.利用词汇表word2idx映射,制作数据集
4.打包

✨ 1.单词分割

有两种表示方式,一种是word-level,另外一种是char-level。

🌊 1.1 word-level

tokenizer = lambda x: x.split(' ')  # 传入x返回x.split(' ')

举一个例子:x=“你好啊 我是谁” **=》 ** return:[“你好啊”, “我是谁”]

🎈 1.2 char-level

tokenizer = lambda x: [y for y in x]

举一个例子:x=“你好啊 我是谁” **=》 ** return:[“你”, “好”, “啊”, " ", “我”, “是”, “谁”]
一个按照词分割,一个按照字分割

✨ 2.词汇表

有两种方式,一种是已经存在了直接导入,另外一种是没有需要制作

🎃 2.1 直接导入

目前我遇到的就是pkl文件存储的词汇表,所以用pickle库的load函数导入。

import pickle as pkl
vocab = pkl.load(open(vocab_file_path, "rb"))

🎄 2.2 制作

这部分就用到了上面的单词分割**(制作的词汇表是以字符的形式还是词的形式)**。
制作词汇表的函数实现如下

UNK, PAD = '<UNK>', '<PAD>'
def build_vocab(file_path, tokenizer, max_size, min_freq):
    """
    	file_path: 一般为训练集文件路径
    	tokenizer: 按照什么方式制作词汇表(word-level或char-level),详细见第一小节
    	max_size: 词汇表中最多有多少词
    	min_freq: 若训练集中词或字符出现的次数小于这个,直接排除
    	
    	return: 按照训练集中单词的出现次数由大到小进行排序得到的词汇表。举一个简单的例子,假设有单词"白", "三", "点",白出现2词,三出现3次,点出现1次。那么返回的词汇表为{"三": 1, "白": 2, "点": 1}。
    """
    vocab_dic = {}
    with open(file_path, 'r', encoding='UTF-8') as f:
        for line in tqdm(f):
            lin = line.strip()
            if not lin:
                continue
            content = lin.split('\t')[0]
            for word in tokenizer(content):
                vocab_dic[word] = vocab_dic.get(word, 0) + 1
        vocab_list = sorted([_ for _ in vocab_dic.items() if _[1] >= min_freq], key=lambda x: x[1], reverse=True)[:max_size]
        vocab_dic = {word_count[0]: idx for idx, word_count in enumerate(vocab_list)}
        vocab_dic.update({UNK: len(vocab_dic), PAD: len(vocab_dic) + 1})
    return vocab_dic

说了这么多,vocab最终有什么用呢?他是在制作制作数据集时,将中文或英文字符/单词表示为数字的形式

✨ 3 word2idx

总效果就是按照词汇分割,并按照词汇表,将字符映射为数字。
比如:我有词汇表vocab={“白”: 1, “三”:2, “点”:3},输入:

input = [
	["白三"],
    ["三点"],
    ["白点"]
]

那么输出应该为:

output = [
	[1, 2],
    [2, 3],
    [1, 3]
]

上面的例子是最简单的,还有一种是应用了n-gram模型的,下面做一个简单的总结。

3.1 原文展示

在这里插入图片描述
原文都是类似如上的,如果有label,将label用split分割出去。

🍿 3.2 分割映射

首先我们应该导入词汇表和训练数据:按照第二节的内容导入或这制作,唯一需要注意的是这里的词汇表是n-gram模型吗!!!影响到后面切片。

⛱️ 3.3 遍历

准备工作做完了,开始遍历,进行切割。就以代码进行总结了。

    # 按照行遍历,即3.1节中第一行的内容,第二行的你内容...
    for a_sentence,b_sentence in zip(text_a,text_b):
        # 存储模型的输入内容,因为是双塔模型,所以两个输入
        a,b=[],[]
        
        # 效果是对每一行中的每一个切片,这里在下面进行详细的总结!!!3.4小节
        for slice in lst_gram(a_sentence):
			# 如果切片内容在词汇表中存在,就把映射到的数据放到结果列表
            if slice in slice2idx.keys():
                a.append(slice2idx[slice])
            # 如果切片的内容不存在,就用映射到[UNK]的数字进行替换
            else:
                a.append(1)  # {"[UNK]": 1, 
                
        # 这个和上面的for循环是一样的,如果不是多输入模型,其实就上面一个        
        for slice in lst_gram(b_sentence):
            if slice in slice2idx.keys():
                b.append(slice2idx[slice])
            else:
                b.append(1)
                
        # 这里是由于我们的打包时要求tensor维度一致,因此我们把数据填充到相同大小。3.5小节详细总结!!!
        a_list.append(a)
        b_list.append(b)

🌭 3.4 切片

到这里总结的原因其实就是上面放不下!!!**因为这里分为很多种,普通的单字符切片,运用了n-gram模型的。**我目前遇到的就上面两个。
如果是单字符切片,其实就for char in sentence即可,其中sentence是一行的数据内容,参照3.1小节!!
但是如果是运用了n-gram,就需要一些代码进行处理了,见下面

def lst_gram(lst, n):
    # 返回切片结果
    s=[]
    # 按照空格分割行数据,可能在别的数据集或按照词进行分割的时候有用,这里真没用!!!
    for word in str(lst).lower().split():
        # n_gram是主要函数
        s.extend(n_gram(word))
    # 返回结果
    return s

lst为需要分割的行数据,n为n-gram模型的类型,比如2-gram模型,数据类型为int。
str(lst).lower().split()可能在别的数据集或按照词进行分割的时候有用,比如我们一行数据为[“白三 三点 白点”]这里就有用了,遇到再总结吧!!!

def n_gram(word,n=args.N):
    s=[]
    # 每行数据以#开头和结束
    word='#'+word+'#'
    # 三个字符分割
    for i in range(len(word)-2):
        s.append(word[i:i+3])
    return s

这里进行的就是n-gram操作了 重点!!!
最终的效果大概如下(随便截的,与上面无关):
在这里插入图片描述

☃️3.5 padding

def padding(text,maxlen=args.SENTENCE_MAXLEN):
    """
    	text:按照行映射完成的数据
    	maxlen:约定的每行数据的固定长度
    """
    # 存储结果
    pad_text=[]
    # 遍历,得到每行的数据(sentence)
    for sentence in text:
        # 创建一个固定长度的默认值为0的数组
        pad_sentence = np.zeros(maxlen).astype('int64')
        cnt=0
        # 遍历一行中的每个字符数据,向创建好的固定长度的数组进行填充
        for index in sentence:
            pad_sentence[cnt]=index
            cnt+=1
            # 如果达到了最大长度,就结束,这一行后面的内容就省略了。
            if cnt== maxlen:
                break
        # 将一行的数据添加到存储结果的列表中
        pad_text.append(pad_sentence.tolist())
    return pad_text

特别注意,这里为什么要用0来填充。原因是我们约定,如果长度不够,剩下的用[PAD]来补充,而这里认为[PAD]映射为数字即为0。

🎈 3.6 最终结果展示

在这里插入图片描述
这里,a_list代表了文本文件中所有数据的内容。而其中每一个位置都是一行的数据。

至此,文本任务制作数据集的操作就完成了,下面是打包的操作

✨ 4.打包

看过几个NLP项目了,总结一下其中遇到的数据集的创建。

首先,明确数据集最终的使用是以for循环进行遍历。因此最终是一个以batch_size大小可迭代的对象即可(其实pytorch的DateLoader应该就是做着这个工作)。

所以,接下来就有两种办法

1.重载DataSet并用DataLoader打包

2.自定义迭代器

🎃 4.1 DataLoader打包

如果是DataLoader打包,从第1小节到第3小节的内容应该在重载的DataSet类中完成(该有的操作必须要)。如果是制作迭代器,就没有这个要求了。

这部分其实和图片分类任务是一致的,如果真的需要再来总结!!!

🍿 4.2 迭代器

这可是第一次。创建迭代器最基本的架构如下:

class DatasetIterater(object):
    def __init__(self):
	
    def __next__(self):
        
    def __iter__(self):
        return self

这里的__next____inter__见特殊实例总结!!!主要介绍一下init和next函数的工作。

	# __init__

    def __init__(self, batches, batch_size, device):
        self.batch_size = batch_size
        self.batches = batches  # 数据集
        self.n_batches = len(batches) // batch_size
        self.residue = False  # 记录batch数量是否为整数 
        if len(batches) % self.n_batches != 0:
            self.residue = True
        self.index = 0
        self.device = device

最重要的就是对batch_size的定义及其延申:

1.定义batch_size大小

2.得到batch_size的尺寸

3.记录batch_size是否为整数

 # __next__

其实用DataSet这种现成的就好,支持多线程,速度快,还简单!!!

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

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

相关文章

可爱小猫猫【InsCode Stable Diffusion美图活动一期】

一、 Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置&#xff1a; 模型&#xff1a;chilloutmix_NiPrunedFp32fix Lora&#xff1a;cat_20230627113759 采样迭代步数&#xff08;steps&#xff09;:…

十三、前端包管理工具详解

一、代码共享方案 我们已经学习了在JavaScript中可以通过模块化的方式将代码划分成一个个小的结构&#xff1a; 在以后的开发中我们就可以通过模块化的方式来封装自己的代码&#xff0c;并且封装成一个工具&#xff1b; 这个工具我们可以让同事通过导入的方式来使用&#xf…

jetson系列开发板生成.engine部署

jetson系列开发板 生成engine 1. 下载 tensorrtx 至 NX git clone -b yolov5-v5.0 https://github.com/wang-xinyu/tensorrtx.git2. 修改 yololayer.h 中的参数 labels.txt 中有几类就将 CLASS_NUM 修改为几。 static constexpr int CLASS_NUM 80; 3. 编译 tensorrtx/yolov…

OLED拼接屏出现坏点怎么办?专家提供的修复方法与建议

OLED拼接屏作为一种高级显示技术&#xff0c;广泛应用于商业展示、会议室和监控中心等场所。 然而&#xff0c;由于制造过程中的缺陷或长时间使用导致的原因&#xff0c;OLED拼接屏可能出现屏幕坏点问题。本文将详细介绍OLED拼接屏屏幕坏点的修复方法与注意事项&#xff0c;帮…

高效编程:如何优雅地判断数组中所有对象的值不为空?

前言 在前端开发中&#xff0c;判断数组中所有对象的值是否都不为空是一个常见的任务。这个任务可能涉及到多个对象和多个属性&#xff0c;因此需要一种简洁而高效的方法来处理。本文将介绍三种不同的方法&#xff0c;帮助你轻松应对这个问题。 方法一&#xff1a;使用 every()…

原生js实现将图片内容复制到剪贴板

核心代码 /*复制图片*/ copyImg(dom) {/* 警告&#xff1a;dom不能是img标签&#xff0c;建议用DIV标签包裹img标签&#xff0c;否者会报错&#xff01;不支持复制背景图&#xff01; */dom.style.userSelect auto;let selection getSelection(), range document.createRan…

【AT89C52单片机项目】数字密码锁设计

实验目的 使用单片机设计数字密码锁。 实验仪器 一套STC89C52RC开发板套件&#xff0c;包括STC89C52RC开发板&#xff0c;以及USB烧录线。 设计要求 1、有设置密码、开锁工作模式&#xff1b; 2、可以每次都设置密码&#xff0c;也可以设置一次密码多次使用。 实验原理 …

JS加密之JS基础大考验

JS加密之JS基础大考验 工欲利其器 必先善其事 JavaScript&#xff08;简称JS&#xff09;是一种高级、动态、弱类型的编程语言&#xff0c;主要用于前端网页开发&#xff0c;但也可用于后端服务器开发&#xff08;通过Node.js&#xff09;。下面是JavaScript的一些特点&#…

windows 安装Vcenter6.7避坑指南

1、推荐windows server 2016。第一次选择windows 2019会出现很多错误 2、内存要求&#xff1a;8G以上 3、如果安装了VMtools&#xff0c;则需要把VCC全部卸载了&#xff08;控制面板-->卸载程序&#xff09;

【Linux初阶】基础IO - 软硬链接 | 初识、理解、应用 文件acm时间

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;初识软硬链接&#xff0c;软硬链接的区别&#xff0c;理解软硬链接&#xff0c;软硬链接的应用&#xff0c;文…

Access简单应用

不说废话,直入正题. 关于Access的用法 一开始大家想用添加数据快速生成sql语句,其实在这里 java链接Access数据库需要ODBC连接池 机器jar包 ODBC连接池在 首次添加需要配置如上图所示,jar包链接在下面,直接放到项目下即可 UCanAccess - Browse Files at SourceForge.net下载…

前端学习记录~2023.7.13~CSS杂记 Day6

前言一、基本文字和字体样式1、CSS 中的文字样式涉及什么2、字体&#xff08;1&#xff09;颜色&#xff08;2&#xff09;字体种类a. 网络安全字体b. 默认字体c. 字体栈 &#xff08;3&#xff09;字体大小&#xff08;4&#xff09;字体样式&#xff08;5&#xff09;字体粗细…

基于SpringBoot+vue的交流互动系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

C语言strcmp()函数学习

strcmp函数是string compare(字符串比较)的缩写&#xff0c;用于比较两个字符串并根据比较结果返回整数&#xff1b; strcmp(str1,str2)&#xff1b; 若str1str2&#xff0c;则返回零&#xff1b;若str1<str2&#xff0c;则返回负数&#xff1b;若str1>str2&#xff0c;则…

尚硅谷--Vue从入门到精通

尚硅谷–Vue从入门到精通 第1章&#xff1a;Vue核心 1.1 Vue简介 1.1.1 Vue是什么&#xff1f; 一套用于构建用户界面的渐进式JS框架。 1.1.2 谁开发的&#xff1f; ——尤雨溪。 2015-10-27 正式发布 Vue1.0.0 Evangelion&#xff08;新世纪福音战士&#xff09;2016-1…

【PythonBA】商业分析:Business Analytics 的理解

猛戳订阅&#xff01; &#x1f449; 《一起玩蛇》&#x1f40d; &#x1f4dc; 本章目录&#xff1a; Ⅰ. BA 的基础概念 0x00 什么是商业分析&#xff08;Business Analytics&#xff09; 0x01 Explain 和 Predict 0x02 如何去进行分析&#xff1f; 0x03 Python 数据分…

Flutter加载Html

Flutter_Fai_Webview 插件可实现的功能&#xff1a; 同时适配于 Android Ios 两个平台通过 url 来加载渲染一个Html 页面加载 Html 文本数据 如 <html> .... </html>等加载 Html 标签数据 如 <p> ... </p>实现 WebView 加载完成后&#xff0c;自动测量…

【报错】Failed to determine a suitable driver class

文章目录 是否需要mybatis依赖&#xff1a;不需要排除resources未编译 报错信息 *************************** APPLICATION FAILED TO START ***************************Description:Failed to configure a DataSource: url attribute is not specified and no embedded datas…

Python实现HBA混合蝙蝠智能算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码

【2023江西省研究生数学建模竞赛】第三题 植物的多样性 48页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【2…