library(torch) library(transformers) library(dplyr) library(tibble)
dados <- tibble(
texto = c(
"Meu pai queria que eu ganhasse muito dinheiro", # Racional com relação a fins
"Sempre fiz isso porque minha família faz há gerações", # Tradicional
"Luto pelo que acredito, não importa o preço", # Racional com relação a valores
"Eu sigo meu coração, não importa o que digam" # Afetiva
),
categoria = c("racional com relação a fins", "tradicional", "racional com relação a valores", "afetiva")
)
# Converter rótulos para números
categorias <- unique(dados$categoria)
dados$categoria_id <- as.integer(factor(dados$categoria, levels = categorias))
modelo <- hf_load_model("distilbert-base-uncased")
tokenizer <- hf_load_tokenizer("distilbert-base-uncased")
#Tokenização dos Dados
tokens <- tokenizer(dados$texto, padding = TRUE, truncation = TRUE, return_tensors = "pt")
treinar_modelo <- function(modelo, tokens, labels, epochs = 3) {
optimizer <- optim_adamw(modelo$parameters(), lr = 5e-5)
loss_fn <- nn_cross_entropy_loss()
for (epoch in 1:epochs) {
optimizer$zero_grad()
# Forward pass
outputs <- modelo(tokens$input_ids)
loss <- loss_fn(outputs$logits, labels)
# Backward pass
loss$backward()
optimizer$step()
cat("Época", epoch, "- Loss:", loss$item(), "\n")
}
}
# Executar treinamento
labels <- torch_tensor(dados$categoria_id, dtype = torch_long())
treinar_modelo(modelo, tokens, labels)
#Fazendo Previsões
prever_categoria <- function(texto) {
tokens <- tokenizer(texto, return_tensors = "pt", padding = TRUE, truncation = TRUE)
output <- modelo(tokens$input_ids)
predicted_id <- output$logits$argmax(dim = 2)$item() + 1
return(categorias[predicted_id])
}
# Testando o modelo
frase_teste <- "Faço isso porque meus pais ensinaram assim"
prever_categoria(frase_teste)