5 Modelos Avançados de Vetorização
Neste capítulo, vamos explorar modelos avançados de vetorização de texto, que vão além das técnicas tradicionais como Bag of Words e TF-IDF. Vamos discutir embeddings contextuais, como o BERT e o GPT, e a aplicação de redução de dimensionalidade usando técnicas como PCA e t-SNE. A seguir, forneceremos exemplos práticos em Python para cada um desses métodos.
5.1 Embeddings Contextuais
Embeddings contextuais são vetores que capturam o significado de uma palavra com base no contexto em que ela aparece. Diferente de embeddings como Word2Vec e GloVe, que geram uma única representação para cada palavra, modelos como BERT (Bidirectional Encoder Representations from Transformers) e GPT (Generative Pretrained Transformer) produzem diferentes embeddings para a mesma palavra, dependendo do seu contexto.
5.1.1 Exemplo em Python: Usando BERT para Vetorização
Código Python
from transformers import BertTokenizer, BertModel
import torch
# Carregando o tokenizer e o modelo BERT
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# Exemplo de texto
texto = "O gato está sentado no tapete."
# Tokenização do texto e conversão para tensores
inputs = tokenizer(texto, return_tensors="pt")
# Obtenção dos embeddings a partir do modelo BERT
with torch.no_grad():
outputs = model(**inputs)
# Extraindo os embeddings da última camada oculta
embeddings = outputs.last_hidden_state
print("Embeddings para cada token:", embeddings)Saída do Console
Embeddings para cada token: tensor([[[-8.4815e-01, -3.2018e-01, -6.1327e-02, ..., -3.2507e-01,
7.6626e-02, 9.1921e-01],
[-1.1552e+00, -8.0612e-02, -3.9960e-01, ..., -1.1649e-01,
9.8960e-02, 1.0148e+00],
...,
[ 6.6603e-01, -7.9354e-02, 1.1458e-02, ..., -4.0039e-02,
-7.0081e-01, 2.2797e-02]]])Este exemplo mostra como usar o BERT para gerar embeddings contextuais. O modelo BERT é capaz de gerar um vetor de embeddings para cada token no texto, considerando o contexto de toda a frase.
5.2 Análise de Sentimento com Embeddings
Modelos de embeddings contextuais, como o BERT, podem ser utilizados em tarefas de análise de sentimento, fornecendo representações mais ricas e precisas das palavras. A seguir, aplicamos BERT em uma tarefa de classificação de sentimento.
5.2.1 Exemplo em Python: Classificação de Sentimento com BERT
Código Python
from transformers import BertTokenizer, BertForSequenceClassification
from torch.nn.functional import softmax
# Carregando o tokenizer e o modelo BERT para classificação de sequência
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
# Exemplo de texto
texto = "Eu adoro gatos, eles são fofos"
# Tokenização do texto e conversão para tensores
inputs = tokenizer(texto, return_tensors='pt')
# Fazendo a previsão
with torch.no_grad():
outputs = model(**inputs)
# Aplicando softmax para obter as probabilidades das classes
probabilidades = softmax(outputs.logits, dim=1)
print("Probabilidade de sentimento positivo:", probabilidades[0][1].item())Saída do Console
Probabilidade de sentimento positivo: 0.6633508801460266Este código ilustra como utilizar o BERT para classificar o sentimento de um texto. Aqui, o modelo é capaz de prever a probabilidade de um sentimento positivo ou negativo para a frase fornecida.
5.3 Redução de Dimensionalidade
Vetores de alta dimensionalidade podem ser difíceis de manipular e visualizar. Técnicas como Análise de Componentes Principais (PCA) e t-SNE (t-Distributed Stochastic Neighbor Embedding) são comumente usadas para reduzir a dimensionalidade dos dados de forma a manter as informações mais importantes.
5.3.1 Exemplo em Python: Redução de Dimensionalidade com PCA
Código Python
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
from transformers import BertTokenizer, BertModel
import torch
# Carregando o tokenizer e o modelo BERT
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# Exemplo de texto
texto = "Eu adoro gatos, eles são fofos"
# Tokenização do texto e conversão para tensores
inputs = tokenizer(texto, return_tensors="pt")
# Obtenção dos embeddings a partir do modelo BERT
with torch.no_grad():
outputs = model(**inputs)
# Extraindo os embeddings da última camada oculta
embeddings = outputs.last_hidden_state
# Exemplo de vetores de alta dimensionalidade (usaremos os embeddings do BERT)
vetores = embeddings.squeeze().numpy() # Convertendo de tensor para numpy array
# Aplicando PCA para reduzir para 2 dimensões
pca = PCA(n_components=2)
vetores_reduzidos = pca.fit_transform(vetores)
# Plotando os vetores em 2D
plt.scatter(vetores_reduzidos[:, 0], vetores_reduzidos[:, 1])
plt.title("Vetores de palavras reduzidos para 2D usando PCA")
plt.show()
Neste exemplo, utilizamos PCA para reduzir os embeddings gerados pelo BERT para duas dimensões, facilitando a visualização.
5.3.2 Exemplo em Python: Redução de Dimensionalidade com t-SNE
Código Python
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from transformers import BertTokenizer, BertModel
import torch
# Carregando o tokenizer e o modelo BERT
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
# Exemplo de texto
texto = "Eu adoro gatos, eles são fofos"
# Tokenização do texto e conversão para tensores
inputs = tokenizer(texto, return_tensors="pt")
# Obtenção dos embeddings a partir do modelo BERT
with torch.no_grad():
outputs = model(**inputs)
# Extraindo os embeddings da última camada oculta
embeddings = outputs.last_hidden_state
vetores = embeddings.squeeze().numpy() # Convertendo de tensor para numpy array
# Aplicando t-SNE para reduzir para 2 dimensões
tsne = TSNE(n_components=2, perplexity=2)
vetores_reduzidos_tsne = tsne.fit_transform(vetores)
# Plotando os vetores em 2D
plt.scatter(vetores_reduzidos_tsne[:, 0], vetores_reduzidos_tsne[:, 1])
plt.title("Vetores de palavras reduzidos para 2D usando t-SNE")
plt.show()
Aqui, usamos t-SNE para reduzir os embeddings para duas dimensões. O t-SNE é especialmente útil para a visualização de dados em espaços de alta dimensionalidade.
Em resumo, exploramos modelos avançados de vetorização de texto, incluindo embeddings contextuais com BERT e GPT, e técnicas de redução de dimensionalidade como PCA e t-SNE. Esses métodos fornecem ferramentas poderosas para capturar e visualizar informações complexas em dados textuais.
Exercício
Versão on-line destes exercícios
https://forms.gle/hh4BgCZVhJLMyFiy6
Qual é a principal vantagem dos embeddings contextuais, como BERT, em comparação com embeddings tradicionais Word2Vec?
Embeddings contextuais capturam o significado das palavras com base em seu contexto específico.
Embeddings contextuais são sempre mais rápidos de treinar.
Embeddings contextuais geram representações esparsas das palavras.
Embeddings contextuais são menos precisos do que os embeddings tradicionais.
O que a técnica de PCA (Análise de Componentes Principais) realiza em dados de alta dimensionalidade?
Aumenta o número de dimensões nos dados.
Reduz a dimensionalidade dos dados mantendo a maior variabilidade possível.
Gera novas características que não são correlacionadas.
Elimina completamente a variabilidade dos dados.
Qual é a função principal da técnica t-SNE?
Agrupar dados de alta dimensionalidade.
Visualizar dados de alta dimensionalidade em espaços de menor dimensão.
Normalizar dados textuais.
Criar novas features a partir dos dados originais.
Por que técnicas de redução de dimensionalidade, como PCA, são úteis em vetorização de texto?
Elas aumentam a precisão dos modelos de aprendizado de máquina.
Elas eliminam a necessidade de embeddings contextuais.
Elas reduzem a quantidade de dados de entrada para tornar o processamento mais eficiente e visualizável.
Elas criam novas features para melhorar o desempenho de modelos de deep learning.
Em qual cenário a redução de dimensionalidade é particularmente útil?
Quando se deseja aumentar a complexidade do modelo.
Quando os dados têm poucas features e baixa variabilidade.
Quando os dados têm muitas dimensões e se deseja melhorar a visualização ou performance do modelo.
Quando se deseja eliminar o ruído dos dados, independentemente da dimensionalidade.