Ferramentas · No ar (e API)

Sem Ódio

Essa fala é livre de preconceito? A API responde.

API grátis que diz se uma fala em português é livre de preconceito e ódio, o tipo identificado e a certeza. Com testador ao vivo e sem guardar o texto.

Sobre o projeto

O que é Sem Ódio

O Sem Ódio é uma API que recebe uma fala em português do Brasil e responde, em JSON, se ela está livre de preconceito e de discurso de ódio (o campo free, true ou false), qual tipo foi identificado (racismo, LGBTfobia, misoginia, xenofobia, intolerância religiosa, capacitismo, gordofobia, etarismo, classismo, intolerância política, ameaça ou ofensa) e quanta certeza o motor tem, em fração e em porcentagem. Também devolve os trechos que pesaram, com a posição no texto, para você destacar no seu app.

Na página da ferramenta você escreve (ou escolhe um exemplo) e vê a resposta da API de verdade, ao vivo, junto do pedido pronto em cURL, JavaScript e Python. Cada trecho vem com o motivo (generalização, comparação desumana, ameaça, termo ofensivo…), e a nota de corte é ajustável: quem modera um chat pode vigiar mais, quem revisa texto longo pode tolerar mais.

O motor não é um modelo de aprendizado: é um léxico de palavras e expressões com regras de contexto escritas à mão. Uma palavra de grupo ("mulheres", "gays") sozinha não pesa; pesa quando vem com uma frase depreciativa. Negação ("mulheres não são burras"), citação ("dizem que…") e denúncia ("é racismo") derrubam o peso, e palavras de dupla leitura (macaco, veado) só pesam quando dirigidas a alguém. Escritas disfarçadas ("v1ado", "p*ta", letras separadas) também são lidas.

Ele erra, e a página diz isso sem rodeio: não entende ironia, humor nem códigos de grupo, e só conhece o que está no léxico. Use como primeira triagem, não como juiz. O texto enviado é analisado na memória e descartado: não é guardado, não entra no log de acesso e não alimenta nenhum contador.

Recursos

O que o Sem Ódio faz

free, tipo e certeza

Cada resposta traz free (true ou false), o tipo principal, a certeza do veredito (confidence e percent), a nota (score) e todos os tipos com nota a partir de 0,2.

Os trechos que pesaram

matches lista cada trecho com início, fim, o texto, o tipo e o motivo (termo ofensivo, generalização, comparação desumana, ameaça, expressão conhecida), para destacar no seu app.

12 tipos identificados

Racismo, LGBTfobia, misoginia, xenofobia, intolerância religiosa, capacitismo, gordofobia, etarismo, classismo, intolerância política, ameaça e ofensa. GET /categories devolve a lista com a descrição de cada um.

Nota de corte ajustável

O threshold, de 0.05 a 0.95 (padrão 0.5), decide a partir de que nota free vira false. Suba para tolerar mais, baixe para vigiar mais.

Testador ao vivo

Escreva e veja a resposta da API em tempo real, com o pedido pronto para copiar em cURL, JavaScript e Python e os trechos destacados no texto.

Lote

POST /batch analisa até 20 falas de uma vez, na mesma ordem em que chegaram.

O texto não é guardado

A fala existe só na memória durante o pedido. Não vai para o banco, nem para o log de acesso, nem para os números abertos.

API aberta

Sem chave e sem cadastro, com CORS liberado e OpenAPI 3.1. Limite por IP: 120 pontos por minuto e 2000 por hora, com 1 ponto a cada 500 caracteres.

Números abertos

A tela mostra textos analisados, sinalizados, o tipo mais frequente e pedidos barrados. São só contagens de todo o período: nunca uma fala.

Tecnologias

Por dentro do Sem Ódio

Léxico mais regras, sem modelo

Palavras e expressões de grupos, termos ofensivos, xingamentos e predicados depreciativos ficam num arquivo só de dados, escritos numa mini-notação que gera as flexões (negro, negra, negros, negras). O motor é uma função pura do texto: roda em microssegundos, sem rede e sem dependência nova.

Regras de contexto

Grupo mais predicado ("são burras"), ódio declarado ("odeio gays"), violência ("tinham que morrer"), exclusão ("não deviam votar") e estereótipo ("só sabem roubar"). Negação, citação, denúncia e "não sou racista, mas…" mudam o peso; palavras de dupla leitura só pesam quando dirigidas a alguém.

Texto escrito do jeito que as pessoas escrevem

A comparação ignora acentos e maiúsculas, letras repetidas ("viaaado"), números e símbolos no lugar de letras ("v1ado", "put@"), asterisco como curinga ("p*ta") e letras separadas ("m a c a c o"). As posições devolvidas valem para o texto como foi enviado.

Certeza que se explica

O score é a chance estimada de a fala não ser livre; a confidence é quanto o motor confia no veredito. Os pesos são escritos à mão e ajustados num conjunto de testes do próprio projeto: é uma estimativa do motor, não uma probabilidade estatística, e a documentação diz o quanto ele acerta e erra.

Um esquema só

Limites, tipos, motivos, erros, operações e a leitura dos pedidos moram num módulo puro que o servidor, o testador, o OpenAPI e a tabela desta página importam. O léxico e o motor ficam só no servidor.

