Menu iconMenu icon
Algoritmos y Estructuras de Datos con Python

Capítulo 9: Descifrando Cadenas y Patrones

Ejercicios Prácticos para el Capítulo 9

Los siguientes ejercicios ofrecen aplicaciones prácticas de los conceptos discutidos en el Capítulo 9. Brindan experiencia práctica con algoritmos de cadenas y técnicas de análisis de texto, reforzando la comprensión y demostrando la utilidad de estos métodos en escenarios del mundo real.

Ejercicio 1: Implementar el Algoritmo de Boyer-Moore para la Búsqueda de Patrones

  • Objetivo: Escribir una función para realizar el algoritmo de búsqueda de cadenas de Boyer-Moore, un método eficiente para encontrar subcadenas en cadenas de texto más grandes.
  • Nota: El algoritmo de Boyer-Moore es complejo, centrándose en la heurística del "carácter malo".

Solución:

def boyer_moore_search(text, pattern):
    def bad_char_heuristic(pattern):
        bad_char = [-1] * 256
        for i in range(len(pattern)):
            bad_char[ord(pattern[i])] = i
        return bad_char

    m = len(pattern)
    n = len(text)
    bad_char = bad_char_heuristic(pattern)
    s = 0

    while s <= n - m:
        j = m - 1
        while j >= 0 and pattern[j] == text[s + j]:
            j -= 1
        if j < 0:
            return f"Pattern occurs at shift {s}"
            s += (m - bad_char[ord(text[s + m])] if s + m < n else 1)
        else:
            s += max(1, j - bad_char[ord(text[s + j])])
    return "Pattern not found"

# Example Usage
text = "ABAAABCD"
pattern = "ABC"
print(boyer_moore_search(text, pattern))  # Output: Pattern occurs at shift 4

Ejercicio 2: Crear una Expresión Regular Básica para la Extracción de Correos Electrónicos

  • Objetivo: Escribir un patrón de expresión regular para extraer direcciones de correo electrónico de una cadena dada.
  • Nota: La expresión regular debe coincidir con los formatos de correo electrónico más comunes.

Solución:

import re

def extract_emails(text):
    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'
    return re.findall(pattern, text)

# Example Usage
text = "Please contact us at info@example.com or support@domain.org."
print(extract_emails(text))  # Output: ['info@example.com', 'support@domain.org']

Ejercicio 3: Implementación de una Construcción Simple de un Sufijo de Matriz

  • Objetivo: Construir una matriz de sufijos para una cadena de texto dada.
  • Nota: Las matrices de sufijos son una forma eficiente de almacenar y buscar subcadenas.

Solución:

def build_suffix_array(s):
    return sorted(range(len(s)), key=lambda k: s[k:])

# Example Usage
text = "banana"
print(build_suffix_array(text))  # Output: Suffix array indices for the string "banana"

Ejercicio 4: Análisis de Sentimientos Utilizando Modelos Pre-entrenados

  • Objetivo: Utilizar un modelo NLP pre-entrenado para realizar análisis de sentimientos en un texto dado.
  • Nota: Este ejercicio asume el acceso a un modelo de análisis de sentimientos pre-entrenado, como los disponibles en bibliotecas como NLTK o TextBlob.

Solución:

from textblob import TextBlob

def analyze_sentiment(text):
    analysis = TextBlob(text)
    return analysis.sentiment

# Example Usage
text = "I love programming in Python!"
print(analyze_sentiment(text))  # Output: Sentiment(polarity=0.5, subjectivity=0.6)

Ejercicios Prácticos para el Capítulo 9

Los siguientes ejercicios ofrecen aplicaciones prácticas de los conceptos discutidos en el Capítulo 9. Brindan experiencia práctica con algoritmos de cadenas y técnicas de análisis de texto, reforzando la comprensión y demostrando la utilidad de estos métodos en escenarios del mundo real.

Ejercicio 1: Implementar el Algoritmo de Boyer-Moore para la Búsqueda de Patrones

  • Objetivo: Escribir una función para realizar el algoritmo de búsqueda de cadenas de Boyer-Moore, un método eficiente para encontrar subcadenas en cadenas de texto más grandes.
  • Nota: El algoritmo de Boyer-Moore es complejo, centrándose en la heurística del "carácter malo".

Solución:

def boyer_moore_search(text, pattern):
    def bad_char_heuristic(pattern):
        bad_char = [-1] * 256
        for i in range(len(pattern)):
            bad_char[ord(pattern[i])] = i
        return bad_char

    m = len(pattern)
    n = len(text)
    bad_char = bad_char_heuristic(pattern)
    s = 0

    while s <= n - m:
        j = m - 1
        while j >= 0 and pattern[j] == text[s + j]:
            j -= 1
        if j < 0:
            return f"Pattern occurs at shift {s}"
            s += (m - bad_char[ord(text[s + m])] if s + m < n else 1)
        else:
            s += max(1, j - bad_char[ord(text[s + j])])
    return "Pattern not found"

# Example Usage
text = "ABAAABCD"
pattern = "ABC"
print(boyer_moore_search(text, pattern))  # Output: Pattern occurs at shift 4

Ejercicio 2: Crear una Expresión Regular Básica para la Extracción de Correos Electrónicos

  • Objetivo: Escribir un patrón de expresión regular para extraer direcciones de correo electrónico de una cadena dada.
  • Nota: La expresión regular debe coincidir con los formatos de correo electrónico más comunes.

Solución:

import re

def extract_emails(text):
    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'
    return re.findall(pattern, text)

# Example Usage
text = "Please contact us at info@example.com or support@domain.org."
print(extract_emails(text))  # Output: ['info@example.com', 'support@domain.org']

Ejercicio 3: Implementación de una Construcción Simple de un Sufijo de Matriz

  • Objetivo: Construir una matriz de sufijos para una cadena de texto dada.
  • Nota: Las matrices de sufijos son una forma eficiente de almacenar y buscar subcadenas.

Solución:

def build_suffix_array(s):
    return sorted(range(len(s)), key=lambda k: s[k:])

# Example Usage
text = "banana"
print(build_suffix_array(text))  # Output: Suffix array indices for the string "banana"

Ejercicio 4: Análisis de Sentimientos Utilizando Modelos Pre-entrenados

  • Objetivo: Utilizar un modelo NLP pre-entrenado para realizar análisis de sentimientos en un texto dado.
  • Nota: Este ejercicio asume el acceso a un modelo de análisis de sentimientos pre-entrenado, como los disponibles en bibliotecas como NLTK o TextBlob.

Solución:

from textblob import TextBlob

def analyze_sentiment(text):
    analysis = TextBlob(text)
    return analysis.sentiment

# Example Usage
text = "I love programming in Python!"
print(analyze_sentiment(text))  # Output: Sentiment(polarity=0.5, subjectivity=0.6)

Ejercicios Prácticos para el Capítulo 9

Los siguientes ejercicios ofrecen aplicaciones prácticas de los conceptos discutidos en el Capítulo 9. Brindan experiencia práctica con algoritmos de cadenas y técnicas de análisis de texto, reforzando la comprensión y demostrando la utilidad de estos métodos en escenarios del mundo real.

Ejercicio 1: Implementar el Algoritmo de Boyer-Moore para la Búsqueda de Patrones

  • Objetivo: Escribir una función para realizar el algoritmo de búsqueda de cadenas de Boyer-Moore, un método eficiente para encontrar subcadenas en cadenas de texto más grandes.
  • Nota: El algoritmo de Boyer-Moore es complejo, centrándose en la heurística del "carácter malo".

Solución:

def boyer_moore_search(text, pattern):
    def bad_char_heuristic(pattern):
        bad_char = [-1] * 256
        for i in range(len(pattern)):
            bad_char[ord(pattern[i])] = i
        return bad_char

    m = len(pattern)
    n = len(text)
    bad_char = bad_char_heuristic(pattern)
    s = 0

    while s <= n - m:
        j = m - 1
        while j >= 0 and pattern[j] == text[s + j]:
            j -= 1
        if j < 0:
            return f"Pattern occurs at shift {s}"
            s += (m - bad_char[ord(text[s + m])] if s + m < n else 1)
        else:
            s += max(1, j - bad_char[ord(text[s + j])])
    return "Pattern not found"

# Example Usage
text = "ABAAABCD"
pattern = "ABC"
print(boyer_moore_search(text, pattern))  # Output: Pattern occurs at shift 4

Ejercicio 2: Crear una Expresión Regular Básica para la Extracción de Correos Electrónicos

  • Objetivo: Escribir un patrón de expresión regular para extraer direcciones de correo electrónico de una cadena dada.
  • Nota: La expresión regular debe coincidir con los formatos de correo electrónico más comunes.

Solución:

import re

def extract_emails(text):
    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'
    return re.findall(pattern, text)

# Example Usage
text = "Please contact us at info@example.com or support@domain.org."
print(extract_emails(text))  # Output: ['info@example.com', 'support@domain.org']

