Medios de comunicación

Comentarios abiertos, y las amenazas fuera

Cada comentario de cada noticia, revisado antes de que aparezca. ToxicFilter rechaza la amenaza a la periodista y el insulto a otro lector, retiene para una persona la campaña de enlaces y el acoso en grupo, y deja donde está la discusión enfadada, pero legítima, sobre la noticia.

Lo que falla en plataformas como la tuya

Amenazas a la redacción

Una periodista publica una noticia sobre un contrato municipal y los comentarios se llenan de "sé dónde vives". Las amenazas a periodistas, y a las personas que salen en una noticia, llegan debajo del propio artículo, a la vista de todos, y cada hora que siguen publicadas es una hora más que las lee quien las recibe.

Lectores que se lanzan contra otros

Una sección de comentarios es una multitud. Un lector insulta a otro, se suman tres más y quien opinaba distinto deja de comentar. Leídas de una en una, las respuestas son mal humor; juntas deciden quién puede hablar debajo de tus noticias.

Campañas de enlaces en las noticias más leídas

La noticia que abre todas las portadas es la primera que encuentran los spammers: "buen artículo, más aquí" con tres enlaces acortados y, después, el mismo comentario, apenas reescrito, debajo de cada pieza del día.

La discusión acalorada es lo que buscas

Los lectores están enfadados con el alcalde, con los presupuestos o con la guerra, y lo dicen. Un filtro que no distingue "este plan es una vergüenza" de un ataque a una persona o se carga el debate que tus lectores vienen a buscar, o deja pasar los ataques para no tocarlo.

Qué decide con contenido como el tuyo

Juzgado ahora mismo por el mismo motor que usa la API, con la plantilla de este tipo de plataforma y sin intervención del modelo.

  1. 01 Una amenaza a la periodista
  2. 02 Un insulto a otro lector
  3. 03 Acoso en grupo bajo la noticia
  4. 04 Una campaña de enlaces
  5. 05 Enfadado, y legítimo

Una amenaza a la periodista POST /v1/text

Bonito artículo, periodista. Sé dónde vives. Te voy a encontrar.

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

Dos frases amenazantes dirigidas a quien lee, rechazadas como violencia por las comprobaciones gratuitas, sin que intervenga el modelo. El elogio del principio no cambia nada.

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": [
        "te voy a encontrar",
        "se donde vives"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un insulto a otro lector POST /v1/text

Eres un put0 1d10ta, no tienes ni idea de lo que pasa en este pueblo.

block 7 ms
  • Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.
  • Contains 1 insult(s), aimed at the reader.

Un insulto dirigido a quien lee, camuflado con números que se convierten otra vez en letras antes de buscar nada. La plantilla de comunidad rechaza el acoso antes que el umbral por defecto.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55
  },
  "signals": [
    {
      "category": "toxicity",
      "score": 0.55,
      "reason": "Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.",
      "evidence": [
        "puto"
      ]
    },
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Acoso en grupo bajo la noticia POST /v1/conversation

ana El puente lleva meses cerrado y nadie da explicaciones.

bob cállate, idiota, tú no tienes ni idea

cris jaja eres un inútil

dan eres idiota, tú no vales nada

eve vete de aquí, en serio

review 17 ms
  • 3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.

Tres lectores distintos contra la que hizo una pregunta. La última respuesta, sola, es una frase seca y pasa; el hilo es lo que la retiene para que la vea una persona.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.6
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.6,
      "reason": "3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 17
}

Una campaña de enlaces POST /v1/text

Buen artículo. Más detalles aquí: https://bit.ly/x1 https://bit.ly/x2 https://bit.ly/x3

review 7 ms
  • 3 links in about 19 words: mostly links, barely a message.
  • Uses a link shortener, which hides where the link goes.

