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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xy_optics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值