Red de “influencias” en tesis


El reciente caso de plagio detectado en tesis de licenciatura de la UNAM despertó mi curiosidad, por varios aspectos:

  • He dirigido y revisado tesis en temáticas relacionadas computación en la UNAM aquí unas y aquí otras (No me pregunten por qué son dos listas 🙃)
  • En el rol de supervisor, he sido testigo del esfuerzo que les alumnes y sus familias invierten para realizar la tesis
  • Como supervisor y sinodal también he visto el esfuerzo que ponen colegas para hacer una revisión a conciencia de los textos

Así que esta situación me afecto en-lo-personal-de-lo-profesional y he estado siguiendo los eventos, y reflexionando al respecto .

Pero por otro lado despertó mi curiosidad porque el análisis de textos es parte de lo que sé hacer 😊 así que hice unos scripts para identificar la red de influencia entre tesis. Y aunque es trabajo en proceso creo que ilustran los problemas que uno enfrenta en el Procesamiento de Lenguaje Natural (PLN) de manera sucinta así que hice estas notas.

Advertencia

Estas notas no representan ninguna evidencia legal de plagio. Para entender las notas hay que considerar que son un punto inicial de un análisis más profundo que se necesita hacer, que se debe hacer con un equipo interdiciplinario de expertos. Considere estas notas como la bitácora de un ejercicio académico que busca ejemplicar a través de un caso real aspectos técnicos de PLN, pero ni código y ni resultados son un producto final.
Por otro lado, si estudiantes se interesan por la temática y quiere explorar y expandir lo que existe para su proceso de titulación no duden en contactarme. Creo que sería poético que de esta situación surgieran más tesis.

Pasos para construir una Red de “influencias” en tesis

El objetivo de las notas es ejemplicar como podemos saber que tesis influenciaron a otras tesis. En este caso la “influencia” consiste en repetir segmentos de textos en una tesis dada una tesis “anterior”. Para lograr esto exploramos los siguientes pasos:

  1. Conseguir las tesis
  2. Preparar la tesis y limpiarlas
  3. Comparar dos tesis
  4. Crear el grafo

En particular nos concentraremos en el grupo de tesis que supervisó la maestra Rodriguez Ortiz quien dirigió las tesis involucradas en el caso que originó todo esto . Ella dirigió varias tesis y podemos implementar algunos algoritmos con estas. Con esta decisión esperamos que al menos para las dos tesis que originaron todo este revuelo encontremos evidencia de coincidencia entre ellas.

1. Conseguir las tesis

Afortunadamente la UNAM cuenta con un repositorio/plataforma donde se encuentran las tesis para su consulta; desafortunadamente el sistema no es amigable para su uso de forma sistemática, ni de forma humana… por ejemplo los resultados de búsqueda son temporales y es difícil acceder a la ficha de una tesis en una dirección fija 😠. Mi hipótesis es que muchas decisiones se tomaron para dificultar el plagio…🤔

La buena noticia es que cada tesis está asociada a un número de documento que su vez está asociado a un pdf en una URL dirección única. Entonces es cuestión de hacer una búsqueda, visitar todas las páginas de resultados y recuperar la ficha de las tesis por página de resultado de donde se extrae la información.

Para lograr esto el script proporcionado usa la librería <em>requests</em> para hacer peticiones web desde el código; para manipular los elementos relevantes de cada página de resultados y la ficha usa <em>parsel</em> . La información se extrae y se pone en una base de datos local <em>tinyDB</em> . Como vamos a tener varios de estos scripts se integraron con <em>click</em> . El comando download-query hace esta tarea por si quieren explorar su funcionamiento, ojo 👀 por ahora solo puede buscar por supervisores.

En este momento tenemos la información pero no tenemos los documentos pdf, entonces es necesario recorrer la base de datos e inferir la URL usando el número de documento, y así finalmente descargar el pdf. Esto se integró en el comando download-pdf-populate-text.

Si ustedes bajan pdfs no tienen la licencia para distribuirlas por su cuenta, es decir no pueden ponerlas en otro lado para su acceso de forma libre. Si las quieren compartir con alguien tienen dos opciones: o establecen una colaboración, o le pasan los parámetros de la búsqueda que permite identificar las URL únicas y que esa persona baje de nuevo los archivos.
👀 este mecanismo para identificar los documentos pdf puede que un futuro no funcione, y tendremos que buscar un nuevo camino.

Con la información de la base de datos podemos hacer una primera gráfica que ilustra nuestro universo de tesis:

Esta gráfica ilustra el número de tesis dirigidas por la maestra por año. Algunas consideraciones con estos datos:

  1. La búsqueda arroja más de 500 tesis pero aquí solo se grafican 499, esto se debe a que algunos registros en la plataforma están mal (duplicados) y no corresponden con ningún documento pdf (hasta dónde me alcanzó la paciencia para averiguar).
  2. Aquí solo vemos las tesis supervisadas con un nombre especifico, si existe otra tesis con una variante de ese nombre, no las estamos recuperando.

2. Preparar la tesis y limpiarlas

Ahora que tenemos los documentos pdf no podemos trabajar directamente con ellos ya que el formato pdf no es amigable. Una opción común es extraer el texto asociado al pdf a través de alguna librería, sin embargo no es posible ya que los formatos de pdf son muy variables y están llenos de trucos. Por ejemplo, tesis digitalizadas tienen asociado el texto a través de un OCR que no es tan bueno comparado con los nuevos sistemas.

Ante esta situación, lo que se puede hacer es pasar los pdfs por un OCR moderno, en particular <strong>teseract</strong> que es un sistema de software libre con modelos competitivos. Además existe la librería <em>pytesseract</em> que da acceso al OCR desde python y que junto con la librería <em>pdf2image</em> hacen el proceso muy fácil. Una consideración aquí es que el proceso es lento ⏳ (cuatro días en una laptop 💻). El código que hace esta función se encuentra asociado al comando download_pdf_populate_text.

El resultado del proceso de OCR es un archivo en formato de texto con el texto recuperado del proceso de OCR, a diferencia de extraer texto, este método genera un texto por archivo que corresponde a toda la tesis. Sin embargo hay varios problemas a tener en cuenta:

  • Tesis cuya fuente fue la digitalización, escaneo, y que originalmente fueron escritas en máquina de escribir contienen muchos errores, pero con tesseract al menos se produce una mejor transcripción que la introducida durante la digitalización 😉
  • Este problema es temporal, tesis más recientes tienen menos errores.
  • Otra fuente de diferencias es que tesis viejitas tienen a usar la separación de palabras cuando se alcanza el final del margen usando el guión (-). Tesis más recientes tienden a usar un justificado por espaciado entre palabras.
  • La mayoría de las tesis en sus primeras páginas contiene la misma información proveniente de un aviso legal de las Tesis UNAM.

Ahora que se tienen los textos, es necesario “limpiarlos” que consiste en quitar elementos que no ayuden al análisis. Este es un proceso de mucho colmillo y dependerá de la experiencia de cada quien como decide limpiar su texto.

En particular, en esta ocasión utilicé esta expresión regular:

content = re.sub(r"[^a-zA-Z0-9\sáéíóúñÑÁÉÍÓÚ]", " ", content)

La función es quedarnos sólo con lo que sea una “palabra”, signos de puntuación, espaciado, y etc. se “ignoran”. Otra transformación que se hace para poder comparar de forma más libre los textos es pasar todo a minúsculas. Finalmente, una transformación habitual es eliminar palabras comunes y muy frecuentes (llamadas funcionales) como: el, que o una. Afortunadamente existen librerías con una selección de estas palabras para español <em>stop-words</em> . El efecto esperado de ejemplifica en la siguiente tabla:

Texto original Texto “limpio”
El gato, Minino, camina sobre la barda, su sombra se refleja en el piso. gato minino camina sobre barda sombra refleja piso

Comparar dos tesis

Ahora que se tiene el texto “limpio” se puede comparar dos tesis directamente, como queremos ver como se influyeron las tesis tenemos que comparar todas contra todas. Aunque podemos aprovechar el hecho que la tesis A comparada con B, nos da el mismo resultado que B con A. Es decir solo tenemos que hacer la mitad de comparaciones.

Para comparar dos textos existen varias técnicas ; sin embargo en este caso queremos encontrar segmentos similares. Para lograr esto me incliné por la estrategia de extraer secuencias “largas” de palabras (secuencias de tamaño 10 que en el campo llamamos <em>n-gramas</em> ) y ver cuantas de estas secuencias se comparten entre dos tesis. Para lograr identificar los n-gramas del texto se extraen n palabras consecutivas, y en lugar de extraer las siguientes 10, lo que se hace es que nos movemos una palabra y comenzamos una nueva secuencia a partir de estas. Es decir las secuencias son continuas, en lugar de ser secuenciales; esto nos da más chance de encontrar secuencias comunes. En el caso del script esta función se consolida en el comando similar_content que crea un archivo con la información de todas las comparaciones.

