En este artículo veremos un ejercicio sobre spelling corrector en NLP, en específico el algoritmo de Peter Norvig para spell checking.
Peter Norvig, exdirector de calidad de búsqueda en Google, escribió este simple pero eficiente algoritmo para corregir errores ortográficos. Según comenta, lo escribió en un vuelo transcontinental para explicar el funcionamiento de un corrector ortográfico de una manera sencilla.
Ejercicio sobre spelling corrector en NLP
¿Cómo funciona el algoritmo?
El objetivo principal es, dada una palabra w, un conjunto de candidatos que pudieran ser susceptibles de ser su corrección. En principio no podemos conocer si la palabra w es correcta o incorrecta. De ser incorrecta, tampoco conocemos la palabra candidata (de existir) por la que debería corregirse.
De esta manera, se buscará el mejor candidato (corrección) c que, de todos los posibles candidatos, maximice la probabilidad de que, dada la palabra w, sea c la corrección.
Esto es:
argmaxc ∈ candidates P (c | w)
Que por Bayes es equivalente a:
argmaxc ∈ candidates P (c) P (w | c) P (w)
Donde P (w) puede eliminarse al ser la misma para cada posible candidato:
argmaxc ∈ candidates P (c) P (w | c)
Las partes de esta expresión son, por tanto:
- Mecanismo de selección: argmax. Se elige el candidato que maximiza la probabilidad.
- Modelo de candidatos: c ∈ candidates. Elige los candidatos a tener en cuenta.
- Modelo de lenguaje: P (c). La probabilidad de que c aparezca como palabra en un texto (probabilidad de ocurrencia).
- Modelo de error: P (w | c). La probabilidad de que w fuese escrita cuando realmente se quería escribir c.
El ejercicio
Vamos a contar la frecuencia de las palabras, primero sin un filtro y luego con algunos filtros y restricciones de orden numérico.
#Ejercicio sobre spelling corrector en NLP
import re
from collections import Counter
def words (text): return re.findall (r '\w+', text.lower ())
#Ejercicio sobre spelling corrector en NLP
text = ' '.join (list (filter (None, reviews_list)))
WORDS = Counter (words (text))
WORDS.most_common (10)
#Ejercicio sobre spelling corrector en NLP
def P (word, N = sum (WORDS.values ())):
"Probability of 'word'."
return WORDS [word] / N
Entonces:
- WORDS es la frecuencia.
- Los valores son las veces que ocurre.
- N es el tamaño total de palabras que hay en el texto.
#Ejercicio sobre spelling corrector en NLP
def correction (word):
"Most probable spelling correction for word."
return max (candidates (word), key = P)
#Ejercicio sobre spelling corrector en NLP
def candidates (word):
"Generate possible spelling corrections for word."
return (know ([word]) or know (edits1 (word)) or known (edits2 (word)) or [word])
#Ejercicio sobre spelling corrector en NLP
def known (word):
"The subset of 'words' that appear in the dictionary of WORDS."
return set (w for w in words if w in WORDS)
#Ejercicio sobre spelling corrector en NLP
def edits1 (word):
"All edits that are one edit away from 'word'."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word [:i], word [i:]) for i in range (len (word) + 1)]
deletes = [L + R [1:] for L, R in splits if R]
transposes= [L + R [1:] + R [0] + R [2] for L, R in splits if len (R) > 1]
replaces = [L + c + R [1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set (deletes + transposes + replaces + inserts)
#Ejercicio sobre spelling corrector en NLP
def edits2(word):
"All edits that are two edits away from 'word'."
return (e2 for e1 in edits1 (word) for e2 in edits1 (e1))
#Ejercicio sobre spelling corrector en NLP
wrong_words = [
'pelicul',
'guerr',
'perona',
'malha',
'bueena',
'rwsa',
'entrida',
'cime'
]
len (edits1 ('pelicul'))
390
edits1 ('pelicul')
#Ejercicio sobre spelling corrector en NLP
len (list (edits2 ('pelicul')))
162150
list (edits2 ('pelicul'))
#Ejercicio sobre spelling corrector en NLP
print (' {0 : 20} {1 : 20}'.format ('Palabra', 'Corrección'))
for word in wrong_words:
print ('{0 : 20} {1 : 20}'.format (word, correction (word)))
Palabra | Corrección |
pelicul | película |
guerr | guerra |
perona | persona |
malha | mala |
bueena | buena |
rwsa | risa |
entrida | entrada |
cime | cine |
Ahora que has visto nuestro ejercicio sobre spelling corrector en NLP, puedes seguir avanzando en tu proceso formativo. Para poder acceder a las opciones laborales del Big Data, una de las áreas con mejores sueldos y mayor demanda, tenemos para ti el Bootcamp Big Data Full Stack. Con esta formación intensiva adquirirás los conocimientos teóricos y prácticos necesarios para abrirte paso en el mundillo en pocos meses. ¡Da el paso para impulsar tu carrera y entra ahora para pedir información!