国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Pytorch 文本

2025-07-02 18:43 更新

Python PyTorch 文本處理實(shí)戰(zhàn)教程

在自然語言處理(NLP)領(lǐng)域,PyTorch 是一個(gè)非常流行的深度學(xué)習(xí)框架。它提供了強(qiáng)大的工具和靈活的 API,使得處理文本數(shù)據(jù)變得簡(jiǎn)單而高效。今天,編程獅將帶你走進(jìn) PyTorch 的文本處理世界,從文本預(yù)處理到構(gòu)建簡(jiǎn)單的文本分類模型,讓你輕松掌握文本處理的核心技能。

一、PyTorch 文本處理基礎(chǔ):認(rèn)識(shí) torchtext

(一)torchtext 簡(jiǎn)介

torchtext 是 PyTorch 的一個(gè)擴(kuò)展庫,專注于文本處理任務(wù)。它提供了文本數(shù)據(jù)的加載、預(yù)處理、分詞以及詞匯表構(gòu)建等功能,是 PyTorch 文本處理的核心工具包。

(二)安裝 torchtext

確保你已安裝 PyTorch,然后通過以下命令安裝 torchtext:

pip install torchtext

二、文本預(yù)處理:文本處理的第一步

(一)加載文本數(shù)據(jù)

假設(shè)你有一個(gè)包含文本數(shù)據(jù)的文件,每行一條樣本,格式如下:

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

你可以使用以下代碼加載文本數(shù)據(jù):

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


## 加載文本數(shù)據(jù)
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"加載的文本數(shù)據(jù):{texts[:2]}")  # 打印前兩條樣本

(二)文本分詞與詞匯表構(gòu)建

對(duì)文本進(jìn)行分詞,并構(gòu)建詞匯表:

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


## 構(gòu)建詞匯表
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 個(gè)詞
print(f"詞匯表大?。簕len(vocab)}")
print(f"詞匯表前 10 個(gè)詞:{list(vocab)[:10]}")

通過這段代碼,你可以將文本數(shù)據(jù)分詞,并構(gòu)建一個(gè)詞匯表,為后續(xù)的數(shù)值化處理做準(zhǔn)備。

三、文本數(shù)據(jù)加載與迭代:DataLoader 的應(yīng)用

使用 DataLoader 加載文本數(shù)據(jù),并提供批處理功能:

from torch.utils.data import Dataset, DataLoader


## 自定義文本數(shù)據(jù)集類
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]  # 替換為你的標(biāo)簽列表
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}, 批次標(biāo)簽:{batch_labels}")
    break  # 只展示一個(gè)批次

在這個(gè)示例中,我們創(chuàng)建了一個(gè)自定義的 TextDataset 類來加載文本數(shù)據(jù),并使用 DataLoader 提供批處理功能,方便模型訓(xùn)練。

四、文本嵌入與數(shù)值化:將文本轉(zhuǎn)化為模型可理解的形式

(一)文本嵌入

文本嵌入是將單詞或短語映射到向量空間的過程。使用預(yù)訓(xùn)練的詞向量可以為模型提供豐富的語義信息:

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


## 加載預(yù)訓(xùn)練的詞向量
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>'])


## 下載預(yù)訓(xùn)練的詞向量
import torchtext.vocab as Vocab
glove = Vocab.GloVe(name='6B', dim=100)


## 獲取單詞的嵌入向量
word = 'hello'
embedding_vector = glove[word]
print(f"單詞 '{word}' 的嵌入向量:{embedding_vector}")

(二)數(shù)值化文本

將分詞后的文本轉(zhuǎn)化為數(shù)值化的形式:

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


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

通過數(shù)值化,文本數(shù)據(jù)被轉(zhuǎn)化為模型可以理解的形式,為后續(xù)的模型訓(xùn)練做好準(zhǔn)備。

五、構(gòu)建簡(jiǎn)單文本分類模型:實(shí)戰(zhàn)演練

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)  # 對(duì)文本向量取平均
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x


## 初始化模型、損失函數(shù)和優(yōu)化器
vocab_size = len(vocab)
embedding_dim = 100
hidden_dim = 128
output_dim = 2  # 假設(shè)分類任務(wù)有 2 個(gè)類別


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


## 訓(xùn)練模型
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)


        # 反向傳播和優(yōu)化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()


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

在這個(gè)示例中,我們構(gòu)建了一個(gè)簡(jiǎn)單的文本分類模型,用于對(duì)文本數(shù)據(jù)進(jìn)行分類任務(wù)。通過訓(xùn)練,模型可以學(xué)習(xí)到文本的特征,從而實(shí)現(xiàn)分類。

六、總結(jié)

通過本教程,你已經(jīng)掌握了 PyTorch 文本處理的基礎(chǔ)知識(shí)和技能,包括如何加載和預(yù)處理文本數(shù)據(jù)、構(gòu)建詞匯表、使用預(yù)訓(xùn)練詞向量以及構(gòu)建簡(jiǎn)單的文本分類模型。這些技能是自然語言處理領(lǐng)域的基石,為你進(jìn)一步探索更復(fù)雜的文本處理任務(wù)打下了堅(jiān)實(shí)的基礎(chǔ)。

希望這篇教程能激發(fā)你對(duì)文本處理的興趣。如果你在學(xué)習(xí)過程中有任何疑問或需要進(jìn)一步的指導(dǎo),歡迎在 W3Cschool 社區(qū)提問或訪問編程獅網(wǎng)站獲取更多資源。記住,實(shí)踐是掌握技能的最佳途徑,嘗試使用不同的數(shù)據(jù)集和模型架構(gòu),不斷提升自己的能力。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)