- Tokenização: O Vocabulário Digital
from transformers import BertTokenizer
import torch
1. Carregar o Tokenizador pré-treinado (Multilingual para suportar Português)
tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased')
text = "A inteligência artificial em Goiás está crescendo."
2. Tokenização e Codificação
inputs = tokenizer(text, add_special_tokens=True, padding='max_length', max_length=15, truncation=True)
ids = inputs['input_ids']
tokens = tokenizer.convert_ids_to_tokens(ids)
print(f"Tokens: {tokens}")
print(f"IDs: {ids}")
3. Decodificação (Validação de consistência)
decoded_text = tokenizer.decode(ids)
print(f"Texto Decodificado: {decoded_text}")
Analisando Special Tokens
print(f"ID do [CLS] (Início): {tokenizer.cls_token_id}")
print(f"ID do [SEP] (Separação): {tokenizer.sep_token_id}")
print(f"ID do [PAD] (Preenchimento): {tokenizer.pad_token_id}")
- Codificação Posicional (Positional Encoding)
Usando as funções de seno e cosseno para criar um "carimbo de tempo" único para cada posição
$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$
import numpy as np
import matplotlib.pyplot as plt
def get_positional_encoding(max_seq_len, d_model):
"""
Implementação da Codificação Posicional Senoidal.
"""
encoding = np.zeros((max_seq_len, d_model))
for pos in range(max_seq_len):
for i in range(0, d_model, 2):
# Frequências diferentes para cada dimensão
denom = np.power(10000, (2 * i) / d_model)
encoding[pos, i] = np.sin(pos / denom)
encoding[pos, i + 1] = np.cos(pos / denom)
return encoding
Configurações: Sequência de 50 tokens, Modelo com 128 dimensões
pos_enc = get_positional_encoding(50, 128)
Visualização
plt.figure(figsize=(10, 8))
plt.pcolormesh(pos_enc, cmap='RdBu')
plt.xlabel('Dimensão do Embedding')
plt.ylabel('Posição do Token')
plt.colorbar(label='Valor de Ativação')
plt.title("Mapa de Calor: Codificação Posicional")
plt.show()