Para generar las siguientes visualizaciones se creo un Notebook que guía la graficación y da algunas opciones de explorar los datos. La siguiente figura ilustra todas las comparaciones posibles. Como se explicó anteriormente sólo se hacen la mitad de comparaciones. Se puede observar que hay varios casos en donde dos tesis comparten secuencias de palabras, el color morado representa en decenas, el rojizo en centenas y el amarillo en miles! También podemos ver que hay documentos que no comparten secuencias con ningún otro documento, lineas en blanco.

View post on imgur.com

Esta gráfica pareciera muy malas noticias ya que existe una gran interacción entre la mayoría de las tesis, sin embargo hay que considerar que las tesis son en derecho, en particular derecho laboral y tienden a citar el mismo conjunto de leyes; además usan bibliografía similar. Aquí entra un punto de decisión que tenemos que determinar: ¿cuándo consideramos que una tesis coincide con otra tesis de forma no habitual? Abajo la imagen para cuando comparten más de 300 secuencias de palabras:

View post on imgur.com

Está última gráfica nos puede generar un poco de paz, se observa menos interacción entre las tesis. Hay que tener en cuenta que las tesis están organizadas en forma cronológica donde número cercanos a cero corresponden a tesis viejitas y números altos a tesis recientes. Por supuesto, podríamos hacer todavía más estricto el umbral y pedir más de mil coincidencias

View post on imgur.com

4. Crear el grafo

Finalmente no hay que olvidar el adagio: matrices son grafos, grafos son matrices . Por lo tanto podemos extraer un grafo de nuestras matrices de número de coincidencias. Además como sabemos que tesis fue “primera” se puede hacer un grafo dirigido que representa “influencia” de una tesis a otra (esto con el supuesto que una tesis se redactó antes de la otra tal y como lo indica el registro del repositorio de tesis UNAM , esto es de particular interés para las tesis marcadas con los numerales 7 y 9, ambas son de 2000). Para generar los grafos usamos la librería <em>networkx</em> . Aquí el grafo de coincidencias e influencias entre las tesis que tienen más de mil coincidencias entre ellas.

View post on imgur.com

Estas son tesis que comparten varios segmentos entre estos; los nodos están marcados con los años y los arcos con la cantidad de coincidencias donde esas coincidencias fueron mayor de 1,000. Y podemos ver el segmento con mayor coincidencia abajo para el par de documentos con mayor intersección:

View post on imgur.com

En el grafo no aparecen las tesis que desencadenaron estas notas ya que tienen “pocas” coincidencias. Esto se debe a que ambas son tesis que fueron escritas con máquina de escribir y el OCR introduce varios errores y se rompen secuencias (por ejemplo, a veces detecta el acento y a veces no). Sin embargo podemos extraer un grafo relajando el numero de coincidencias a 300, con esto obtenemos la siguiente gráfica. El nodo 0 y 2 corresponden a las tesis, en color rojo y con mayor tamaño.

View post on imgur.com

¿Qué sigue?

Como pueden ver hay más preguntas que respuestas

  • ¿Cómo podemos mejorar el OCR para tesis escritas a máquina de escribir?
  • ¿Cómo decidir con mayor claridad cuando existe “influencia”?
  • ¿Cómo medir para fraseo e incorporarlo en el grafo?
  • ¿Cómo expandir esto a un número mayor tesis?
  • etc.

Algunos pendientes:

  • Lidiar con números de página que rompen las secuencias
  • Trabajar lematización, para no depender de cambios de conjugación
  • Remover acentos durante la comparación
  • Incorporar código para comparar figuras
  • Incorporar una base de datos textual
  • Estructurar mejor los archivos, para poder buscar en varios niveles
  • Hacer una interfaz gráfica… ?
  • Etc

Lecciones aprendidas

  • Cuando se trabaje con pdfs fuentes escaneadas, utilizar el OCR; cuando no también
  • n-gramas largos apoyan a identificar segmentos de texto compartido entre documentos
  • Las matrices son grafos, los grafos son matrices

Algunas cosas que me quedé pensando:

  • Las tesis UNAM deberían ser más abiertas con fichas de estas y sus correspondientes archivos.
  • Las herramientas antiplágio deberían estar accesibles para estudiantes y sinodales durante el proceso de títulación; así podemos entender el contexto cuando un texto se comparten entre dos documentos.

comments powered by Disqus