Entrada de fora, com cuidado

Tamanho máximo por texto (5000 caracteres no POST), custo por pedido proporcional ao texto, erros em JSON com código estável, 429 com Retry-After e nenhuma expressão regular que volte atrás sobre o texto de quem usa.

Som e movimento em cada ação

Cada ação do testador tem som e animação por um módulo comum que usa os sons de interface do SFX Forge, com botões para desligar os dois e respeito ao pedido de menos movimento do sistema.

API

Endpoints

Sem chave e sem cadastro, com CORS liberado. Mande o texto em POST /analyze (JSON) ou GET /analyze?text=…. Limite por IP: 120 pontos por minuto e 2000 por hora, com 1 ponto a cada 500 caracteres de texto; os cabeçalhos RateLimit-* dizem quanto ainda cabe e o 429 traz Retry-After. O texto não é guardado.

POST /api/sem-odio/analyze Analisa uma fala em JSON: { "text": "…", "threshold": 0.5 }. Devolve free, o tipo, a certeza e os trechos que pesaram.
GET /api/sem-odio/analyze O mesmo por GET (?text=…&threshold=…), para testar no navegador. Até 1000 caracteres; prefira o POST.
POST /api/sem-odio/batch Analisa até 20 falas de uma vez: { "texts": ["…", "…"] }.
GET /api/sem-odio/categories Lista os tipos que a API identifica, com o id, o nome e a descrição.
GET /api/sem-odio Nome, versão, limites e a lista de endereços.
GET /api/sem-odio/openapi.json A especificação OpenAPI 3.1 desta API.

FAQ

Perguntas frequentes

O que a API devolve?

free (true se a fala está livre de preconceito e de discurso de ódio, false se não), o tipo principal (type e label), a certeza do veredito (confidence de 0 a 1 e percent de 0 a 100), a nota score, a lista de tipos com nota e os trechos que pesaram (matches, com start, end, text, type, reason e weight).

O que significa a certeza?

É quanto o motor confia no veredito: se free é true, a certeza de estar livre; se é false, a de não estar. Vem de pesos escritos à mão e ajustados num conjunto de testes pequeno, então é uma estimativa do motor, não uma probabilidade estatística. O score é a chance estimada de a fala não ser livre, e é ele que se compara com o threshold.

Funciona com outros idiomas?

Não. As falas devem estar em português do Brasil: o léxico e as regras foram escritos para ele, e texto em outro idioma costuma voltar como livre.

Para que serve o botão de rigor (threshold)?

Cada trecho que pesa tem um peso, e a nota da fala é a soma deles. Com o corte padrão (0,5) só passa a ser "não livre" o que pesa de verdade: ofensa, ódio, ameaça, generalização. Expressões que os glossários pedem para evitar, como "a coisa tá preta" ou "denegrir", pesam pouco (de 0,25 a 0,45): passam no padrão e aparecem como trecho fraco quando você baixa o corte.

Criticar um partido ou um governo conta como ódio?

Não. "Esse governo é um fracasso" ou "discordo da esquerda" passam livres. O que a API marca é generalizar e ofender todas as pessoas de um lado ("todo petista é burro", "a direita é fascista"), que ela trata como intolerância política, do mesmo jeito que trata uma generalização sobre qualquer outro grupo.

Ele entende ironia, humor e contexto?

Só o contexto que as regras conhecem: negação, citação, denúncia e palavras de dupla leitura. Ironia, humor, sarcasmo, códigos de grupo e ofensas sem nenhuma palavra do léxico passam como livres. Por isso é uma primeira triagem, não um juiz.

Por que não usa um modelo de inteligência artificial?

Os modelos públicos para português costumam pesar centenas de megabytes e pedir mais memória e processador do que este servidor oferece, e as licenças dos conjuntos de dados em que são treinados precisam de conferência antes de um uso comercial. O léxico com regras roda em microssegundos, é fácil de auditar e de corrigir quando erra.

O texto que eu mando é guardado?

Não. Ele é analisado na memória e descartado: não vai para o banco, o log de acesso do servidor registra só o endereço sem a query (inclusive no GET) e os números abertos contam pedidos e tipos, nunca o texto.

Posso usar para moderar o meu site?

Pode, como triagem: ajuste o threshold ao seu caso, trate o false como "vale uma revisão" e mantenha uma pessoa decidindo o que é apagado ou punido. A API erra para os dois lados.

Qual é o limite de uso?

Cada IP tem 120 pontos por minuto e 2000 por hora; um texto custa 1 ponto a cada 500 caracteres (no mínimo 1). Passou do limite, a resposta é 429 com Retry-After, e os cabeçalhos RateLimit-* dizem quanto ainda cabe.

Preciso de chave ou de cadastro?

Não. A API é aberta, com CORS liberado para qualquer site, e o limite é por IP.

O que os números abertos contam? Eles guardam dados pessoais?

Só contagens: textos analisados, quantos foram sinalizados, o tipo mais frequente e pedidos barrados. Nenhuma fala, nenhum trecho e nenhum IP entram nessa tabela.

Gostou do Sem Ódio? Dá para apoiar o trabalho:

Continue explorando

Veja também

Todos os projetos