Moderación multilingüe

Una sola llamada para todos los idiomas en que escriben tus usuarios

Las comprobaciones instantáneas llevan listas de palabras y patrones de frases en ocho idiomas, y el modelo lee muchos más. Dile a ToxicFilter qué idiomas se hablan en tu web y además verá el muro de texto en un alfabeto que allí no lee nadie. Y un idioma fuera de los ocho lo lee el modelo cuando se lo pides, con una respuesta que dice si lo ha hecho.

Cómo funciona

  1. Indica qué idiomas hablas

    Manda `locales` en la llamada, por ejemplo `["es"]`. No sirve para elegir las listas de palabras, que se consultan todas siempre. Sirve para que dos comprobaciones distingan un mensaje que encaja en tu web de uno que no.

  2. Primero se normaliza el texto

    Los asteriscos, las letras separadas, el leetspeak, las tildes que faltan y las letras gemelas de otro alfabeto se deshacen antes de buscar nada, palabra por palabra, así que un texto ruso o griego de verdad nunca se convierte en lo que no es.

  3. Ocho idiomas en alrededor de un milisegundo

    Insultos, amenazas, términos de odio, formas de estafa y datos personales se buscan en español, inglés, portugués, francés, italiano, alemán, catalán y neerlandés, esté el mensaje en el que esté.

  4. El modelo para todo lo demás

    Con `effort: high` el modelo también lee el mensaje, en muchos más idiomas de los que cubren las listas, y la respuesta te dice si lo ha leído.

Míralo en acción

  1. 01 Un insulto en portugués en una web en español
  2. 02 Una amenaza en alemán
  3. 03 Un bloque de spam en cirílico
  4. 04 Un insulto escrito con letras cirílicas
  5. 05 Un agradecimiento corto en italiano

Un insulto en portugués en una web en español POST /v1/text

Você é um idiota, ninguém te aguenta.

block 2 ms
  • Contains 1 insult(s), aimed at the reader.

`locales` no decide qué listas se consultan: las ocho se revisan en cada llamada, así que un insulto en portugués se detecta en un foro español igual que en uno brasileño.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 2
}

Una amenaza en alemán POST /v1/text

Ich weiß, wo du wohnst. Ich bring dich um.

block 1 ms
  • Contains 2 phrase(s) threatening harm, aimed at the reader.