Ejercicio 3: Implementación de una Construcción Simple de un Sufijo de Matriz

  • Objetivo: Construir una matriz de sufijos para una cadena de texto dada.
  • Nota: Las matrices de sufijos son una forma eficiente de almacenar y buscar subcadenas.

Solución:

def build_suffix_array(s):
    return sorted(range(len(s)), key=lambda k: s[k:])

# Example Usage
text = "banana"
print(build_suffix_array(text))  # Output: Suffix array indices for the string "banana"

Ejercicio 4: Análisis de Sentimientos Utilizando Modelos Pre-entrenados

  • Objetivo: Utilizar un modelo NLP pre-entrenado para realizar análisis de sentimientos en un texto dado.
  • Nota: Este ejercicio asume el acceso a un modelo de análisis de sentimientos pre-entrenado, como los disponibles en bibliotecas como NLTK o TextBlob.

Solución:

from textblob import TextBlob

def analyze_sentiment(text):
    analysis = TextBlob(text)
    return analysis.sentiment

# Example Usage
text = "I love programming in Python!"
print(analyze_sentiment(text))  # Output: Sentiment(polarity=0.5, subjectivity=0.6)

Ejercicios Prácticos para el Capítulo 9

Los siguientes ejercicios ofrecen aplicaciones prácticas de los conceptos discutidos en el Capítulo 9. Brindan experiencia práctica con algoritmos de cadenas y técnicas de análisis de texto, reforzando la comprensión y demostrando la utilidad de estos métodos en escenarios del mundo real.

Ejercicio 1: Implementar el Algoritmo de Boyer-Moore para la Búsqueda de Patrones

  • Objetivo: Escribir una función para realizar el algoritmo de búsqueda de cadenas de Boyer-Moore, un método eficiente para encontrar subcadenas en cadenas de texto más grandes.
  • Nota: El algoritmo de Boyer-Moore es complejo, centrándose en la heurística del "carácter malo".

Solución:

def boyer_moore_search(text, pattern):
    def bad_char_heuristic(pattern):
        bad_char = [-1] * 256
        for i in range(len(pattern)):
            bad_char[ord(pattern[i])] = i
        return bad_char

    m = len(pattern)
    n = len(text)
    bad_char = bad_char_heuristic(pattern)
    s = 0

    while s <= n - m:
        j = m - 1
        while j >= 0 and pattern[j] == text[s + j]:
            j -= 1
        if j < 0:
            return f"Pattern occurs at shift {s}"
            s += (m - bad_char[ord(text[s + m])] if s + m < n else 1)
        else:
            s += max(1, j - bad_char[ord(text[s + j])])
    return "Pattern not found"

# Example Usage
text = "ABAAABCD"
pattern = "ABC"
print(boyer_moore_search(text, pattern))  # Output: Pattern occurs at shift 4

Ejercicio 2: Crear una Expresión Regular Básica para la Extracción de Correos Electrónicos

  • Objetivo: Escribir un patrón de expresión regular para extraer direcciones de correo electrónico de una cadena dada.
  • Nota: La expresión regular debe coincidir con los formatos de correo electrónico más comunes.

Solución:

import re

def extract_emails(text):
    pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'
    return re.findall(pattern, text)

# Example Usage
text = "Please contact us at info@example.com or support@domain.org."
print(extract_emails(text))  # Output: ['info@example.com', 'support@domain.org']

Ejercicio 3: Implementación de una Construcción Simple de un Sufijo de Matriz

  • Objetivo: Construir una matriz de sufijos para una cadena de texto dada.
  • Nota: Las matrices de sufijos son una forma eficiente de almacenar y buscar subcadenas.

Solución:

def build_suffix_array(s):
    return sorted(range(len(s)), key=lambda k: s[k:])

# Example Usage
text = "banana"
print(build_suffix_array(text))  # Output: Suffix array indices for the string "banana"

Ejercicio 4: Análisis de Sentimientos Utilizando Modelos Pre-entrenados

  • Objetivo: Utilizar un modelo NLP pre-entrenado para realizar análisis de sentimientos en un texto dado.
  • Nota: Este ejercicio asume el acceso a un modelo de análisis de sentimientos pre-entrenado, como los disponibles en bibliotecas como NLTK o TextBlob.

Solución:

from textblob import TextBlob

def analyze_sentiment(text):
    analysis = TextBlob(text)
    return analysis.sentiment

# Example Usage
text = "I love programming in Python!"
print(analyze_sentiment(text))  # Output: Sentiment(polarity=0.5, subjectivity=0.6)