共计 4511 个字符,预计需要花费 12 分钟才能阅读完成。
TorchText 是 PyTorch 的一个自然语言解决库,提供了一些不便易用的工具来帮忙咱们预处理和解决文本数据。它能够用于构建文本分类、机器翻译、情感剖析等各种自然语言解决模型。
应用 TorchText 能够简化文本数据的处理过程,防止反复编写代码和手动实现数据预处理过程,让咱们更加专一于模型的设计与调试。
上面将介绍 TorchText 中的几个外围概念和常见操作,并给出相应的案例阐明。
Field
Field 是 TorchText 中最根本的数据类型之一,对应着一种数据类型在文本中的表现形式。比方,咱们能够应用 Field 来定义一个文本序列数据类型,用来示意样本中的文本数据。
from torchtext.legacy.data import Field
定义一个 Field 对象来示意文本序列数据类型
text_field = Field(sequential=True, tokenize=’basic_english’)
下面的代码中,咱们首先从 TorchText 库中导入了 Field 类,而后应用 Field() 函数创立了一个名为 text_field 的 Field 对象,它具备以下两个属性:
sequential=True:示意该 Field 对象对应的是一个序列化的数据类型,例如文本序列。
tokenize=’basic_english’:示意应用根本的英文分词器对文本进行分词解决。
Dataset
Dataset 是 TorchText 中示意数据集的类,它由多个 Example 对象组成,每个 Example 蕴含一个或多个 Field 类型的数据。咱们能够应用 TabularDataset 类来创立一个 Dataset。
from torchtext.legacy.data import TabularDataset
定义一个 TabularDataset 对象来示意数据集
data = TabularDataset(
path='data.csv', format='csv',
fields=[('text', text_field), ('label', label_field)]
)
下面的代码中,咱们首先从 TorchText 库中导入了 TabularDataset 类,而后应用 TabularDataset() 函数创立一个名为 data 的 TabularDataset 对象,它蕴含以下三个参数:
path=’data.csv’:示意数据集所在的文件门路。
format=’csv’:示意数据集的格局,这里采纳 CSV 格局。
fields=[(‘text’, text_field), (‘label’, label_field)]:示意数据集中每一条样本所蕴含的字段及其对应的 Field 对象。例如,(‘text’, text_field) 示意该样本中的文本数据对应着 text_field 所定义的文本序列数据类型;(‘label’, label_field) 示意该样本中的标签数据对应着 label_field 所定义的标签数据类型。
Vocabulary
Vocabulary 是 TorchText 中示意词汇表的类,它将文本数据中呈现过的所有单词映射到一个惟一的整数值。咱们能够应用 build_vocab 函数来构建一个 Vocabulary 对象。
构建词汇表
text_field.build_vocab(data)
下面的代码中,咱们应用 build_vocab() 函数来创立了一个 text_field 所对应的 Vocabulary 对象。这个函数会遍历整个数据集,并将每个单词都增加到词汇表中。通过这个词汇表,咱们能够将文本数据中的每个单词映射到一个惟一的整数值。
Iterator
Iterator 是 TorchText 中用于分批次训练模型的类,它能够将数据集依照指定的 batch_size 进行分批次解决,并返回一个迭代器对象。咱们能够应用 BucketIterator 类来创立一个 Iterator。
from torchtext.legacy.data import BucketIterator
创立 Iterator 对象
train_iterator = BucketIterator(
train_data, batch_size=32,
sort_within_batch=True,
sort_key=lambda x: len(x.text)
下面的代码中,咱们首先从 TorchText 库中导入了 BucketIterator
类,而后应用 BucketIterator()
函数创立了一个名为 train_iterator
的 Iterator 对象,它蕴含以下几个参数:
train_data
:示意要解决的数据集。batch_size=32
:示意每个 batch 蕴含的样本数。sort_within_batch=True
:示意在同一个 batch 中依照文本长度从新排序。sort_key=lambda x: len(x.text)
:示意依照文本序列的长度进行排序。
示例
上面给出一个简略的示例,介绍如何应用 TorchText 进行文本分类工作。假如咱们有一个蕴含电影评论和情感标签的数据集,咱们的指标是依据评论内容预测情感标签。数据集的格局如下:
text,label “This movie is great!”,positive “I don’t like this movie.”,negative …
首先导入必要的库并定义 Field 对象:
import torch
from torchtext.legacy.data import Field, TabularDataset, BucketIterator
定义 Field 对象
TEXT = Field(sequential=True, tokenize=’spacy’, lower=True)
LABEL = Field(sequential=False, use_vocab=False)
加载数据集
train_data, test_data = TabularDataset.splits(
path='data', train='train.csv', test='test.csv',
format='csv', fields=[('text', TEXT), ('label', LABEL)]
)
构建词汇表
TEXT.build_vocab(train_data)
创立 Iterator 对象
train_iterator, test_iterator = BucketIterator.splits(
(train_data, test_data), batch_size=32,
sort_within_batch=True, sort_key=lambda x: len(x.text)
)
在下面的代码中,咱们首先定义了 TEXT 和 LABEL 两个 Field 对象,用来示意文本序列和标签数据。接着应用 TabularDataset.splits() 函数加载数据集,并将其划分为训练集和测试集。而后构建了词汇表,并应用 BucketIterator.splits() 函数创立了训练集和测试集的迭代器对象。
接下来定义模型并进行训练:
import torch.nn as nn
import torch.optim as optim
class TextClassifier(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.rnn = nn.LSTM(embedding_dim, hidden_dim, bidirectional=True, num_layers=2)
self.fc = nn.Linear(hidden_dim*2, output_dim)
self.dropout = nn.Dropout(0.5)
def forward(self, text):
embedded = self.dropout(self.embedding(text))
outputs, _ = self.rnn(embedded)
representation = torch.cat([outputs[-1,:,:hidden_dim], outputs[0,:,hidden_dim:]], dim=-1)
return self.fc(representation)
model = TextClassifier(len(TEXT.vocab), 100, 256, 2)
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss()
model.train()
for epoch in range(10):
for batch in train_iterator:
optimizer.zero_grad()
text, label = batch.text, batch.label
output = model(text)
loss = criterion(output, label)
loss.backward()
optimizer.step()
model.eval()
with torch.no_grad():
correct = 0
total = 0
for batch in test_iterator:
text, label = batch.text, batch.label
output = model(text)
predictions = torch.argmax(output, dim=1)
correct += (predictions == label).sum().item()
total += len(label)
accuracy = correct / total
print(f”Test accuracy: {accuracy}”)
在下面的代码中,咱们定义了一个名为 TextClassifier 的模型类,并应用 LSTM 层对文本序列进行编码。而后应用 Adam 优化器和穿插熵损失函数进行训练。最初在测试集上计算模型准确率。
以上就是 TorchText 库的介绍及示例。通过 TorchText,
咱们能够更加不便地进行文本数据的解决和建模,简化代码量,提高效率。同时 TorchText 也提供了一些其余的性能,例如反对多语言分词器、自定义数据集格局等,使其具备更宽泛的适用性。
除了上述介绍的概念和操作外,TorchText 还蕴含了一些其余性能和工具,例如:
torchtext.datasets 模块:提供了一些规范的文本数据集,例如 IMDB 数据集、AG News 数据集等。
torchtext.vocab 模块:提供了一些罕用的词汇表,例如 GLoVe 词向量等。
torchtext.utils 模块:提供了一些实用工具,例如打印迭代器中的数据等。
总的来说,TorchText 是一个十分实用的自然语言解决库,它能够帮忙咱们更加高效地构建各种文本处理模型。
本文由 mdnice 多平台公布