欢迎访问宙启技术站
智能推送

使用torchtext进行中文文本分类

发布时间:2023-12-31 22:32:25

Torchtext是一个用于处理自然语言数据的Python库。它提供了用于加载、处理和预处理文本数据的工具,尤其适用于构建神经网络模型。

在进行中文文本分类时,Torchtext提供了方便的方法来处理中文文本数据集。下面是一个使用Torchtext处理中文文本分类的示例:

首先安装所需的依赖项:

!pip install torchtext jieba

接下来,我们将使用在Torchtext库中自带的一个中文数据集THUCNews进行演示。这个数据集包含了多个新闻类别的新闻文章。我们将对这些文章进行分类。

import torch
import torchtext
import jieba

# 加载停用词
stopwords = []

with open('stopwords.txt', 'r', encoding='utf-8') as f:
    for line in f:
        stopwords.append(line.strip())

# 定义分词函数
def tokenizer(text):
    seg_list = jieba.cut(text)
    seg_list = [word for word in seg_list if word not in stopwords]
    return seg_list

# 定义Field
TEXT = torchtext.legacy.data.Field(sequential=True, tokenize=tokenizer, lower=True)
LABEL = torchtext.legacy.data.Field(sequential=False, use_vocab=False)

# 加载数据集,拆分为训练集和测试集
train_data, test_data = torchtext.legacy.datasets.TabularDataset.splits(
    path='.', train='THUCNews/train.csv', test='THUCNews/test.csv', format='csv', skip_header=True,
    fields=[('text', TEXT), ('label', LABEL)])

# 构建词表
TEXT.build_vocab(train_data, max_size=10000)

# 创建迭代器
train_iterator, test_iterator = torchtext.legacy.data.BucketIterator.splits(
    (train_data, test_data), batch_size=32, sort_key=lambda x: len(x.text), shuffle=True)

# 构建模型
class TextClassificationModel(torch.nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, output_dim):
        super().__init__()
        self.embedding = torch.nn.Embedding(vocab_size, embedding_dim)
        self.rnn = torch.nn.LSTM(embedding_dim, hidden_dim)
        self.fc = torch.nn.Linear(hidden_dim, output_dim)
        
    def forward(self, text):
        embedded = self.embedding(text)
        output, _ = self.rnn(embedded)
        output = self.fc(output[-1, :, :])
        return output

# 初始化模型
vocab_size = len(TEXT.vocab)
embedding_dim = 100
hidden_dim = 256
output_dim = 10

model = TextClassificationModel(vocab_size, embedding_dim, hidden_dim, output_dim)

# 定义优化器和损失函数
optimizer = torch.optim.Adam(model.parameters())
criterion = torch.nn.CrossEntropyLoss()

# 训练模型
for epoch in range(10):
    for batch in train_iterator:
        optimizer.zero_grad()
        text = batch.text
        label = batch.label
        output = model(text)
        loss = criterion(output, label)
        loss.backward()
        optimizer.step()

在上面的代码中,我们首先加载停用词表,这是一份包含常见中文停用词的文件。然后定义了一个分词函数,该函数使用jieba库对文本进行分词,并去除停用词。接下来定义了Torchtext的Field对象,它指定了文本的处理方式。我们使用sequential=True表示文本是一个由词语组成的序列,并传入tokenizer参数指定我们自定义的分词函数。我们还定义了另一个Field对象来处理标签,但是在中文文本分类中,往往不需要处理标签。

然后,我们使用TabularDataset类加载训练集和测试集的数据,并使用build_vocab方法构建词表。最后使用BucketIterator创建训练和测试的迭代器。

接下来,我们定义了一个简单的文本分类模型。它首先使用一个embedding层将词语映射为嵌入向量,然后将嵌入向量输入到一个LSTM网络中,最后使用一个全连接层将LSTM的输出映射到分类数上。我们使用交叉熵损失作为损失函数,并使用Adam优化器进行优化。

最后,我们使用训练集迭代器对模型进行训练。我们每个epoch都遍历训练集的所有batch,并计算损失和梯度,然后更新模型参数。

这只是一个简单的中文文本分类示例,你可以根据自己的任务需求和数据集进行适当调整和修改。