def eh_sigla_ou_nome(palavra_original):
"""Verifica se a palavra é uma sigla (toda maiúscula) ou nome próprio (capitalizada)."""
return palavra_original.isupper() or palavra_original.istitle()
7. Tokenizar mantendo pontuação separada
def tokenizar_com_pontuacao(frase):
"""Divide a frase em palavras e pontuação como tokens separados."""
return re.findall(r'\w+|[^\w\s]', frase, re.UNICODE)
8. Corrigir espaços antes da pontuação (ex: 'palavra ,' → 'palavra,')
9. Função principal de tradução com preservação de pontuação e blocos
def traduzir(frase_original):
tokens = tokenizar_com_pontuacao(frase_original)
tokens_normalizados = [unidecode(t.lower()) if re.match(r'\w+', t) else t for t in tokens]
i = 0
traducao = []
while i < len(tokens):
token = tokens[i]
# Se for pontuação, apenas adiciona
if re.match(r'[^\w\s]', token):
traducao.append(token)
i += 1
continue
bloco_traduzido = False
for tamanho in [3, 2, 1]:
if i + tamanho <= len(tokens):
tokens_bloco = tokens[i:i + tamanho]
tokens_bloco_norm = tokens_normalizados[i:i + tamanho]
if all(re.match(r'\w+', b) for b in tokens_bloco):
frase_bloco = " ".join(tokens_bloco_norm)
if frase_bloco in dicionario_traducao:
traducao.append(dicionario_traducao[frase_bloco])
i += tamanho
bloco_traduzido = True
break
if not bloco_traduzido:
palavra = tokens_normalizados[i]
palavra_original = tokens[i]
if eh_sigla_ou_nome(palavra_original):
traducao.append(palavra_original)
else:
match = difflib.get_close_matches(palavra, pt_frases, n=1, cutoff=0.8)
if match:
termo_mais_proximo = match[0]
traducao.append(dicionario_traducao[termo_mais_proximo] + " (fuzzy)")
else:
traducao.append(palavra_original)
i += 1
return corrigir_espacos_pontuacao(" ".join(traducao))
10. Interface Gradio
gr.Interface(
fn=traduzir,
inputs=gr.Textbox(label="Digite uma frase em Português"),
outputs=gr.Textbox(label="Tradução em Bantu"),
title="Tradutor Inteligente PT → Bantu",
description="Traduz expressões como 'bom dia' e 'por favor'. Corrige palavras com erro, mantém nomes, siglas e pontuação."
).launch()