Estoy tratando de detectar si un artículo o publicación en el foro es una entrada duplicada dentro de la base de datos. He pensado en esto, llegando a la conclusión de que alguien que duplica el contenido lo hará usando uno de los tres (en descendente difícil de detectar):
- copia simple pegue todo el texto
- copiar y pegar partes del texto fusionándolo con el suyo
- copiar un artículo de un sitio externo y disfrazarse como propio
Preparación de texto para análisis
Básicamente cualquier anomalía; El objetivo es hacer que el texto sea lo más "puro" posible. Para obtener resultados más precisos, el texto está "estandarizado" por:
- Eliminando los espacios en blanco duplicados y recortando al principio y al final.
- Las nuevas líneas están estandarizadas a \ n.
- Se eliminan las etiquetas HTML.
- El uso de un RegEx llamado URL de Daring Fireball se elimina.
- Yo uso el código BB en mi aplicación para que vaya a.
- (ä) centavos y extranjeros (además de Enlgish) se convierten a su forma no extranjera.
Guardo información sobre cada artículo en (1) tabla de estadísticas y en (2) tabla de palabras clave.
(1) Tabla de estadísticas Las siguientes estadísticas se almacenan sobre el contenido textual (al igual que esta publicación)
- longitud del texto
- recuento de letras
- el recuento de palabras
- recuento de oraciones
- palabras promedio por oración
- índice de legibilidad automatizada
- puntaje de niebla
Para los idiomas europeos, deben usarse Coleman-Liau y el Índice de legibilidad automatizada, ya que no utilizan el conteo de sílabas, por lo que deben producir una puntuación razonablemente precisa.
(2) Tabla de palabras clave
Las palabras clave se generan al excluir una gran lista de palabras vacías (palabras comunes), por ejemplo, 'the', 'a', 'of', 'to', etc., etc.
Data de muestra
- longitud del texto, 3963
- letter_count, 3052
- número de palabras, 684
- sentencia_contador, 33
- word_per_sentence, 21
- gunning_fog, 11.5
- auto_read_index, 9.9
- palabra clave 1, asesinado
- palabra clave 2, oficiales
- palabra clave 3, policía
Cabe señalar que una vez que se actualiza un artículo, todas las estadísticas anteriores se regeneran y podrían tener valores completamente diferentes.
¿Cómo podría utilizar la información anterior para detectar si un artículo que se publica por primera vez ya existe en la base de datos?
Soy consciente de que cualquier cosa que diseñe no será perfecta, el mayor riesgo es (1) El contenido que no es un duplicado se marcará como duplicado (2) El sistema permite que pase el contenido duplicado.
Por lo tanto, el algoritmo debe generar un número de evaluación de riesgos a partir de 0 sin riesgo duplicado, siendo posible 5 duplicado y 10 duplicado. Cualquier cosa por encima de 5, entonces hay una buena posibilidad de que el contenido esté duplicado. En este caso, el contenido podría marcarse y vincularse a los artículos que son posibles duplicados y un humano podría decidir si desea eliminarlo o permitirlo.
Como dije antes, estoy almacenando palabras clave para todo el artículo, sin embargo, me pregunto si podría hacer lo mismo en base al párrafo; Esto también significaría una mayor separación de mis datos en la base de datos, pero también facilitaría la detección de (2) en mi publicación inicial.
Estoy pensando en el promedio ponderado entre las estadísticas, pero en qué orden y cuáles serían las consecuencias ...
fuente
Respuestas:
Hay muchos algoritmos que se ocupan de la similitud de documentos en PNL. Aquí hay un artículo seminal que describe varios algoritmos. También wikipedia tiene una colección más grande. Estoy a favor de la medida de Jaro Winkler y la he usado para proyectos de escuelas de posgrado en métodos de agrupamiento aglomerativo.
fuente
Echa un vistazo al algoritmo Rabin-Karp . Utiliza un hash móvil similar a rsync para minimizar los bytes transmitidos durante una sincronización. Al ajustar el tamaño de la ventana que usa para el hash, puede hacerlo más o menos sensible. RK se utiliza para, entre otras cosas, la detección de plagio, que básicamente busca una especie de engaños.
fuente
Un primer intento podría ser detectar oraciones (o algún otro bloque de datos razonable. Tome esos bloques y elimine cualquier dato mete, espacio en blanco aleatorio html, retornos, etc. Tome un resultado MD5 y guárdelo en una tabla. Podría luego haga coincidir estos bloques para intentar encontrar coincidencias.
Si esto no funciona, puede probar n-gramas. Aquí necesita una entrada de cada palabra en la página, pero debería poder darle coincidencias bastante buenas.
http://en.wikipedia.org/wiki/N-gram
fuente
Para una matemática matemática exacta, guardaría un hash y luego lo compararía.
Creo que los sistemas que se usan para los exámenes miden grupos de palabras y luego la frecuencia de grupos de cada tamaño. Por ejemplo, una cadena de 30 palabras que se copian obtendría 5 puntos de riesgo y 5 ocurrencias de cadenas de 10 palabras obtendrían 5 puntos. Entonces tendrías un umbral de 30 puntos por cada 500 palabras.
Realmente necesitas un algoritmo semántico para que palabras como 'también' y 'y' se analicen de la misma manera.
fuente