Esta función fue inspirada en la normalización usada por varios participantes del Mercado Libre Challenge 2019. Algunas de las normalizaciones en las que me inspiré fueron esta, esta y esta
from unicodedata import normalize
import re
def normalizar_texto(texto):
# Garantiza que el parametro es texto
texto_normalizado = str(texto)
# Transforma el texto en minúsculas
texto_normalizado = texto_normalizado.lower()
# Quita las tildes a las palabras, la dieresis a la ü y la ~ a la ñ
texto_normalizado = normalize(
'NFKD', texto_normalizado).encode('ascii', errors='ignore').decode('utf-8')
# Reemplaza los números por ceros
texto_normalizado = re.sub(r'\d', '0', texto_normalizado)
# Reemplaza puntos por comas (esto lo hago por los números decimales)
texto_normalizado = re.sub(r'\.', ',', texto_normalizado)
# Quita las comas que no estén entre números
texto_normalizado = re.sub(r'(?<!\d),(?!\d)', ' ', texto_normalizado)
# Quita los caracteres que no sean letras, números o comas, como signos de puntuación (diferentes de la coma)
texto_normalizado = re.sub(r'[^a-z0,]', ' ', texto_normalizado)
# Quita los espacios que sobren entre palabras
texto_normalizado = re.sub(r'[\s\n\r]+', ' ', texto_normalizado)
# Quita los espacios al comienzo y al final del texto
texto_normalizado = texto_normalizado.strip(' \n\t\r')
return texto_normalizado
Este código usa bastantes expresiones regulares, por lo que te recomiendo echarle una mirada a mi post sobre expresiones regulares
Usando la función anterior el texto
Hola, mi nombre es Juan Beleño, tengo 28 años y mido 1.76cm - estudié en la UNICAMP.
se convertiría en
hola mi nombre es juan beleno tengo 00 anos y mido 0,00cm estudie en la unicamp
Nota: No me gusta quitar las stop words en la normalización porque ya que al parecer esto perjudica la predicción de modelos de clasificación de texto