使用Pytorch中的torchtext加载和预处理文本分类任务的数据集

文章目录

    • [1. torchtext版本:0.15.0](#1. torchtext版本:0.15.0)
    • [2. 导入库和模块:](#2. 导入库和模块:)
    • [3. 定义分词器:](#3. 定义分词器:)
      • [3.1 一个简单的示例来进一步说明 `get_tokenizer` 函数的使用](#3.1 一个简单的示例来进一步说明 get_tokenizer 函数的使用)
    • [4. 下载并加载数据集](#4. 下载并加载数据集)
    • [5. 定义词汇表并构建](#5. 定义词汇表并构建)
      • [5.1 `map()` 函数](#5.1 map() 函数)
        • [一个简单的map() 函数的例子](#一个简单的map() 函数的例子)
      • [5.2 `torchtext.vocab.build_vocab_from_iterator(...)` 函数](#5.2 torchtext.vocab.build_vocab_from_iterator(...) 函数)
    • [6. 完整代码](#6. 完整代码)

1. torchtext版本:0.15.0

要查看当前环境中安装的 torchtext 版本,可以使用以下代码:

import torchtext
print(torchtext.__version__)

2. 导入库和模块:

import torchtext
from torchtext.datasets import AG_NEWS
from torchtext.data.utils import get_tokenizer

这里导入了 torchtext 库以及所需的模块和数据集。AG_NEWStorchtext 中的一个文本分类数据集,get_tokenizer 是用于获取分词器的实用函数。

3. 定义分词器:

tokenizer = get_tokenizer("basic_english")

这里使用了 get_tokenizer 函数,创建了一个基于英语的简单分词器。分词器的作用是将原始文本拆分成单词或标记的序列。这里basic_english 是一个预定义的简单分词器,用于英语文本的基本分词。这个分词器会将文本按照空格进行划分,但不会进行复杂的处理,如词干提取、停用词过滤等。

具体而言,basic_english 分词器的工作方式如下:

  1. 按空格分词: 它会将文本按空格进行划分,将文本分割成一个个单词或标记的序列。
  2. 简单处理: 它不会进行复杂的处理,如词干提取、停用词过滤等。每个单词都会作为一个独立的标记。

basic_english 分词器适用于简单的文本处理任务,例如对英语文本进行基本的词级别处理。但对于更复杂的任务,例如情感分析或命名实体识别,可能需要使用更复杂的分词器或进行额外的文本预处理。

3.1 一个简单的示例来进一步说明 get_tokenizer 函数的使用

from torchtext.data.utils import get_tokenizer

# 获取英语基本分词器
basic_english_tokenizer = get_tokenizer("basic_english")

# 待分词的文本
text = "This is a sample sentence for tokenization."

# 使用分词器对文本进行分词
tokens = basic_english_tokenizer(text)

# 打印分词结果
print("Original text:", text)
print("Tokenized text:", tokens)
# Original text: This is a sample sentence for tokenization.
# Tokenized text: ['this', 'is', 'a', 'sample', 'sentence', 'for', 'tokenization', '.']

4. 下载并加载数据集

train_iter = AG_NEWS(split='train')

这行代码下载并加载了 AG News 数据集的训练集部分。split='train' 参数表示加载训练集。

# 打印样本标签和文本,标签通常用于指示文本所属的类别或类别的相关信息。例如,在文本分类任务中,每个文本样本都会附带一个标签,表示该文本属于哪个类别(如新闻分类# 任务中的政治、体育、娱乐等类别)。
# 打印存储样本
texts = []
for (label, text) in train_iter:
    texts.append(text)
    print(f"Label: {label}, Text: {text}")

5. 定义词汇表并构建

# 定义词汇表并构建
vocab = torchtext.vocab.build_vocab_from_iterator(map(tokenizer, iter(texts)))
# 查看词汇表大小:
print("Vocabulary size:", len(vocab))
# Vocabulary size: 95810
  1. iter(train_iter):这是一个内置函数 iter(),它将数据集对象 train_iter 转换为一个迭代器。
  2. map(tokenizer, ...):这是 map() 函数的调用,它将分词器 tokenizer 应用于数据集的每个元素(即每个文本样本)。这样,我们就得到了一个包含分词器处理后的结果的迭代器。
  3. torchtext.vocab.build_vocab_from_iterator(...):这是 torchtext 库中的一个函数,它接受一个迭代器,并根据迭代器中的数据构建词汇表。

5.1 map() 函数

map() 函数用于对数据集中的每个文本样本应用分词器,在 Python 中,map() 函数是一个内置函数,它接受两个参数:一个函数和一个可迭代对象(通常是列表、元组等)。map() 函数会对可迭代对象中的每个元素应用指定的函数,并返回一个包含所有函数返回值的迭代器。在这里,我们使用了 map() 函数将分词器应用于数据集中的每个文本样本。具体来说,我们对数据集中的每个元素(即每个文本样本)应用了分词器函数。这样就得到了一个迭代器,其中包含了分词器处理后的每个文本样本的结果。

一个简单的map() 函数的例子

下面是一个简单的例子,演示如何使用 map() 函数将一个列表中的每个元素加上 1,

# 定义一个函数,将输入加上 1
def add_one(x):
    return x + 1

# 定义一个列表
nums = [1, 2, 3, 4, 5]

# 使用 map() 函数将列表中的每个元素加上 1
result = map(add_one, nums)

# 将结果转换为列表
result_list = list(result)

# 打印结果
print("Original list:", nums)
print("List after adding one to each element:", result_list)
# Original list: [1, 2, 3, 4, 5]
# List after adding one to each element: [2, 3, 4, 5, 6]

5.2 torchtext.vocab.build_vocab_from_iterator(...) 函数

build_vocab_from_iteratortorchtext 库中的一个函数,用于根据数据集中的文本构建词汇表。它接受一个迭代器作为输入,并根据迭代器中的文本数据构建词汇表。

  • 输入参数: build_vocab_from_iterator 函数接受一个迭代器作为输入,迭代器中的每个元素都应该是一个包含单词或标记序列的可迭代对象。例如,可以将文本数据集中的每个文本字符串作为迭代器的元素传递给该函数。
  • 输出结果: 函数返回一个词汇表对象,该对象包含构建的词汇表信息。词汇表通常包含以下几个重要的属性:
    • stoi:将单词映射到索引的字典。
    • itos:将索引映射到单词的列表。
    • freqs:单词的频率信息。
一个简单的build_vocab_from_iterator例子
import torchtext

# 定义一个简单的文本数据集
text_data = ["This is a simple example.", "Another example for building vocabulary."]

# 定义一个分词器函数
def tokenizer(text):
    return text.split()

# 使用 build_vocab_from_iterator 构建词汇表
vocab = torchtext.vocab.build_vocab_from_iterator(map(tokenizer, text_data))

# 打印词汇表
print("Vocabulary:", vocab.get_itos())

6. 完整代码

import torchtext
from torchtext.datasets import AG_NEWS
from torchtext.data.utils import get_tokenizer

# 定义分词器
tokenizer = get_tokenizer("basic_english")
print(f"tokenizer: {tokenizer}")

# 下载并加载数据集
train_iter = AG_NEWS(split='train')

# 打印存储样本
texts = []
for (label, text) in train_iter:
    texts.append(text)
    print(f"Label: {label}, Text: {text}")

# 定义词汇表并构建
vocab = torchtext.vocab.build_vocab_from_iterator(map(tokenizer, iter(texts)))

# 查看词汇表大小:
print("Vocabulary size:", len(vocab))
# Vocabulary size: 95810
相关推荐
丕羽9 小时前
【Pytorch】基本语法
人工智能·pytorch·python
Shy96041820 小时前
Pytorch实现transformer语言模型
人工智能·pytorch
周末不下雨1 天前
跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)
pytorch·神经网络·学习
蜡笔小新星1 天前
针对初学者的PyTorch项目推荐
开发语言·人工智能·pytorch·经验分享·python·深度学习·学习
矩阵猫咪1 天前
【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例
人工智能·pytorch·深度学习·神经网络·机器学习·transformer·时间序列预测
zs1996_2 天前
深度学习注意力机制类型总结&pytorch实现代码
人工智能·pytorch·深度学习
阿亨仔2 天前
Pytorch猴痘病识别
人工智能·pytorch·python·深度学习·算法·机器学习
AI视觉网奇2 天前
nvlink 训练笔记
pytorch·笔记·深度学习
这个男人是小帅2 天前
【GCN】 代码详解 (1) 如何运行【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
pzx_0012 天前
【深度学习】梯度累加和直接用大的batchsize有什么区别
pytorch·深度学习