Comprobar contenido duplicado mediante shingles
Este comprobador de contenido duplicado compara dos textos mediante secuencias consecutivas de palabras y ofrece un porcentaje de similitud claro.
Ejecutar — gratis
Normaliza mayúsculas, minúsculas y puntuación, crea un conjunto de frases para cada texto y mide su intersección con el coeficiente de Jaccard. Usted puede elegir el tamaño del shingle y el porcentaje que activará la señal de posible duplicado. El resultado es determinista, auditable y útil para revisar páginas de destino, descripciones de productos, artículos sindicados y otros contenidos antes de publicarlos.
Qué revela la similitud por shingles
Un shingle es una secuencia breve de palabras consecutivas. Con un tamaño de tres, una oración genera grupos formados por las palabras 1 a 3, 2 a 4 y así sucesivamente. El comprobador crea esos conjuntos para ambos textos, cuenta las secuencias compartidas y divide esa cantidad entre el total de secuencias únicas presentes en cualquiera de los dos. Este cálculo de Jaccard produce el porcentaje de similitud. Premia los pasajes coincidentes e ignora diferencias de mayúsculas o puntuación que no cambian las palabras. Por eso resulta más informativo que comparar frecuencias de términos aislados: emplear vocabulario habitual no basta para crear una coincidencia si las palabras no aparecen en el mismo orden local. La puntuación demuestra solapamiento textual, pero no predice una penalización del buscador. Un valor alto indica que las versiones reutilizan muchas frases y merecen revisión editorial. Uno bajo indica que la redacción exacta difiere, aunque no demuestra que un texto sea original, correcto, útil ni apto para publicar.
Cómo elegir el tamaño y el umbral
El tamaño predeterminado es de tres palabras, un punto de partida práctico para textos web corrientes. Los shingles pequeños son más sensibles: detectan fragmentos breves compartidos, pero también pueden contar expresiones rutinarias presentes de forma natural en páginas distintas. Los grandes exigen secuencias literales más largas, por lo que reducen coincidencias accidentales y pueden pasar por alto pasajes ligeramente reformulados. Elija el tamaño antes de interpretar el porcentaje, pues no se deben comparar directamente resultados obtenidos con tamaños diferentes. El umbral solo controla la bandera de posible duplicado; no modifica el cálculo. Un umbral de 70 señala cualquier resultado igual o superior al 70 por ciento. Conviene calibrarlo con ejemplos de su propia biblioteca y no tratar un único corte como regla universal de SEO. Mantenga los mismos ajustes al analizar lotes. Cada texto debe contener al menos tantas palabras normalizadas como indique el tamaño; de lo contrario, la solicitud falla para evitar un porcentaje artificial o matemáticamente engañoso.
Cómo convertir el resultado en una decisión editorial
Utilice la puntuación como señal de cribado dentro de una revisión. Empiece comparando páginas dirigidas a consultas parecidas, plantillas rellenadas desde el mismo catálogo o un borrador frente al material fuente entregado a quien redacta. Cuando una pareja quede marcada, examine ambos documentos y determine por qué coinciden sus shingles. La navegación repetida, los avisos legales, las especificaciones y las llamadas a la acción estándar pueden ser legítimos. La coincidencia en introducciones, explicaciones, ventajas y conclusiones justifica más claramente una revisión. Conserve los hechos que deban seguir siendo correctos, pero reorganice y reformule el contenido para que cada página responda a una intención propia. Registre el tamaño y el umbral junto al resultado si necesita una auditoría reproducible. La herramienta procesa exactamente dos textos por solicitud; no rastrea URL, no busca en la web, no identifica la autoría original ni decide qué página posicionará un buscador. Para revisar todo un sitio, seleccione primero parejas relevantes, aplique ajustes constantes y priorice las puntuaciones altas para evaluación humana en lugar de borrar o redirigir automáticamente.
Qué puede hacer con ella
Revisar páginas de destino parecidas
Compare páginas orientadas a palabras clave próximas y encuentre pasajes que las vuelven innecesariamente repetitivas.
Comprobar textos de proveedores
Mida cuánto conserva una descripción revisada de la redacción original facilitada por el fabricante.
Cribar entregas editoriales
Compare un borrador nuevo con un artículo existente y derive las parejas con mucha coincidencia a edición.
Preguntas frecuentes
¿Cómo se calcula el porcentaje de similitud?
Se usan shingles únicos de palabras consecutivas y su similitud de Jaccard: secuencias compartidas divididas entre todas las secuencias únicas de cualquiera de los textos, multiplicado por 100.
¿Qué ocurre si un texto es más corto que el tamaño del shingle?
La solicitud devuelve un error de entrada e identifica el texto corto. Ambos deben contener palabras suficientes para formar al menos un shingle.
¿La señal de duplicado implica una penalización del buscador?
No. La señal informa de coincidencias de frases según el umbral elegido; no predice indexación, selección canónica, posicionamiento ni medidas de un buscador.
¿Influyen la puntuación o las mayúsculas en el resultado?
No. Antes de crear los shingles se normalizan Unicode, mayúsculas, minúsculas y puntuación. La identidad y el orden de las palabras sí influyen.
¿Cuánto cuesta una solicitud por API?
Cada solicitud por API cuesta $0.002. También puede ejecutar gratis la misma comprobación determinista en su navegador desde esta página.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/seo/duplicate-content-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text_a":"Search engines value useful original pages that answer a reader'\''s question clearly and completely.","text_b":"Search engines value useful original pages that answer a reader'\''s question clearly and completely."}'const res = await fetch("https://api.kit.forhosting.com/seo/duplicate-content-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text_a": "Search engines value useful original pages that answer a reader's question clearly and completely.",
"text_b": "Search engines value useful original pages that answer a reader's question clearly and completely."
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/seo/duplicate-content-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text_a": "Search engines value useful original pages that answer a reader's question clearly and completely.",
"text_b": "Search engines value useful original pages that answer a reader's question clearly and completely."
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/seo/duplicate-content-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text_a":"Search engines value useful original pages that answer a reader\'s question clearly and completely.","text_b":"Search engines value useful original pages that answer a reader\'s question clearly and completely."}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text_a":"Search engines value useful original pages that answer a reader's question clearly and completely.","text_b":"Search engines value useful original pages that answer a reader's question clearly and completely."}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/seo/duplicate-content-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"text_a": "Search engines value useful original pages that answer a reader's question clearly and completely.",
"text_b": "Search engines value useful original pages that answer a reader's question clearly and completely."
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "seo.duplicate_content_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |