Avaliação de IA da anonimização de textos portugueses
Verifica que um modelo ou um contexto de anonimização não deixa passar dados pessoais portugueses (e-mail, telefone, IBAN, NIF, data de nascimento).
Recurso avaliado
Critérios
Cada dado pessoal deve ser substituído pela etiqueta correta; um texto sem dados pessoais deve ficar idêntico.
Casos de teste
| # | Entrada | Resposta esperada |
|---|---|---|
| 1 | Liguem ao Tiago Martins para o 936 987 654. | \[TELEFONE_1\] |
| 2 | O meu e-mail é s.rodrigues@sapo.pt, obrigado. | \[EMAIL_1\] |
| 3 | NIF: 123456789 | \[NIF_1\] |
| 4 | IBAN: PT50 0002 0123 1234 5678 9015 4 | \[IBAN_1\] |
| 5 | Nascida a 22/07/1988, Beatriz Sousa vive em Braga. | \[DATA_NASCIMENTO_1\] |
| 6 | A encomenda sai de Coimbra amanhã. | ^A encomenda sai de Coimbra amanhã\.$ |
Custo estimado
Tokens de entrada por chamada : ≈ 329
| Modelo | Por chamada | Por 1000 chamadas |
|---|---|---|
| Mistral Large · Mistral AI | € 0,00015 | € 0,14 |
| DeepSeek Flash · DeepSeek | € 0,00009 | € 0,09 |
| DeepSeek V4 Pro · DeepSeek | € 0,00038 | € 0,38 |
| GPT-6 Luna · OpenAI | € 0,00003 | € 0,03 |
| GPT-6 Sol · OpenAI | € 0,00058 | € 0,58 |
| Claude Sonnet 5.5 · Anthropic | € 0,00058 | € 0,58 |
| Claude Opus 5.5 · Anthropic | € 0,00116 | € 1,16 |
| Modelo open source alojado por si (Ollama, vLLM) | 0 € em custos de API (apenas o custo do servidor) | |
Apenas o custo de entrada, sem a resposta do modelo. Preços públicos padrão dos fornecedores (Mistral AI, DeepSeek, OpenAI, Anthropic) convertidos de USD para euros à taxa do BCE de 29 de setembro de 2026. Estimativa: 1 token ≈ 3,6 caracteres.
Comum às 3 regiões
Criado pelo autor, sem fonte externa.
Utilização comercial permitida · citar o autor · alterações permitidas.
Apenas texto ou dados: sem acesso a ficheiros, à rede ou a comandos.
Alojado em França (Scaleway, Paris). Sem transferência para fora da UE.
União Europeia · 5/5
Fictícios: nomes, moradas e números inventados, nenhuma pessoa real.
Sem dados de treino: nenhum resumo exigido.
Estados Unidos · 5/5
Fictícios: nomes, moradas e números inventados, nenhuma pessoa real.
Sem dados de treino: nenhuma documentação a publicar.
China · 5/5
Fictícios: nomes, moradas e números inventados, nenhuma pessoa real.
Sem dados de treino; os conteúdos gerados por IA difundidos na China devem ser identificados (2025).
Resumo indicativo em 30/09/2026, sem valor de certificação jurídica. Método e fontes →
Estatísticas
Gostos : 0 · Comentários : 0
Clique num contador para o mostrar ou ocultar, passe o rato sobre o gráfico para ver os detalhes. Uma visualização por visitante por dia, sem robôs; contagem iniciada a 30 de setembro de 2026.
- Identificador
- contextetech--eval-anonimizar-textos-rgpd-pt
- Tipo
- Avaliações
- Ficheiro
- eval-anonimizar-textos-rgpd-pt.eval.jsonl
- Formato
- JSON Lines (application/jsonl)
- Tamanho
- 501 bytes
- Codificação
- UTF-8
- Tokens estimados
- ≈ 138
- Idioma
- Português
- Licença
- CC BY 4.0
- Utilização comercial
- Permitida
- Dados pessoais
- Fictícios (inventados)
- Versão
- 1.0
- Publicado em
- 8 de outubro de 2026 às 19:47
- Atualizado em
- 8 de outubro de 2026 às 19:47
- Armazenamento
- na base de dados
- Utilizações
- 0
- Gostos
- 0
eval-anonimizar-textos-rgpd-pt.eval.jsonl
{"input":"Liguem ao Tiago Martins para o 936 987 654.","expected":"\\[TELEFONE_1\\]"}
{"input":"O meu e-mail é s.rodrigues@sapo.pt, obrigado.","expected":"\\[EMAIL_1\\]"}
{"input":"NIF: 123456789","expected":"\\[NIF_1\\]"}
{"input":"IBAN: PT50 0002 0123 1234 5678 9015 4","expected":"\\[IBAN_1\\]"}
{"input":"Nascida a 22/07/1988, Beatriz Sousa vive em Braga.","expected":"\\[DATA_NASCIMENTO_1\\]"}
{"input":"A encomenda sai de Coimbra amanhã.","expected":"^A encomenda sai de Coimbra amanhã\\.$"}
Executar a avaliação (Python)
import json, re
cases = [json.loads(l) for l in open("eval-anonimizar-textos-rgpd-pt.eval.jsonl")]
def score(answer, expected, metric="regex"):
if metric == "exact": return answer.strip() == expected.strip()
if metric == "regex": return re.search(expected, answer) is not None
return expected.lower() in answer.lower() # contains (llm-judge : faire noter par un modèle)
def run(ask): # ask(input) -> réponse du modèle
ok = sum(score(ask(c["input"]), c["expected"]) for c in cases)
print(f"{ok}/{len(cases)} réussis ({100 * ok // len(cases)} %), seuil 100 %")
Comunidade
Ainda não há comentários. Partilhe a sua experiência, vai ajudar a próxima pessoa.