Pytorch 文本

2025-07-02 18:43 更新

Python PyTorch 文本处理实战教程

在自然语言处理(NLP)领域,PyTorch 是一个非常流行的深度学习框架。它提供了强大的工具和灵活的 API,使得处理文本数据变得简单而高效。今天,编程狮将带你走进 PyTorch 的文本处理世界,从文本预处理到构建简单的文本分类模型,让你轻松掌握文本处理的核心技能。

一、PyTorch 文本处理基础:认识 torchtext

(一)torchtext 简介

torchtext 是 PyTorch 的一个扩展库,专注于文本处理任务。它提供了文本数据的加载、预处理、分词以及词汇表构建等功能,是 PyTorch 文本处理的核心工具包。

(二)安装 torchtext

确保你已安装 PyTorch,然后通过以下命令安装 torchtext:

pip install torchtext

二、文本预处理:文本处理的第一步

(一)加载文本数据

假设你有一个包含文本数据的文件,每行一条样本,格式如下:

This is the first sample text.
This is the second sample text.
...

你可以使用以下代码加载文本数据:

import torch
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator


## 加载文本数据
def load_text_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        texts = [line.strip() for line in f.readlines()]
    return texts


file_path = 'text_data.txt'  # 替换为你的文本文件路径
texts = load_text_data(file_path)
print(f"加载的文本数据:{texts[:2]}")  # 打印前两条样本

(二)文本分词与词汇表构建

对文本进行分词,并构建词汇表:

## 文本分词
tokenizer = get_tokenizer('basic_english')
tokenized_texts = [tokenizer(text) for text in texts]


## 构建词汇表
def yield_tokens(tokenized_texts):
    for tokens in tokenized_texts:
        yield tokens


vocab = build_vocab_from_iterator(yield_tokens(tokenized_texts), specials=['<unk>'])
vocab.set_default_index(vocab['<unk>'])


## 打印词汇表大小和前 10 个词
print(f"词汇表大小:{len(vocab)}")
print(f"词汇表前 10 个词:{list(vocab)[:10]}")

通过这段代码,你可以将文本数据分词,并构建一个词汇表,为后续的数值化处理做准备。

三、文本数据加载与迭代:DataLoader 的应用

使用 DataLoader 加载文本数据,并提供批处理功能:

from torch.utils.data import Dataset, DataLoader


## 自定义文本数据集类
class TextDataset(Dataset):
    def __init__(self, texts, labels, vocab):
        self.texts = texts
        self.labels = labels
        self.vocab = vocab


    def __len__(self):
        return len(self.texts)


    def __getitem__(self, idx):
        tokenized_text = tokenizer(self.texts[idx])
        numericalized_text = [self.vocab[token] for token in tokenized_text]
        return torch.tensor(numericalized_text), self.labels[idx]


## 使用示例
labels = [0, 1]  # 替换为你的标签列表
dataset = TextDataset(texts, labels, vocab)
data_loader = DataLoader(dataset, batch_size=2, shuffle=True)


## 迭代 DataLoader
for batch_text, batch_labels in data_loader:
    print(f"批次文本形状:{batch_text.shape}, 批次标签:{batch_labels}")
    break  # 只展示一个批次

在这个示例中,我们创建了一个自定义的 TextDataset 类来加载文本数据,并使用 DataLoader 提供批处理功能,方便模型训练。

四、文本嵌入与数值化:将文本转化为模型可理解的形式

(一)文本嵌入

文本嵌入是将单词或短语映射到向量空间的过程。使用预训练的词向量可以为模型提供丰富的语义信息:

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


## 加载预训练的词向量
train_iter = AG_NEWS(split='train')
train_dataset = to_map_style_dataset(train_iter)
vocab = build_vocab_from_iterator(map(lambda x: x[1], train_dataset), specials=['<unk>'])
vocab.set_default_index(vocab['<unk>'])


## 下载预训练的词向量
import torchtext.vocab as Vocab
glove = Vocab.GloVe(name='6B', dim=100)


## 获取单词的嵌入向量
word = 'hello'
embedding_vector = glove[word]
print(f"单词 '{word}' 的嵌入向量:{embedding_vector}")

(二)数值化文本

将分词后的文本转化为数值化的形式:

## 数值化文本
numericalized_texts = []
for tokenized_text in tokenized_texts:
    numericalized_text = [vocab[token] for token in tokenized_text]
    numericalized_texts.append(torch.tensor(numericalized_text))


## 打印数值化后的文本
print(f"数值化后的文本:{numericalized_texts[:2]}")

通过数值化,文本数据被转化为模型可以理解的形式,为后续的模型训练做好准备。

五、构建简单文本分类模型:实战演练

import torch.nn as nn
import torch.optim as optim


## 定义模型
class SimpleTextNet(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
        super(SimpleTextNet, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.fc1 = nn.Linear(embedding_dim, hidden_dim)
        self.fc2 = nn.Linear(hidden_dim, output_dim)


    def forward(self, x):
        x = self.embedding(x)
        x = x.mean(dim=1)  # 对文本向量取平均
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x


## 初始化模型、损失函数和优化器
vocab_size = len(vocab)
embedding_dim = 100
hidden_dim = 128
output_dim = 2  # 假设分类任务有 2 个类别


model = SimpleTextNet(vocab_size, embedding_dim, hidden_dim, output_dim)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())


## 训练模型
num_epochs = 5
for epoch in range(num_epochs):
    for batch_text, batch_labels in data_loader:
        # 前向传播
        outputs = model(batch_text)
        loss = criterion(outputs, batch_labels)


        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()


    print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}")

在这个示例中,我们构建了一个简单的文本分类模型,用于对文本数据进行分类任务。通过训练,模型可以学习到文本的特征,从而实现分类。

六、总结

通过本教程,你已经掌握了 PyTorch 文本处理的基础知识和技能,包括如何加载和预处理文本数据、构建词汇表、使用预训练词向量以及构建简单的文本分类模型。这些技能是自然语言处理领域的基石,为你进一步探索更复杂的文本处理任务打下了坚实的基础。

希望这篇教程能激发你对文本处理的兴趣。如果你在学习过程中有任何疑问或需要进一步的指导,欢迎在 W3Cschool 社区提问或访问编程狮网站获取更多资源。记住,实践是掌握技能的最佳途径,尝试使用不同的数据集和模型架构,不断提升自己的能力。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号