PARA.AI / core /normalizer.py
Carlex22's picture
ParaAIV3.6
e6027de
##PARA.AI/core/normalizer.py
"""
Normalizer V13.6 - Fase 1 (Python puro, sem LLM)
Extrai metadados e cria estrutura base
"""
import re
import hashlib
from datetime import datetime
from typing import Dict, Any
class Normalizer:
"""Normaliza input e cria estrutura base V13.6"""
def __init__(self):
self.version = "v13.6"
def normalize(self, raw_input: Dict[str, Any]) -> Dict[str, Any]:
"""
Normaliza input bruto e retorna estrutura base
INPUT: {"inteiro_teor": "...", "ementa": "...", ...}
OUTPUT: Estrutura V13.6 com campos base preenchidos
"""
# Extrair campos básicos
inteiro_teor = raw_input.get("inteiro_teor", raw_input.get("integra", ""))
ementa = raw_input.get("ementa", "")
# Criar estrutura base
normalized = {
"protocolo_versao": self.version,
"id_manifestacao": raw_input.get("acordaoid", 0),
"hashes": self._generate_hashes(raw_input),
"metadados": self._extract_metadata(raw_input),
"classificacao_tematica": None, # Fase 2.1
"RELATORIO": None, # Fase 3.1
"FUNDAMENTACAO": None, # Fase 3.2
"DECISAO": None, # Fase 3.3
"analise_arquivista": None, # Fase 4
"secoes_originais": {
"ementa": ementa,
"inteiro_teor_bruto": inteiro_teor
},
"metadados_processamento": {
"protocolo_origem": self.version,
"data_processamento": datetime.utcnow().isoformat(),
"versao_preprocessador": "v13.6.0"
},
"campos_futuros": {
"embeddings_metadata": None
}
}
return normalized
def _generate_hashes(self, raw: Dict[str, Any]) -> Dict[str, str]:
"""Gera hashes SHA-256 para deduplicação"""
processo = raw.get("processo", "")
ementa = raw.get("ementa", "")
inteiro_teor = raw.get("inteiro_teor", raw.get("integra", ""))
return {
"hash_numero_processo": hashlib.sha256(processo.encode()).hexdigest() if processo else None,
"hash_ementa": hashlib.sha256(ementa.encode()).hexdigest() if ementa else None,
"hash_inteiro_teor": hashlib.sha256(inteiro_teor.encode()).hexdigest() if inteiro_teor else None
}
def _extract_metadata(self, raw: Dict[str, Any]) -> Dict[str, Any]:
"""Extrai metadados básicos"""
return {
"tribunal": "TJPR",
"orgao_julgador": raw.get("orgaojulgador", ""),
"classe_processual": raw.get("classe_processual", ""),
"numeros_processo": [raw.get("processo", "")],
"relator": raw.get("relator", ""),
"data_julgamento": raw.get("datadojulgamento", ""),
"data_publicacao": raw.get("fontedatadapublicacao", ""),
"url_original": raw.get("urldocumento", "")
}