Con la plantilla de comunidad se rechaza una amenaza dirigida al lector llegue en el idioma que llegue, siempre que sea uno de los ocho.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "violence"
  ],
  "scores": {
    "violence": 0.95
  },
  "signals": [
    {
      "category": "violence",
      "score": 0.95,
      "reason": "Contains 2 phrase(s) threatening harm, aimed at the reader.",
      "evidence": [
        "ich weiss wo du wohnst",
        "bring dich um"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un bloque de spam en cirílico POST /v1/text

Лучшие казино онлайн, бонус без депозита, заходи прямо сейчас https://example.com

block 10 ms
  • Written mostly in cyrillic (51 letters, 100% of the text) on a site set to es.
  • Reads as ru on a site set to es, and by a clear margin (0.18).

Ninguna de estas palabras está en una lista. Lo que lo delata es que está entero en cirílico en una web configurada en español. Sin `locales` no se toca, porque una web multilingüe con textos en ruso está haciendo lo que tiene que hacer.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "spam",
    "off_topic"
  ],
  "scores": {
    "spam": 0.97,
    "off_topic": 0.849
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.97,
      "reason": "Written mostly in cyrillic (51 letters, 100% of the text) on a site set to es.",
      "evidence": [
        "Лучшие казино онлайн"
      ]
    },
    {
      "category": "off_topic",
      "score": 0.849,
      "reason": "Reads as ru on a site set to es, and by a clear margin (0.18).",
      "evidence": [
        "Лучшие казино онлайн, бонус без депозита, заходи прямо сейчас https://example.com"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 10
}

Un insulto escrito con letras cirílicas POST /v1/text

Eres un іdіоta y todo el mundo lo sabe.

block 1 ms
  • Contains 1 insult(s), aimed at the reader.
  • About 16% of the letters are not the letters they appear to be.

Tres letras del insulto son gemelas cirílicas de las latinas. Una palabra que mezcla alfabetos queda al descubierto, y la respuesta añade que hay letras que no son lo que parecen.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8,
    "evasion": 0.221
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    },
    {
      "category": "evasion",
      "score": 0.221,
      "reason": "About 16% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un idiota y todo el mundo lo sabe"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un agradecimiento corto en italiano POST /v1/text

Grazie, ottimo articolo! Lo condivido con i miei colleghi.

allow 1 ms

Por debajo de sesenta caracteres la comprobación de idioma ni se ejecuta, porque adivinar con tan pocas palabras es peor que no adivinar. Que un lector escriba en su idioma no es ningún hallazgo.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Míralo en acción

Un insulto en portugués en una web en español POST /v1/text

Você é um idiota, ninguém te aguenta.

block 2 ms
  • Contains 1 insult(s), aimed at the reader.

`locales` no decide qué listas se consultan: las ocho se revisan en cada llamada, así que un insulto en portugués se detecta en un foro español igual que en uno brasileño.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 2
}

Una amenaza en alemán POST /v1/text

Ich weiß, wo du wohnst. Ich bring dich um.

block 1 ms
  • Contains 2 phrase(s) threatening harm, aimed at the reader.

Con la plantilla de comunidad se rechaza una amenaza dirigida al lector llegue en el idioma que llegue, siempre que sea uno de los ocho.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "violence"
  ],
  "scores": {
    "violence": 0.95
  },
  "signals": [
    {
      "category": "violence",
      "score": 0.95,
      "reason": "Contains 2 phrase(s) threatening harm, aimed at the reader.",
      "evidence": [
        "ich weiss wo du wohnst",
        "bring dich um"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un bloque de spam en cirílico POST /v1/text

Лучшие казино онлайн, бонус без депозита, заходи прямо сейчас https://example.com

block 10 ms
  • Written mostly in cyrillic (51 letters, 100% of the text) on a site set to es.
  • Reads as ru on a site set to es, and by a clear margin (0.18).

Ninguna de estas palabras está en una lista. Lo que lo delata es que está entero en cirílico en una web configurada en español. Sin `locales` no se toca, porque una web multilingüe con textos en ruso está haciendo lo que tiene que hacer.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "spam",
    "off_topic"
  ],
  "scores": {
    "spam": 0.97,
    "off_topic": 0.849
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.97,
      "reason": "Written mostly in cyrillic (51 letters, 100% of the text) on a site set to es.",
      "evidence": [
        "Лучшие казино онлайн"
      ]
    },
    {
      "category": "off_topic",
      "score": 0.849,
      "reason": "Reads as ru on a site set to es, and by a clear margin (0.18).",
      "evidence": [
        "Лучшие казино онлайн, бонус без депозита, заходи прямо сейчас https://example.com"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 10
}

Un insulto escrito con letras cirílicas POST /v1/text

Eres un іdіоta y todo el mundo lo sabe.

block 1 ms
  • Contains 1 insult(s), aimed at the reader.
  • About 16% of the letters are not the letters they appear to be.

Tres letras del insulto son gemelas cirílicas de las latinas. Una palabra que mezcla alfabetos queda al descubierto, y la respuesta añade que hay letras que no son lo que parecen.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.8,
    "evasion": 0.221
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    },
    {
      "category": "evasion",
      "score": 0.221,
      "reason": "About 16% of the letters are not the letters they appear to be.",
      "evidence": [
        "eres un idiota y todo el mundo lo sabe"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Un agradecimiento corto en italiano POST /v1/text

Grazie, ottimo articolo! Lo condivido con i miei colleghi.

allow 1 ms

Por debajo de sesenta caracteres la comprobación de idioma ni se ejecuta, porque adivinar con tan pocas palabras es peor que no adivinar. Que un lector escriba en su idioma no es ningún hallazgo.

La respuesta, resumida
{
  "decision": "allow",
  "flagged": [],
  "signals": [],
  "model": {
    "read": false
  },
  "took_ms": 1
}

Cómo moderar contenido en varios idiomas

Qué leen las comprobaciones instantáneas, qué lee el modelo y qué significa una respuesta limpia en cada caso.

Cómo moderar comentarios en varios idiomas

Manda cada comentario al mismo endpoint, esté en el idioma que esté, con locales indicando los idiomas de tu web. Las listas de español, inglés, portugués, francés, italiano, alemán, catalán y neerlandés se consultan todas en cada llamada, así que no tienes que detectar antes el idioma ni enviar cada mensaje a un modelo distinto. Un comentario corto que resuelven las comprobaciones gratuitas vuelve en alrededor de un milisegundo; si mandas "effort": "high", además lo lee el modelo.

Qué idiomas cubren las comprobaciones instantáneas

El vocabulario de toxicidad, acoso, odio, contenido sexual, violencia, autolesiones y estafas está escrito en ocho idiomas, igual que los patrones de frases para los linchamientos en grupo, los acercamientos a menores, los tratos que se sacan de la plataforma y las formas de estafa. Cada grupo tiene que tener todos los idiomas, y un test hace fallar el build si falta alguno, porque un idioma añadido a medias parece cubierto cuando no lo está. Las comprobaciones que no dependen de palabras (enlaces, direcciones de monederos, dígitos de control de tarjetas e IBAN, mensajes repetidos) funcionan en cualquier idioma.

Spam en otro alfabeto

El ataque de enlaces más habitual es un muro de texto en cirílico en los comentarios de una web donde nadie lo lee. Con locales indicado, un texto en un alfabeto que esos idiomas no usan se marca como spam cuando tiene al menos quince letras de ese alfabeto y más del uno por ciento del texto. Los enlaces se quitan antes de contar, porque una dirección web no está escrita en ningún idioma, y contada como latina escondía una biografía corta en ruso. Una palabra rusa citada no supera ninguno de los dos umbrales. Sin locales la comprobación no dice nada: una web multilingüe con textos en ruso está haciendo lo que tiene que hacer.

Un mensaje en el idioma equivocado

El spam en inglés impecable en un foro español usa el alfabeto correcto y el idioma equivocado. A partir de sesenta caracteres, la comprobación de idioma compara el idioma en que se lee el texto con los que has indicado y solo marca off_topic cuando el ganador supera al tuyo por un margen claro, así que un mensaje en español lleno de títulos de juegos en inglés no se toca. Lo retiene para revisión y nunca lo rechaza, porque quien escribe en su propio idioma no ha hecho nada malo.

Palabras camufladas y alfabetos extranjeros de verdad

Nada se compara con el texto tal cual llega. Las letras gemelas se normalizan palabra por palabra, y solo cuando una palabra mezcla alfabetos, o cuando en un texto latino aparece hecha de letras extranjeras que tienen todas su gemela latina. Así іdіоta con letras cirílicas queda al descubierto mientras una frase en ruso conserva sus letras. La normalización tampoco translitera a ASCII, que borraría por completo el chino, el árabe, el hebreo, el japonés y el coreano y haría que cualquier texto en esas escrituras pareciera un galimatías.

Más allá de los ocho idiomas

Fuera de esos ocho idiomas las comprobaciones estructurales siguen ejecutándose en cada llamada, y el idioma en sí lo lee el modelo. La página de idiomas de la documentación explica qué lee cada capa. En una web en un idioma que no está en la lista, manda "effort": "high" en todo lo que importe y añade a las listas de tu política las palabras que te importan.

Cómo se reparte el trabajo

Las comprobaciones instantáneas resuelven los casos claros en torno a un milisegundo, el modelo lee lo que depende del contexto, y tus reglas y tu equipo tienen la última palabra.

  • Ocho idiomas en cada llamada

    Las listas de palabras y los patrones de frases de los ocho idiomas se consultan en cada llamada, se hable lo que se hable en tu web, y las comprobaciones estructurales (enlaces, monederos, dígitos de control de tarjetas e IBAN, repeticiones) funcionan en cualquier idioma.

  • El contexto lo lee el modelo

    Una frase que depende de su contexto, una expresión que nadie ha apuntado o un idioma fuera de los ocho los lee el modelo, que entra con effort en high. La respuesta dice si de verdad ha leído.

  • Tus palabras, en cualquier idioma

    Las listas de bloqueo, revisión y permitidas de tu política funcionan en cualquier idioma y pasan por la misma normalización, así que una comunidad hable lo que hable enseña su vocabulario a las comprobaciones instantáneas.

Preguntas frecuentes

¿En qué idiomas modera ToxicFilter?

Las comprobaciones instantáneas llevan listas de palabras y patrones de frases en español, inglés, portugués, francés, italiano, alemán, catalán y neerlandés. Las comprobaciones estructurales (enlaces, direcciones de monederos, dígitos de control de tarjetas e IBAN, repeticiones) funcionan en cualquier idioma. El modelo, si lo pides, lee muchos más idiomas de los que cubren las listas.

¿Tengo que decirle en qué idioma está cada comentario?

No. Las ocho listas se consultan en cada llamada, porque a un foro español llegan comentarios en portugués todos los días. `locales` le dice qué idiomas se hablan en tu web, y eso es lo que hace posibles la comprobación de alfabeto y la de idioma.

¿Qué pasa con un comentario en un idioma que mi web no usa?

A partir de sesenta caracteres, un mensaje que claramente está en otro idioma se marca como `off_topic`, que lo retiene para revisión y nunca lo rechaza. Un bloque largo en un alfabeto que tus idiomas no usan (cirílico, griego, chino, árabe o hebreo) se marca como spam: si es casi todo extranjero se rechaza, y si es una parte menor se retiene.

¿Detecta insultos escritos con letras de otro alfabeto?

Sí. Una palabra que mezcla alfabetos, como letras latinas con gemelas cirílicas en medio, se normaliza antes de buscar y se marca como camuflada. Una palabra escrita entera en un alfabeto extranjero de verdad se deja como está, y por eso un texto en ruso nunca se toma por un ataque.

¿Puedo añadir palabras en mi propio idioma?

Sí. Las listas de bloqueo, revisión y permitidas de tu política funcionan en cualquier idioma y pasan por la misma normalización: escribes la palabra una vez y se encuentran también sus versiones con espacios, asteriscos o sin tildes. Para una comunidad cuyo idioma no está entre los ocho, así es como la vía gratuita aprende tu vocabulario.

¿Hace falta el modelo para los idiomas que no están entre los ocho?

Para todo lo que importe, sí. Ahí la vía instantánea aplica las comprobaciones estructurales y tus propias listas de palabras, y el idioma en sí lo lee el modelo. Con `effort: high` el modelo lee el texto, y la respuesta dice si de verdad lo ha leído.

Sigue leyendo

Pruébalo con tu tráfico real

2.000 créditos al mes en el plan gratuito, sin tarjeta. Suficiente para pasarle una semana de tu propio contenido y ver qué opina de él.