• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Simulador FIRE (Financial Independence, Retire Early)
    • Herramientas
      • Formateador / Minificador de JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Medir la similitud de archivos con Python

marzo 30, 2020 Por Daniel Rodríguez 3 comentarios
Tiempo de lectura: 3 minutos

Una de las grandes ventajas de los sistemas informáticos es la facilidad con la que se puede copiar y modificar los archivos. Cuando tenemos que repetir un análisis que ya hemos realizado previamente, sea este en una hoja de cálculo, un Jupyter Notebook o con cualquier otra herramienta, podemos partir de este y modificar adecuadamente los datos. Esto que nos no reinventar los procesos cada vez, facilita actividades no deseadas como puede ser la copia. Por eso vamos a ver como crear un método para medir la similitud de archivos con Python. Para lo que nos basaremos en la clase SequenceMatcher que hemos visto recientemente.

Medir la similitud de dos secuencias con SequenceMatcher

La clase SequenceMatcher que hemos visto reciéntemente permite crear objetos que identifican las subsecuencias comunes dentro de secuencias más grandes. Ofreciendo una métrica de la similitud entre ellas. Los archivos no son más que secuencias. Por ejemplo, los archivos Jupyter Notebook no son más que un documento con formato JSON. Lo que se puede comprobar al abrir un archivo de estos en cualquier editor texto.

Así, si importamos dos archivos podemos tener una idea de los similares que son simplemente con la línea

SequenceMatcher(None, file_A, file_A).ratio()

Lo que nos devolverá un valor entre 0 y 1. Indiciado 1 que ambos son el mismo archivo. Un valor que tiene en cuenta posible rotaciones del contenido de la secuencia.

Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
En Analytics Lane
Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane

Método para detectar documentos similares

Así podemos crear un método que nos permita identificar archivos que son similares. Método al que le indicaremos una ruta de búsqueda en la que localizara todos los archivos y los con la clase SequenceMatcher. Una vez terminada la comparación puede ordenar los archivos en base a los similares que son.

Una posible implementación es:

from glob import glob
from difflib import SequenceMatcher
from tqdm import tqdm

def get_similarity_in_folder(path='./', ext='*', progress=False):
    # Obtención de los archivos
    files = glob(path + ext)
    num_files = len(files)
    
    results =  dict()
    
    # Barra de progreso
    if progress:
        pbar = tqdm(total= num_files * (num_files - 1) / 2)
    
    for i in range(num_files-1):
        # Primer fichero
        file_i = open(files[i]).read()
        name_i = files[i].split('/')[2]
        
        for j in range(i+1, num_files):
            # Segudo fichero
            file_j = open(files[j]).read()
            name_j = files[j].split('/')[2]
            
            # Obtención de ratio
            results[(name_i, name_j)] = SequenceMatcher(None, file_i, file_j).ratio()
            
            # Actualiza barra de progreso
            if progress:
                pbar.update(1)
                    
    results = sorted(results.items(), key=lambda x: x[1], reverse=True)
    
    # Finaliza barra de progreso
    if progress:
        pbar.close()
    
    return results

En donde se ha utilizado glob para obtener el listado de archivos. Una vez obtenidos estos se puede compara cada par de archivos con dos bucles. Dado que el valor de la ratio es simétrico, es decir, la ratio de A y B es el mismo que el de B y A el segundo bucle no tiene porqué recorrer todos los archivos, solo los que no se han analizado previamente.

Los resultados se guardan en un diccionario, donde la clave es una tupla con los nombres de los dos archivos. Finalmente se ordenan con el método sorted() en orden inverso, de más a menos similares.

Como la tarea puede ser lenta se ha incluido la opción de una barra de progreso, utilizando el módulo tqdm visto anteriormente.

Publicidad


Comparativa

Para ver si este método se puede usar para detectar cuadernos de Jupyter con ligeras modificaciones hemos creado un cuaderno con 3 celdas. Hemos copiado el archivo y ejecutado las celdas. Posteriormente hemos rotado el orden de las celdas, el cual también hemos copiado y ejecutado el archivo. Por lo que tenemos cuatro documentos que son básicamente el mismo con ligeras modificaciones. El método nos ha dado los siguientes resultados:

