> 文章列表 > 第N1周:Pytorch文本分类入门

第N1周:Pytorch文本分类入门

第N1周:Pytorch文本分类入门

 一、前言

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊|接辅导、项目定制
● 难度:夯实基础⭐⭐
● 语言:Python3、Pytorch3
● 时间:4月16日-4月21日
🍺要求:
1、熟悉NLP的基础知识

二、NLP的基础知识

NLP是自然语言处理(Natural Language Processing)的缩写,它是人工智能领域的一个重要分支,旨在使计算机能够理解、分析、处理人类的自然语言。其目的是实现计算机与人类自然语言的有效交互。

具体来说,NLP包括以下几个方面的技术:

  1. 分词(Tokenization):将一段自然语言文本分割成一个个有意义的单元。

  2. 词性标注(Part-of-speech tagging):对每个单元标注其在句子中的词性。

  3. 命名实体识别(Named Entity Recognition):识别文本中的实体名称,如人名、地名、组织名等。

  4. 情感分析(Sentiment Analysis):判断文本的情感倾向,如积极、消极、中性等。

  5. 语义分析(Semantic Analysis):从文本中提取实际含义,理解文本背后的语义。

  6. 机器翻译(Machine Translation):将一种语言的文本自动地翻译成另一种语言。

三、pytorch中的embeddingbag与embedding

在PyTorch中,Embedding和EmbeddingBag都是用于文本数据中的单词(token)嵌入(embedding)的模块。

Embedding模块:

Embedding模块是用于将单词嵌入到固定长度的向量空间中的模块。它将每个单词映射到一个N维向量,其中N是嵌入向量的大小(即指定的数字)。这些嵌入向量通常初始化为随机值,并在训练过程中进行学习。在自然语言处理任务中,它在词嵌入下游任务中被广泛使用,如情感分析、命名实体识别、机器翻译等。

例如,假设我们有一个词典,包含10000个单词。如果我们将每个单词嵌入到64维的向量空间中,则Embedding模块将输入形状为(N, L)的整数张量,其中N是batch size,L是文本序列的长度。每个元素是在词典中的单词索引。输出形状为(N, L, 64)的张量,其中每个元素是对应单词的嵌入向量。例如:

import torchembedding = torch.nn.Embedding(10000, 64)
input_tensor = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
output_tensor = embedding(input_tensor)print(output_tensor.shape)out:
torch.Size([2, 4, 64])

Embedding模块的每个参数需要训练,同时具有大量的参数,这可能会导致模型的过度拟合。因此,当面对大量词汇表的情况时,Embedding模块可能会变得过于费时或过拟合。

EmbeddingBag模块:

EmbeddingBag是一个用于计算嵌入向量平均值的模块。与Embedding模块不同,EmbeddingBag可自定义单词的权重,使其可以针对特定的任务进行自适应训练。它将每个单词映射到一个N维向量中,并在文本序列中计算每个单词的权重。权重计算后,该模块从嵌入之后的张量中计算平均的嵌入向量。在文本分类任务中,它被广泛使用。

例如,假设我们使用相同的词典,包含10000个单词。如果我们将每个单词嵌入到64维的向量空间中,并获得一个具有25个单词的输入序列,则可以使用以下代码计算单词的嵌入向量平均值:

import torchembedding = torch.nn.EmbeddingBag(10000, 64, mode="mean")
input_tensor = torch.LongTensor([1, 2, 4, 5, 4, 3, 2, 9])
offsets = torch.LongTensor([0, 4])
output_tensor = embedding(input_tensor, offsets)print(output_tensor.shape)

其中,offsets是用于指定每个样本的偏移量的张量。在此示例中,我们有2个样本,每个样本包含25个单词。因此,offsets应为[0, 4], 含义是输入序列中前4个单词属于第一个样本,后21个单词属于第二个样本。输出的形状为(2, 64),其中2是batch size,64是嵌入向量的大小。

