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

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: NLP数据集构建的基本步骤

构建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这种现成的就好,支持多线程,速度快,还简单!!!

相关文章
|
3天前
|
并行计算 监控 搜索推荐
使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程
当处理大规模图数据时,复杂性难以避免。PyTorch-BigGraph (PBG) 是一款专为此设计的工具,能够高效处理数十亿节点和边的图数据。PBG通过多GPU或节点无缝扩展,利用高效的分区技术,生成准确的嵌入表示,适用于社交网络、推荐系统和知识图谱等领域。本文详细介绍PBG的设置、训练和优化方法,涵盖环境配置、数据准备、模型训练、性能优化和实际应用案例,帮助读者高效处理大规模图数据。
26 5
|
11天前
|
机器学习/深度学习 自然语言处理 PyTorch
从零开始构建nlp情感分析模型!
本教程介绍了如何使用PyTorch和Hugging Face的Transformers库构建一个情感分析模型。主要内容包括导入所需库、读取训练数据集、加载预训练的BERT模型和分词器、定义情感数据集类、划分训练集和验证集、创建数据加载器、设置训练参数、训练模型、评估模型性能以及定义和测试预测函数。通过这些步骤,可以实现一个简单而有效的情感分析模型。
41 2
|
2月前
|
并行计算 PyTorch 算法框架/工具
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
文章介绍了如何在CUDA 12.1、CUDNN 8.9和PyTorch 2.3.1环境下实现自定义数据集的训练,包括环境配置、预览结果和核心步骤,以及遇到问题的解决方法和参考链接。
113 4
基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练
|
1月前
|
机器学习/深度学习 数据采集 自然语言处理
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
【NLP自然语言处理】基于PyTorch深度学习框架构建RNN经典案例:构建人名分类器
|
2月前
|
存储 缓存 PyTorch
使用PyTorch从零构建Llama 3
本文将详细指导如何从零开始构建完整的Llama 3模型架构,并在自定义数据集上执行训练和推理。
59 1
|
3月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch与Hugging Face Transformers:快速构建先进的NLP模型
【8月更文第27天】随着自然语言处理(NLP)技术的快速发展,深度学习模型已经成为了构建高质量NLP应用程序的关键。PyTorch 作为一种强大的深度学习框架,提供了灵活的 API 和高效的性能,非常适合于构建复杂的 NLP 模型。Hugging Face Transformers 库则是目前最流行的预训练模型库之一,它为 PyTorch 提供了大量的预训练模型和工具,极大地简化了模型训练和部署的过程。
167 2
|
3月前
|
Apache UED 数据安全/隐私保护
揭秘开发效率提升秘籍:如何通过Apache Wicket组件重用技巧大翻新用户体验
【8月更文挑战第31天】张先生在开发基于Apache Wicket的企业应用时,发现重复的UI组件增加了维护难度并影响加载速度。为优化体验,他提出并通过面板和组件重用策略解决了这一问题。例如,通过创建`ReusableLoginPanel`类封装登录逻辑,使得其他页面可以轻松复用此功能,从而减少代码冗余、提高开发效率及页面加载速度。这一策略还增强了应用的可维护性和扩展性,展示了良好组件设计的重要性。
56 0
|
3月前
|
人工智能 自然语言处理 机器人
掌握未来沟通的艺术:运用TensorFlow与自然语言处理(NLP)技术,从零开始构建你的专属智能对话机器人,让机器理解你的一言一行
【8月更文挑战第31天】本文详细介绍如何利用TensorFlow与自然语言处理技术开发对话机器人。从准备问答数据集开始,通过预处理、构建Seq2Seq模型、训练及预测等步骤,最终实现了一个简易的聊天机器人。示例代码涵盖数据加载、模型搭建及对话功能,适合希望在实际项目中应用AI技术的开发者参考。
47 0
|
3月前
|
机器学习/深度学习 分布式计算 PyTorch
构建可扩展的深度学习系统:PyTorch 与分布式计算
【8月更文第29天】随着数据量和模型复杂度的增加,单个GPU或CPU已无法满足大规模深度学习模型的训练需求。分布式计算提供了一种解决方案,能够有效地利用多台机器上的多个GPU进行并行训练,显著加快训练速度。本文将探讨如何使用PyTorch框架实现深度学习模型的分布式训练,并通过一个具体的示例展示整个过程。
152 0
|
3月前
|
机器学习/深度学习 数据采集 自然语言处理
PyTorch 在自然语言处理中的应用实践
【8月更文第29天】随着深度学习技术的发展,自然语言处理(NLP)领域取得了显著的进步。PyTorch 作为一款强大的深度学习框架,因其灵活性和易用性而被广泛采用。本文将介绍如何利用 PyTorch 构建文本分类模型,并以情感分析为例进行详细介绍。
44 0

热门文章

最新文章