import re
import json
import os
from collections import Counter
from sklearn.model_selection import train_test_split
==========================================
1. Funções de Limpeza (Receitas)
==========================================
def clean_text_light(text):
"""
Limpeza Leve: Mantém a riqueza do idioma (acentos e pontuação).
Ideal para modelos que precisam entender nuances gramaticais.
"""
# Remove espaços duplos e quebras de linha excessivas
text = re.sub(r'\s+', ' ', text)
# Garante espaço após pontuação se não houver
text = re.sub(r'([.,!?])(?=[^\s])', r'\1 ', text)
return text.strip()
def clean_text_heavy(text):
"""
Limpeza Agressiva: Remove tudo que não é letra ou espaço.
Útil para vocabulários muito restritos ou datasets ruidosos.
"""
text = text.lower()
# Remove números e pontuação (mantendo apenas letras e espaços)
text = re.sub(r'[^a-záàâãéèêíïóôõöúç\s]', '', text)
return re.sub(r'\s+', ' ', text).strip()
==========================================
2. Processamento do Dataset
==========================================
def prepare_transformer_data(input_file, sep_token=""):
with open(input_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
# Remover duplicatas mantendo a ordem
unique_lines = list(dict.fromkeys(lines))
cleaned_data = []
vocab_counter = Counter()
for line in unique_lines:
cleaned = clean_text_light(line)
if len(cleaned) > 5: # Filtra linhas muito curtas/irrelevantes
# Adiciona o delimitador de documento para o Transformer saber onde termina um texto
final_text = f"{cleaned} {sep_token}"
cleaned_data.append(final_text)
# Contagem básica para estatísticas
vocab_counter.update(final_text.split())
# Divisão Treino/Validação (Padrão MLOps)
train_data, val_data = train_test_split(cleaned_data, test_size=0.1, random_state=42)
# ==========================================
# 3. Geração de Artefatos (stats.json)
# ==========================================
stats = {
"total_documents": len(cleaned_data),
"unique_tokens_approx": len(vocab_counter),
"most_common_tokens": vocab_counter.most_common(10),
"train_size": len(train_data),
"val_size": len(val_data),
"sep_token": sep_token
}
with open('stats.json', 'w', encoding='utf-8') as f:
json.dump(stats, f, indent=4, ensure_ascii=False)
return train_data, val_data