总的来说,Embedding和EmbeddingBag在PyTorch中是用于将单词嵌入到固定长度的向量空间中的模块,其中Embedding模块将每个单词映射到一个N维向量,而EmbeddingBag模块是计算嵌入向量平均值的模块,可以进行自定义权重的计算。

四、.build_vocab_from_iterator()函数详解

在PyTorch中,build_vocab_from_iterator()函数是用于构建文本数据集的词汇表的函数。它的作用是输出一个Vocab对象,包含了所有在文本数据集中出现的单词及其对应的索引。

build_vocab_from_iterator()函数的输入是一个迭代器,它可以遍历整个数据集并返回一个个单词(token)的列表。常见的文本数据集包括IMDB评论数据,新闻分类数据,语言模型数据等。

下面是一个示例,展示如何使用build_vocab_from_iterator()函数来构建文本数据集的词汇表:

from torchtext.vocab import Vocab
from collections import Counter# 定义一个迭代器,可以遍历整个文本数据集并返回一个个单词
def my_iterator():for line in my_text_data:for word in line.split():yield word# 使用Counter计数器来统计单词数量,创建一个Vocab对象
counter = Counter(my_iterator())
vocab = Vocab(counter)# 查看前10个单词及其出现次数
print(vocab.freqs.most_common(10))# 查看单词"hello"的索引
print(vocab.stoi['hello'])# 查看索引5对应的单词
print(vocab.itos[5])

在上面的代码中,我们首先定义了一个迭代器my_iterator(),它可以遍历整个文本数据集并返回一个个单词。这个迭代器可以根据不同的数据集进行定义。接着,我们使用Counter计数器来统计单词数量,然后将计数器传递给Vocab对象,并使用build_vocab_from_iterator()函数来创建一个Vocab对象。在创建的过程中,它会为每个单词分配一个唯一的索引。vocab.freqs属性返回了一个字典,它包含了所有单词及其出现次数的信息。我们还可以使用vocab.stoi属性返回一个字典,其中键是单词,值是单词对应的索引。使用vocab.itos属性返回一个列表,其中包含了单词索引和对应单词的映射关系。

总的来说,build_vocab_from_iterator()函数是一个用于构建文本数据集的词汇表的函数,可以从迭代器中遍历文本数据集并返回一个Vocab对象,包含了所有在文本数据集中出现的单词及其对应的索引。

五、.get_tokenizer()函数详解

在PyTorch中,.get_tokenizer()函数是一个用于从指定的Tokenizer名称创建Tokenizer对象的函数。它可用于对文本进行分词以便进行下一步的自然语言处理任务,如文本分类、情感分析等。

.get_tokenizer()函数的输入是一个字符串,指定要使用的Tokenizer名称。在PyTorch中,内置了多个Tokenizer,包括basic_englishbert-base-multilingual-cased等。

以下是使用.get_tokenizer()函数创建分词器的示例:

import torchtext# 使用basic_english分词器
tokenizer = torchtext.data.utils.get_tokenizer('basic_english')
tokens = tokenizer('This is a sentence.')
print(tokens)# 使用BERT分词器
tokenizer_bert = torchtext.data.utils.get_tokenizer('bert-base-multilingual-cased')
tokens_bert = tokenizer_bert('This is a sentence.')
print(tokens_bert)

在上述代码中,我们首先使用.get_tokenizer()函数并指定basic_english为分词器名称,创建一个分词器tokenizer。然后,我们使用tokenizer()函数对一句话进行分词并打印结果。输出的结果是一个单词列表。接着,我们使用另一个内置的分词器bert-base-multilingual-cased,并使用它对一句话进行分词。最后,我们打印出BERT分词器的输出结果,同样是一个单词列表。

总的来说,.get_tokenizer()函数是一个用于从指定的Tokenizer名称创建Tokenizer对象的函数。可以在自然语言处理任务中很方便地使用内置的Tokenizer,以便于对文本进行分词操作。在选择分词器时,应根据任务和语言的特点选择合适的分词器。