Casi todo enlaces, todos acortados, detrás de una frase de elogio. Se retiene en lugar de rechazarse: una copia no demuestra una campaña, y lo que la hace subir es que el mismo comentario vuelva a llegar en tu tráfico.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "spam"
  ],
  "scores": {
    "spam": 0.75
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.75,
      "reason": "3 links in about 19 words: mostly links, barely a message.",
      "evidence": [
        "https://bit.ly/x1",
        "https://bit.ly/x2",
        "https://bit.ly/x3"
      ]
    },
    {
      "category": "spam",
      "score": 0.7,
      "reason": "Uses a link shortener, which hides where the link goes.",
      "evidence": [
        "https://bit.ly/x1",
        "https://bit.ly/x2",
        "https://bit.ly/x3"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Enfadado, y legítimo POST /v1/text

Este alcalde es un desastre y su plan de vivienda es una tomadura de pelo. En mayo, a la calle.

allow 7 ms

Duro con un cargo público y con su política, sin ir contra nadie del hilo. Se queda publicado, y lo resuelven las comprobaciones gratuitas en torno a un milisegundo.

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

Qué decide con contenido como el tuyo

Juzgado ahora mismo por el mismo motor que usa la API, con la plantilla de este tipo de plataforma y sin intervención del modelo.

Una amenaza a la periodista POST /v1/text

Bonito artículo, periodista. Sé dónde vives. Te voy a encontrar.

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

Dos frases amenazantes dirigidas a quien lee, rechazadas como violencia por las comprobaciones gratuitas, sin que intervenga el modelo. El elogio del principio no cambia nada.

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": [
        "te voy a encontrar",
        "se donde vives"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 8
}

Un insulto a otro lector POST /v1/text

Eres un put0 1d10ta, no tienes ni idea de lo que pasa en este pueblo.

block 7 ms
  • Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.
  • Contains 1 insult(s), aimed at the reader.

Un insulto dirigido a quien lee, camuflado con números que se convierten otra vez en letras antes de buscar nada. La plantilla de comunidad rechaza el acoso antes que el umbral por defecto.

La respuesta, resumida
{
  "decision": "block",
  "flagged": [
    "harassment",
    "toxicity"
  ],
  "scores": {
    "harassment": 0.8,
    "toxicity": 0.55
  },
  "signals": [
    {
      "category": "toxicity",
      "score": 0.55,
      "reason": "Contains 1 profanity, aimed at the reader. On its own this says the tone is casual, not that the content is abusive.",
      "evidence": [
        "puto"
      ]
    },
    {
      "category": "harassment",
      "score": 0.8,
      "reason": "Contains 1 insult(s), aimed at the reader.",
      "evidence": [
        "idiota"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Acoso en grupo bajo la noticia POST /v1/conversation

ana El puente lleva meses cerrado y nadie da explicaciones.

bob cállate, idiota, tú no tienes ni idea

cris jaja eres un inútil

dan eres idiota, tú no vales nada

eve vete de aquí, en serio

review 17 ms
  • 3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.

Tres lectores distintos contra la que hizo una pregunta. La última respuesta, sola, es una frase seca y pasa; el hilo es lo que la retiene para que la vea una persona.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "harassment"
  ],
  "scores": {
    "harassment": 0.6
  },
  "signals": [
    {
      "category": "harassment",
      "score": 0.6,
      "reason": "3 different people in this conversation are being hostile. Each message on its own is ordinary bad temper; together they are a pile-on, and that is not visible in any one of them.",
      "evidence": []
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 17
}

Una campaña de enlaces POST /v1/text

Buen artículo. Más detalles aquí: https://bit.ly/x1 https://bit.ly/x2 https://bit.ly/x3

review 7 ms
  • 3 links in about 19 words: mostly links, barely a message.
  • Uses a link shortener, which hides where the link goes.

Casi todo enlaces, todos acortados, detrás de una frase de elogio. Se retiene en lugar de rechazarse: una copia no demuestra una campaña, y lo que la hace subir es que el mismo comentario vuelva a llegar en tu tráfico.

La respuesta, resumida
{
  "decision": "review",
  "flagged": [
    "spam"
  ],
  "scores": {
    "spam": 0.75
  },
  "signals": [
    {
      "category": "spam",
      "score": 0.75,
      "reason": "3 links in about 19 words: mostly links, barely a message.",
      "evidence": [
        "https://bit.ly/x1",
        "https://bit.ly/x2",
        "https://bit.ly/x3"
      ]
    },
    {
      "category": "spam",
      "score": 0.7,
      "reason": "Uses a link shortener, which hides where the link goes.",
      "evidence": [
        "https://bit.ly/x1",
        "https://bit.ly/x2",
        "https://bit.ly/x3"
      ]
    }
  ],
  "model": {
    "read": false
  },
  "took_ms": 7
}

Enfadado, y legítimo POST /v1/text

Este alcalde es un desastre y su plan de vivienda es una tomadura de pelo. En mayo, a la calle.

allow 7 ms

Duro con un cargo público y con su política, sin ir contra nadie del hilo. Se queda publicado, y lo resuelven las comprobaciones gratuitas en torno a un milisegundo.

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

Qué busca

Cada cosa con su propia puntuación y sus propios umbrales, y el motivo explicado en una frase cada vez que actúa.

La plantilla con la que empiezas

Elígela al crear una política y estas reglas se escriben por ti, listas para editar. Todo lo que no menciona sigue nuestros valores por defecto.

  • Toxicidad retiene desde 0,30 · nunca rechaza
  • Acoso retiene desde 0,30 · rechaza desde 0,65
  • Discurso de odio retiene desde 0,25 · rechaza desde 0,55
  • Violencia retiene desde 0,25 · rechaza desde 0,60
  • Acercamiento a menores retiene desde 0,20 · rechaza desde 0,70
  • Spam retiene desde 0,50 · rechaza desde 0,80
  • Elusión del filtro retiene desde 0,50 · rechaza desde 0,85

Lo fija la plantilla

Una llamada antes de publicar

Envía el texto indicando dónde va a aparecer y actúa según la decisión.

La petición

curl https://toxicfilter.com/api/v1/text \
  -H "Authorization: Bearer $TOXICFILTER_KEY" \
  -d content="Bonito artículo, periodista. Sé dónde vives. Te voy a encontrar." \
  -d surface=comment
La referencia completa →

Un mes de ejemplo, en cifras

Elementos revisados
400.000
Leídos por el modelo
25.000
Imágenes
2.000
Créditos, aproximadamente
595.000

Entra en el plan Max. Ver los planes →

Guía para moderar una sección de comentarios

Qué revisar, cuándo hacerlo y cómo fijar las reglas, en los comentarios de tus noticias.

Cómo moderar los comentarios de un periódico digital

Llama a la API antes de que el comentario aparezca debajo de la noticia y actúa según una de tres respuestas: publicarlo, retenerlo para que lo vea una persona o rechazarlo. Casi todos los comentarios son un lector diciendo algo normal sobre la noticia, y eso lo resuelven las comprobaciones gratuitas en torno a un milisegundo, así que moderar no añade una espera que el lector note. El modelo solo lee lo que ellas dejan abierto, y decides en cada llamada si puede hacerlo. Un comentario bloqueado vuelve con el motivo en una frase que tus moderadores pueden enseñarle al lector.

Amenazas a periodistas y a quien sale en la noticia

Una amenaza dirigida a quien lee ("sé dónde vives", "te voy a encontrar", "te voy a matar") se rechaza como violence en las comprobaciones gratuitas, en ocho idiomas, y la plantilla de comunidad la rechaza antes que el umbral por defecto. Las listas gratuitas recogen las formulaciones conocidas; una amenaza dicha de otra manera la lee el modelo, con effort: high. Un buen historial en tu web nunca rebaja el umbral de las amenazas, así que un comentarista habitual no se gana margen para soltar una.

Discurso de odio en los comentarios

Los ataques a colectivos van a hate, y eso es sobre todo trabajo del modelo. Las listas de palabras públicas no llevan insultos de odio a propósito, así que leer un ataque a un colectivo es trabajo del modelo. Si tus comentarios atraen ese tráfico, deja que el modelo lea los de las noticias que lo provocan, o carga tu propia lista desde fuera del código. La plantilla de comunidad rechaza hate a partir de 0,55, antes que el 0,70 por defecto.

Discusión acalorada que tiene que seguir publicada

La gente entra en los comentarios para discrepar, muchas veces a gritos. ToxicFilter separa lo que se dice de un cargo público, de una política o de la noticia de lo que va contra quien lee: "el alcalde es un desastre" pasa, "eres idiota" es acoso. Las palabrotas, solas, se informan como toxicity, que la plantilla de comunidad retiene para que alguien lo mire y nunca rechaza solo por eso, así que el lector enfadado que suelta un taco pasa por revisión en lugar de quedarse callado.

Spam, campañas de enlaces y comentarios repetidos

Un comentario que es casi todo enlaces, o que usa acortadores, se puntúa como spam y se retiene. Una campaña es otra señal, y no está en ningún comentario suelto: es el mismo comentario llegando una y otra vez. ToxicFilter lleva la cuenta dentro de tu propio tráfico, por proyecto y nunca mezclándolo con el de otros clientes, de los comentarios de más de unos cuarenta caracteres, reconoce la copia aunque la hayan reescrito y deja que ese recuento mueva el veredicto de la siguiente. Una repetición que se responde desde la caché cuesta solo la comprobación, un crédito, costara lo que costara la primera copia.

La cola de revisión y la declaración de motivos

Lo que llega como review espera en una cola, en tu panel o por la API, y el webhook moderation.resolved avisa a tu web cuando un moderador decide. Cada comentario bloqueado puede llevar la declaración de motivos que pide el artículo 17 del Reglamento de Servicios Digitales, en el idioma del lector, con el recurso detrás.

Preguntas frecuentes

¿Distingue un comentario político acalorado de un ataque?

Mira a quién van dirigidas las palabras. Decir que una política es una vergüenza o que un político miente no va contra quien lee, y pasa. Un insulto o una amenaza dirigidos a quien lee ("eres idiota", "sé dónde vives") se puntúan como acoso o violencia. Las palabrotas, solas, se informan como toxicity: la plantilla de comunidad las retiene para que alguien las mire y nunca rechaza un comentario solo por eso.

¿Detecta el discurso de odio contra colectivos?

Sobre todo a través del modelo. Las listas de palabras públicas no llevan insultos de odio a propósito, porque una lista completa de ellos solo tiene otro uso, así que un ataque a un colectivo lo lee el modelo, que con effort high entra en cada comentario. Puedes cargar tu propia lista desde fuera del código, y la plantilla de comunidad rechaza el odio antes que el umbral por defecto.

¿Cómo se detectan los comentarios coordinados o repetidos?

ToxicFilter cuenta, dentro de tu propio tráfico y nunca mezclándolo con el de otros clientes, cuántas veces ha llegado en los últimos minutos el mismo comentario de más de unos cuarenta caracteres, y lo reconoce aunque lo hayan reescrito cambiando un enlace o una palabra. Ese recuento mueve el veredicto de la siguiente copia. Dentro de una noticia, manda el hilo a /v1/conversation con el autor de cada comentario y además cuenta cuántas personas distintas van contra la misma.

¿Qué idiomas cubre?

Las comprobaciones instantáneas llevan listas de palabras y frases en inglés, español, portugués, francés, italiano, alemán, catalán y neerlandés. El modelo lee muchos más. Fuera de esos ocho, con effort high el modelo lee cada comentario.

¿Pueden nuestros moderadores aprobar un comentario retenido?

Sí. Todo lo que llega como review espera en una cola, en tu panel o por la API. Cuando alguien lo aprueba o lo rechaza, un webhook firmado moderation.resolved avisa a tu web, y el comentario se publica o sigue retirado sin que nadie tenga que copiarlo a mano.

¿Hay que explicarle a un lector por qué se ha retirado su comentario?

En la UE, sí: el artículo 17 del Reglamento de Servicios Digitales exige una declaración de motivos por cada retirada o restricción, sea cual sea el tamaño del medio. ToxicFilter puede redactarla con cada comentario bloqueado, en el idioma del lector, y recoger su recurso.

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.