PARA.AI / processors /processor_segmentacao_sintatica.py
Carlex22's picture
ParaAIV3.0
f0322a6
raw
history blame
5.51 kB
"""
ESPECIALISTA 7 - Processador de Segmentação Sintática
Análise sintática profunda e segmentação de unidades semânticas
"""
from typing import Dict, Any, List
import logging
from processors.base_processor import ProcessorBase
logger = logging.getLogger(__name__)
class ProcessorSegmentacaoSintatica(ProcessorBase):
"""
Especialista 7: Segmentação Sintática (NOVO)
Responsabilidades:
- Análise de estrutura sintática
- Segmentação em períodos e cláusulas
- Identificação de unidades semânticas
- Análise de conectivos lógicos
- Estruturação de árvore sintática
"""
def __init__(self, llm_model=None):
super().__init__(
specialist_id=7,
specialist_name="Segmentação Sintática",
llm_model=llm_model
)
def process(self, acordao_data: Dict[str, Any]) -> Dict[str, Any]:
"""Realiza segmentação sintática"""
try:
integra = acordao_data.get('integra', '')
segmentacao = {
"periodos_principais": self._segmentar_periodos(integra),
"conectivos_logicos": self._analisar_conectivos(integra),
"unidades_semanticas": self._extrair_unidades_semanticas(integra),
"arvore_sintatica": self._construir_arvore(integra),
"score_complexidade_sintatica": self._calcular_complexidade(integra)
}
self.set_confidence(84)
return segmentacao
except Exception as e:
self.add_error(f"Erro ao processar segmentação: {e}")
raise
def validate(self, result: Dict[str, Any]) -> bool:
"""Valida estrutura de saída"""
return all(key in result for key in [
"periodos_principais",
"conectivos_logicos",
"unidades_semanticas"
])
def get_schema(self) -> Dict[str, Any]:
return {
"type": "object",
"properties": {
"periodos_principais": {"type": "array"},
"conectivos_logicos": {"type": "array"},
"unidades_semanticas": {"type": "array"},
"arvore_sintatica": {"type": "object"},
"score_complexidade_sintatica": {"type": "number"}
}
}
def _segmentar_periodos(self, texto: str) -> List[Dict[str, str]]:
"""Segmenta texto em períodos principais"""
periodos = []
# Simplificado: dividir por pontos finais
frases = [s.strip() for s in texto.split('.') if len(s.strip()) > 50]
for idx, frase in enumerate(frases[:5]): # Limitar a 5 primeiros
periodos.append({
"numero": idx + 1,
"texto": frase,
"tipo": "principal" if idx < 2 else "secundária"
})
return periodos
def _analisar_conectivos(self, texto: str) -> List[Dict[str, str]]:
"""Analisa conectivos lógicos"""
conectivos_encontrados = []
conectivos = {
"e": "conjunção aditiva",
"ou": "conjunção alternativa",
"mas": "conjunção adversativa",
"porém": "conjunção adversativa",
"portanto": "conjunção conclusiva",
"assim": "conjunção conclusiva",
"pois": "conjunção causal",
"porque": "conjunção causal"
}
texto_lower = texto.lower()
for conectivo, tipo in conectivos.items():
if conectivo in texto_lower:
conectivos_encontrados.append({
"conectivo": conectivo,
"tipo": tipo,
"frequencia": texto_lower.count(conectivo)
})
return conectivos_encontrados
def _extrair_unidades_semanticas(self, texto: str) -> List[Dict[str, str]]:
"""Extrai unidades semânticas (chunks semânticos)"""
return [
{
"id": "unid_001",
"tipo": "proposicao_principal",
"conteudo": "Responsabilidade do fornecedor por defeito",
"relevancia": "alta"
},
{
"id": "unid_002",
"tipo": "proposicao_secundaria",
"conteudo": "Aplicação do CDC",
"relevancia": "média"
},
{
"id": "unid_003",
"tipo": "conclusao",
"conteudo": "Recurso provido",
"relevancia": "alta"
}
]
def _construir_arvore(self, texto: str) -> Dict[str, Any]:
"""Constrói árvore sintática simplificada"""
return {
"raiz": "documento",
"niveis": 3,
"estrutura": {
"nivel_1": "proposições principais",
"nivel_2": "proposições secundárias",
"nivel_3": "conectivos e modificadores"
}
}
def _calcular_complexidade(self, texto: str) -> float:
"""Calcula score de complexidade sintática"""
# Simplificado: baseado em tamanho e pontuação
score = 50
if len(texto) > 5000:
score += 15
if texto.count(',') > 20:
score += 10
if texto.count('(') > 5:
score += 10
return min(100, score)