Archivo 1Archivo 2Ratio
basebase ejecutado0,84
rotado ejecutadorotado0,84
rotado ejecutadobase ejecutado0,76
baserotado0,75
base ejecutadorotado0,64
baserotado ejecutado0,63

Podemos ver que ejecutar el Notebook baja el valor de la ratio a 0,84 solo con cuatro celdas. Rotarlo lo baja aún más a 0,76. Rotarlo y ejecutarlo lo baja a 0,63. Hay que tener en cuenta que es un documento pequeño, por lo que en documentos más grandes posiblemente los valores sean mayores.

Conclusiones

Hemos visto un método para medir la similitud de archivos con Python que se puede utilizar para detectar si los cuadernos Jupyter son similares entre sí de una forma automática. Posiblemente el documento proceso pueda ser optimizado eliminado adecuadamente subcadenas que se pueden considerar “basura”.

Imagen de quhl en Pixabay

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Nuevo simulador FIRE en el laboratorio de aplicaciones de Analytics Lane
  • Nueva calculadora de préstamos e hipotecas en el laboratorio de aplicaciones de Analytics Lane
  • Hardening avanzado de NGINX: CSP, OCSP Stapling y defensa en profundidad
  • Nuevo generador y verificador de hashes en el laboratorio de aplicaciones de Analytics Lane
  • Nueva simulación de la estrategia Martingala en ruleta en el laboratorio de aplicaciones de Analytics Lane
  • Exactitud, precisión, recall… y los errores que cometemos al interpretarlas en proyectos reales
  • Nuevo simulador del problema de Monty Hall en el laboratorio de aplicaciones de Analytics Lane
  • Nuevo simulador interactivo de K-Means en el laboratorio de aplicaciones de Analytics Lane
  • Por qué los chatbots de inteligencia artificial parecen estar siempre de acuerdo contigo – Conversar con una inteligencia artificial – Parte I

Publicado en: Ciencia de datos, Python

Interacciones con los lectores

Comentarios

  1. Fernanda dice

    octubre 6, 2022 a las 5:48 pm

    Como es que se debe escribir el path para utilizar esta funcion?

    Responder
    • Daniel Rodríguez dice

      octubre 6, 2022 a las 7:08 pm

      Se puede usar tanto la ruta relativa, por ejemplo, para una carpeta test que se encuentra junto al archivo Python con el código

      get_similarity_in_folder('./test/')

      o la ruta absoluta a la carpeta

      get_similarity_in_folder('/Users/analyticslane/test/')

      Responder
      • Daniel Rodríguez dice

        octubre 12, 2022 a las 1:09 pm

        El texto encontrado es el que pasa el filtro aplicado, por lo que lo tendrás en la columna correspondiente del DataFrame.

        Responder

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane

abril 21, 2026 Por Daniel Rodríguez

Chatbots vs redes sociales: la diferencia clave entre la inteligencia artificial y los algoritmos de recomendación – Conversar con una inteligencia artificial – Parte II

abril 21, 2026 Por Daniel Rodríguez

Nueva Calculadora de Estadísticos Descriptivos en el laboratorio de aplicaciones de Analytics Lane

abril 20, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Buscar en Excel con dos o más criterios publicado el septiembre 7, 2022 | en Herramientas
  • Gráfica con los datos y las anomalías detectadas con OneClass SVM One-Class SVM: Detección de anomalías con máquinas de vector soporte publicado el marzo 15, 2024 | en Ciencia de datos
  • Nueva herramienta: Comparador y Formateador de Texto y JSON en el laboratorio de Analytics Lane publicado el abril 21, 2026 | en Noticias
  • Método del codo (Elbow method) para seleccionar el número óptimo de clústeres en K-means publicado el junio 9, 2023 | en Ciencia de datos
  • Cómo desinstalar Oracle Database 19c en Windows publicado el noviembre 25, 2022 | en Herramientas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.9 (11)

Pandas: Cambiar los tipos de datos en los DataFrames

Comentarios recientes

  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto