sábado, 30 de septiembre de 2023

Conteo de vocales de un texto con Python

Conteo de vocales de un texto con Python

Vamos a ver ejemplos de cómo realizar la tarea del conteo de vocales en un texto, desde dos perspectivas y adicional una manera de mejorar el resultado.

Enunciado del problema

Escribir una función que reciba un texto de entrada y como resultado, devuelva el conteo de las vocales existentes en el texto.

Solución 1

Para esta solución, vamos a realizar la iteración del texto, carácter por carácter, para validar si corresponde a una vocal. En caso de serlo realizaremos el respectivo conteo, de lo contrario lo omitiremos.

def countVowelsWithFor(text: str):
    # Inicializamos un diccionario con las vocales todas con valor de cero
    vowels = {v:0 for v in "aeiuo"}
    # Recorremos el texto recibido caracter por caracter
    for c in text:
        # Validamos si el caracter es una vocal
        # Usamos vowels.keys() para recuperar las claves del diccionario
        # que corresponden a la lista de vocales ["a", "e", "i", "o", "u"]
        if c in vowels.keys():
            # Si el caracter es una vocal, incrementamos el conteo en 1
            vowels[c] += 1
    return vowels

De esta manera, si usamos el texto:

validando el conteo de vocales

obtendremos el siguiente resultado:

{'a': 3, 'e': 4, 'i': 1, 'o': 4, 'u': 0}

Solución 2

Para esta solución vamos a evitar realizar la iteración del texto con el ciclo for del caso anterior. En su lugar, vamos a utilizar un método definido en los objetos tipo str (string). El método count() permite recuperar la cantidad de coincidencias de una subcadena.

def countVowelsWithCount(text: str):
    # Inicializamos un diccionario con las vocales todas con valor de cero
    vowels = {v:0 for v in "aeiuo"}
    # Recorremos el listado de vocales definidas en el diccionario
    for v in vowels.keys():
        # Usamos el método count() para recuperar la cantidad
        # de repeticiones que existen en el texto recibido
        # y asignamos el valor a la vocal correspondiente en el diccionario
        vowels[v] = text.count(v)
    return vowels

Con esto vamos a obtener el mismo resultado que en el caso anterior.

Observaciones

Hasta aquí hemos visto dos ejemplos de cómo contar las vocales existentes en un texto, pero aún tenemos algunos inconvenientes:

  • Si las vocales son mayúsculas (A,E,I,O,U), no se las va a contar
  • Si las vocales contienen acentos (á, é, í, ó, ú, ä…), tampoco las va a contar.
    Para solventar esto debemos realizar un preprocesamiento del texto, para limpiarlo y dejarlo en una estructura que nos sirva, por ejemplo el texto:
Este es un gran día para programar en python

Queremos dejarlo limpio, quitando las mayúsculas y las tildes, así:

este es un gran dia para programar en python

Para esto, definiremos una función auxiliar que nos ayude a realizar el preprocesamiento del texto.

# Importamos la función normalize del paquete unicodedata
from unicodedata import normalize
def preprocessing(text: str):
    # Realizamos la limpieza del texto con la función normalize
    # Lo que nos ayudará a cambiar las vocales con acento por vocales normales
    text = normalize('NFKD', text)
    # Otro pao adicional que podemos realizar es la limpiez de caracteres especiales
    # Para esto codificamos el texto como ascii
    text = text.encode('ascii', 'ignore').decode("UTF-8")
    # Finalmente convertimos el texto a minúsculas
    text = text.lower()
    return text

Ahora esta función podemos utilizarla en nuestras funciones de conteo anteriores. En este caso vamos a usar la segunda función, la cual quedaría de la siguiente manera:

def countVowelsWithCount(text: str):
    # Realizamos el preprocesamiento del texto
    text = preprocessing(text)
    # Inicializamos un diccionario con las vocales todas con valor de cero
    vowels = {v:0 for v in "aeiuo"}
    # Recorremos el listado de vocales definidas en el diccionario
    for v in vowels.keys():
        # Usamos el método count() para recuperar la cantidad
        # de repeticiones que existen en el texto recibido
        # y asignamos el valor a la vocal correspondiente en el diccionario
        vowels[v] = text.count(v)
    return vowels

Realizada esta modificación ejecutamos el conteo con la frase propuesta "Este es un gran día para programar en python" obteniendo el siguiente resultado:

{'a': 6, 'e': 4, 'i': 1, 'u': 1, 'o': 2}

El cual difiere del resultado obtenido sin realizar el preprocesamiento, en donde tenemos solamente el conteo de 3 vocales e porque una es mayúscula y ninguna vocal i, porque esta tiene tilde:

{'a': 6, 'e': 3, 'i': 0, 'u': 1, 'o': 2}

No hay comentarios.:

Publicar un comentario