Corrección ortográfica en Python con TextBlob

C

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—directly 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—directly 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—directly 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad