Correcci贸n ortogr谩fica en Python con TextBlob

    Introducci贸n

    Los errores ortogr谩ficos son comunes y la mayor铆a de la gente est谩 acostumbrada a que el software indique si se cometi贸 un error. Desde la autocorrecci贸n en nuestros tel茅fonos hasta el subrayado en rojo en los editores de texto, la correcci贸n ortogr谩fica es una caracter铆stica esencial para muchos productos diferentes.

    El primer programa que implement贸 el corrector ortogr谩fico se escribi贸 en 1971 para el DEC PDP-10. Llamado SPELL, era capaz de realizar solo comparaciones simples de palabras y detectar diferencias de una o dos letras. A medida que el hardware y el software avanzan, tambi茅n lo han hecho los correctores ortogr谩ficos. Los correctores ortogr谩ficos modernos son capaces de manejar la morfolog铆a y utilizar estad铆sticas para mejorar las sugerencias.

    Python ofrece muchos m贸dulos para usar con este prop贸sito, lo que hace que escribir un simple corrector ortogr谩fico sea una prueba f谩cil de 20 minutos.

    Una de estas bibliotecas es TextBlob, que se utiliza para el procesamiento del lenguaje natural que proporciona una API intuitiva para trabajar.

    En este art铆culo veremos c贸mo implementar la correcci贸n ortogr谩fica en Python con TextBlob.

    Tabla de contenido

    • Instalaci贸n
    • El m茅todo correct ()
    • Exactitud
    • Formaci贸n TextBlob

    Instalaci贸n

    Primero, necesitaremos instalar TextBlob, ya que no viene preinstalado. Abra una consola e inst谩lela usando pip:

    $ pip install textblob
    

    Esto deber铆a instalar todo lo que necesitamos para este proyecto. Al finalizar la instalaci贸n, la salida de la consola deber铆a incluir algo como:

    Successfully installed click-7.1.2 joblib-0.17.0 nltk-3.5 regex-2020.11.13 textblob-0.15.3
    

    TextBlob est谩 construido sobre NLTK, por lo que tambi茅n viene con la instalaci贸n.

    La funci贸n correcta ()

    La forma m谩s sencilla de corregir el texto de entrada es utilizar el correct() m茅todo. El texto de ejemplo que usaremos es un p谩rrafo de “Sobre el origen de las especies” de Charles Darwin, que es parte del dominio p煤blico, empaquetado en un archivo llamado text.txt.

    Adem谩s, agregaremos algunos errores ortogr谩ficos deliberados:

    As far as I am abl to judg, after long attnding to the sbject, the condiions of lfe apear to act in two ways鈥攄irectly on the whle organsaton or on certin parts alne and indirectly by afcting the reproducte sstem. Wit respct to te dirct action, we mst bea in mid tht in every cse, as Profesor Weismann hs latly insistd, and as I have inidently shwn in my wrk on "Variatin undr Domesticcation," thcere arae two factrs: namly, the natre of the orgnism and the natture of the condiions. The frmer sems to be much th mre importannt; foor nealy siimilar variations sometimes aris under, as far as we cn juddge, disimilar conditios; annd, on te oter hannd, disssimilar variatioons arise undder conditions which aappear to be nnearly uniiform. The efffects on tthe offspring arre ieither definnite or in definite. They maay be considdered as definnite whhen allc or neearly all thhe ofefspring off inadividuals exnposed tco ceertain conditionas duriing seveal ggenerations aree moodified in te saame maner.
    

    Est谩 lleno de errores ortogr谩ficos, en casi todas las palabras. Escribamos un script simple, usando TextBlob, para corregir estos errores e imprimirlos en la consola:

    from textblob import TextBlob
    
    with open("text.txt", "r") as f:        # Opening the test file with the intention to read
        text = f.read()                     # Reading the file
        textBlb = TextBlob(text)            # Making our first textblob
        textCorrected = textBlb.correct()   # Correcting the text
        print(textCorrected)
    

    Si ha trabajado con TextBlob antes, este flujo le resultar谩 familiar. Hemos le铆do el archivo y su contenido y hemos construido un TextBlob instancia pasando el contenido al constructor.

    Luego, ejecutamos el correct() funci贸n en ese caso para realizar la correcci贸n ortogr谩fica.

    Despu茅s de ejecutar el script anterior, deber铆a obtener un resultado similar a:

    Is far as I am all to judge, after long attending to the subject, the conditions of life appear to act in two ways鈥攄irectly on the while organisation or on certain parts alone and indirectly by acting the reproduce system. It respect to te direct action, we must be in mid the in every case, as Professor Weismann he lately insisted, and as I have evidently shown in my work on "Variation under Domesticcation," there are two facts: namely, the nature of the organism and the nature of the conditions. The former seems to be much th are important; for nearly similar variations sometimes arms under, as far as we in judge, similar condition; and, on te other hand, disssimilar variations arise under conditions which appear to be nearly uniform. The effects on the offspring are either definite or in definite. They may be considered as definite when all or nearly all the offspring off individuals exposed to certain conditions during several generations are modified in te same manner.
    

    驴Qu茅 tan correcta es la correcci贸n ortogr谩fica de TextBlob?

    Como podemos ver, el texto todav铆a tiene algunos errores ortogr谩ficos. Palabras como "abl" se supon铆a que iban a ser "able"no "all". Aunque, incluso con estos, sigue siendo mejor que el original.

    Ahora viene la pregunta, 驴cu谩nto mejor es?

    El siguiente fragmento de c贸digo es un script simple que prueba qu茅 tan bueno es TextBlob para corregir errores, seg煤n este ejemplo:

    from textblob import TextBlob
    
    # A function that compares two texts and returns 
    # the number of matches and differences
    def compare(text1, text2):  
        l1 = text1.split()
        l2 = text2.split()
        good = 0
        bad = 0
        for i in range(0, len(l1)):
            if l1[i] != l2[i]:
                bad += 1
            else:
                good += 1
        return (good, bad)
    
    # Helper function to calculate the percentage of misspelled words
    def percentageOfBad(x):
        return (x[1] / (x[0] + x[1])) * 100
    

    Ahora, con esas dos funciones, realicemos un an谩lisis r谩pido:

    with open("test.txt", "r") as f1: # test.txt contains the same typo-filled text from the last example 
        t1 = f1.read()
    
    with open("original.txt", "r") as f2: # original.txt contains the text from the actual book 
        t2 = f2.read()
    
    t3 = TextBlob(t1).correct()
    
    mistakesCompOriginal = compare(t1, t2)
    originalCompCorrected = compare(t2, t3)
    mistakesCompCorrected = compare(t1, t3)
    
    print("Mistakes compared to original ", mistakesCompOriginal)
    print("Original compared to corrected ", originalCompCorrected)
    print("Mistakes compared to corrected ", mistakesCompCorrected, "n")
    
    print("Percentage of mistakes in the test: ", percentageOfBad(mistakesCompOriginal), "%")
    print("Percentage of mistakes in the corrected: ", percentageOfBad(originalCompCorrected), "%")
    print("Percentage of fixed mistakes: ", percentageOfBad(mistakesCompCorrected), "%", "n")
    

    Ejecutarlo imprimir谩:

    Mistakes compared to original  (126, 194)
    Original compared to corrected  (269, 51)
    Mistakes compared to corrected  (145, 175) 
    
    Percentage of mistakes in the test:  60.62499999999999 %
    Percentage of mistakes in the corrected:  15.937499999999998 %
    Percentage of fixed mistakes:  54.6875 % 
    

    Como podemos ver, el correct El m茅todo logr贸 obtener nuestro porcentaje de errores ortogr谩ficos del 60.6% al 15.9%, lo cual es bastante decente, sin embargo, hay un peque帽o problema. Corrigi贸 el 54,7% de las palabras, entonces, 驴por qu茅 todav铆a hay una tasa de error del 15,9%?

    La respuesta es sobrecorrecci贸n. A veces, puede cambiar una palabra que est谩 escrita correctamente, como la primera palabra en nuestro texto de ejemplo donde "As" fue corregido a "Is". Otras veces, simplemente no tiene suficiente informaci贸n sobre la palabra y el contexto para decir qu茅 palabra el usuario ten铆a la intenci贸n de escribir, por lo que adivina que deber铆a reemplazarla. "whl" con "while" en vez de "whole".

    No existe un corrector ortogr谩fico perfecto porque gran parte del lenguaje hablado es contextual, as铆 que t茅ngalo en cuenta. En la mayor铆a de los casos de uso, hay muchos menos errores que en nuestro ejemplo, por lo que TextBlob deber铆a poder funcionar lo suficientemente bien para el usuario promedio.

    Entrenamiento de TextBlob con conjuntos de datos personalizados

    驴Qu茅 sucede si desea corregir la ortograf铆a en otro idioma que no es compatible con TextBlob de inmediato? 驴O tal vez quieres ser un poco m谩s preciso? Bueno, podr铆a haber una forma de lograrlo. Todo se reduce a la forma en que funciona la revisi贸n ortogr谩fica en TextBlob.

    TextBlob utiliza estad铆sticas del uso de palabras en ingl茅s para hacer sugerencias inteligentes sobre qu茅 palabras corregir. Mantiene estas estad铆sticas en un archivo llamado en-spelling.txt, pero tambi茅n le permite crear su propio archivo de estad铆sticas de uso de palabras.

    Intentemos hacer uno para nuestro ejemplo de Darwin. Usaremos todas las palabras en “Sobre el origen de las especies” para entrenar. Puede usar cualquier texto, solo aseg煤rese de que tenga suficientes palabras, que sean relevantes para el texto que desea corregir.

    En nuestro caso, el resto del libro proporcionar谩 un gran contexto e informaci贸n adicional que TextBlob necesitar铆a para ser m谩s preciso en la correcci贸n.

    Reescribamos el gui贸n:

    from textblob.en import Spelling        
    import re
    
    textToLower = ""
    
    with open("originOfSpecies.txt","r") as f1:           # Open our source file
    	text = f1.read()                                  # Read the file                 
    	textToLower = text.lower()                        # Lower all the capital letters
    
    words = re.findall("[a-z]+", textToLower)             # Find all the words and place them into a list    
    oneString = " ".join(words)                           # Join them into one string
    
    pathToFile = "train.txt"                              # The path we want to store our stats file at
    spelling = Spelling(path = pathToFile)                # Connect the path to the Spelling object
    spelling.train(oneString, pathToFile)                 # Train
    

    Si miramos en el train.txt archivo, veremos:

    a 3389
    abdomen 3
    aberrant 9
    aberration 5
    abhorrent 1
    abilities 1
    ability 4
    abjectly 1
    able 54
    ably 5
    abnormal 17
    abnormally 2
    abodes 2
    ...
    

    Esto indica que la palabra "a" aparece como una palabra 3389 veces, mientras que "ably" aparece solo 5 veces. Para probar este modelo entrenado, usaremos suggest(text) en vez de correct(text), que es una lista de tuplas de confianza de palabras. Los primeros elementos de la lista ser谩n la palabra en la que tenga m谩s confianza, por lo que podemos acceder a ella a trav茅s de suggest(text)[0][0].

    Tenga en cuenta que esto puede ser m谩s lento, as铆 que vaya palabra por palabra mientras revisa la ortograf铆a, ya que descargar grandes cantidades de datos puede provocar un bloqueo:

    from textblob.en import Spelling        
    from textblob import TextBlob
    
    pathToFile = "train.txt" 
    spelling = Spelling(path = pathToFile)
    text = " "
    
    with open("test.txt", "r") as f: 
    	text = f.read()
    
    words = text.split()
    corrected = " "
    for i in words :
        corrected = corrected +" "+ spelling.suggest(i)[0][0] # Spell checking word by word
    
    print(corrected)
    

    Y ahora, esto resultar谩 en:

    As far as I am all to judge after long attending to the subject the conditions of life appear to act in two ways鈥攄irectly on the whole organisation or on certain parts alone and indirectly by acting the reproduce system It respect to the direct action we most be in mid the in every case as Professor Weismann as lately insisted and as I have incidently shown in my work on "Variatin under Domesticcation," there are two facts namely the nature of the organism and the nature of the conditions The former seems to be much th are important for nearly similar variations sometimes arise under as far as we in judge dissimilar conditions and on the other hand dissimilar variations arise under conditions which appear to be nearly uniform The effects on the offspring are either definite or in definite They may be considered as definite when all or nearly all the offspring off individuals exposed to certain conditions during several generations are modified in the same manner.
    

    Esto corrige alrededor de 2 de cada 3 palabras mal escritas, lo cual es bastante bueno, considerando la ejecuci贸n sin mucho contexto.

    Conclusi贸n

    En este art铆culo usaremos TextBlob para implementar un corrector ortogr谩fico b谩sico, tanto con el modelo de predicci贸n de valores como con uno personalizado.

    La correcci贸n de errores ortogr谩ficos provocados por el hombre se ha convertido en una tarea com煤n para los desarrolladores de software. Aunque se ha vuelto m谩s f谩cil y eficiente a trav茅s de la miner铆a de datos, muchos errores ortogr谩ficos necesitan que se corrija el contexto.

    En conclusi贸n, es probable que los correctores de pruebas no se queden sin trabajo automatizados en el corto plazo, aunque algunas correcciones b谩sicas pueden automatizarse para ahorrar tiempo y esfuerzo.

     

    Etiquetas:

    Deja una respuesta

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