El modelo oculto de Markov es un modelo probabilístico usado en la predicción de procesos aleatorios, es decir, no tenemos ningún tipo de medición o conocimiento sobre cómo se pueden hacer esas predicciones. Se denomina oculto porque no sabemos los estados intermedios, sino que simplemente partimos de probabilidades generales a partir de observaciones y vemos cómo se relacionan todas esas observaciones entre sí.
Modelo oculto de Markov
El modelo oculto de Markov, también llamado Hidden Markov Model o HMM, es un modelo estadístico que se utiliza para describir sistemas complejos que evolucionan con el tiempo. Estos sistemas están compuestos por una serie de estados discretos que cambian a lo largo del tiempo, pero no podemos observar directamente qué estado se encuentra en un momento dado. Podemos observar solo una serie de símbolos o eventos que se producen en función del estado en el que se encuentra el sistema.
El modelo oculto de Markov es un modelo generativo que usa una cadena de Markov para modelar la evolución de los estados ocultos y una distribución de probabilidad condicional para modelar la relación entre los estados ocultos y las observaciones.
Este modelo asume que las observaciones están relacionadas solo con el estado actual del sistema y no dependen de estados anteriores o futuros. Este tipo de modelos se emplean en una amplia variedad de aplicaciones, incluyendo el procesamiento del habla, el reconocimiento de escritura a mano, la predicción del tiempo o la clasificación de señales biológicas, entre otras.
Funcionamiento del modelo oculto de Markov
Ya que el modelo oculto de Markov parte de muchas observaciones que se juntan y crean predicciones, veamos cómo se relacionan todas estas observaciones.
Imaginemos que tenemos las siguientes observaciones:
- Hoy hace sol.
- Mañana llueve.
- Al día siguiente hace sol otra vez.
A partir de la probabilidad que tenemos observada, al cuarto día puede que haga sol. De esa misma forma se utiliza este modelo oculto de Markov para texto, que, en función de las probabilidades de combinación de palabras, nos dice cuál sería la siguiente más probable.
Natural Language Generation + modelo oculto de Markov
Observemos la siguiente imagen:
Partimos de un modelo inicial, del cual no sabemos nada, y vamos teniendo en cuenta observaciones. En este caso, vamos a ver que hay un 60% de probabilidades de que llueva y un 40% de probabilidades de que haga sol; estas conclusiones se sacan con base en todas las observaciones.
Entonces, dependiendo de si llueve o hace sol, las probabilidades de que vayamos a caminar, de compras o de limpiar la casa son diferentes.
De esta forma, lo que empezamos a hacer es un modelo gigante de probabilidades, teniendo en cuenta todos los análisis y observaciones que hayamos visualizado.
Aplicado en NLG, la extrapolación sería: cada nodo es una de las palabras que tenemos en el vocabulario; asimismo, las probabilidades son como las asociaciones que tienen las palabras entre ellas. Por ejemplo, si vemos la preposición «de», es muy probable que luego vaya acompañada de un sustantivo. Entonces, si tenemos un «de», lo que hace el modelo oculto de Markov es generar un sustantivo entre los más probables que tenga y que sean más cercanos a esta preposición.
Ejemplo del modelo oculto de Markov
El dataset
Lo primero que haremos será descargarnos el dataset:
! wget https://transfer.sh/ttw10k/merged_clean.txt.zip
El siguiente paso sería descomprimirlo:
#Ejemplo del modelo oculto de Markov
! unzip merged_clean.txt.zip
A continuación, instalamos la librería que debemos utilizar para la implementación de nuestro modelo de Markov:
#Ejemplo del modelo oculto de Markov
! pip install hmmlearn
#Ejemplo del modelo oculto de Markov
! head merged_clean.txt
Hidden Markov model
En este ejemplo del modelo oculto de Markov, lo primero que haremos es preprocesar todo el texto que tenemos. Como veremos, el preprocesamiento para texto nlg es diferente a lo que hemos estado viendo para otro tipo de tareas.
En este caso vamos a utilizar sklearn, nltk para hacer este preprocesamiento y la librería que hemos mencionado para entrenamiento.
#Ejemplo del modelo oculto de Markov
import sys, json, codecs, pickle, argparse
import numpy as np
import string
import joblig
from sklearn.preprocessing import LabelEncoder
from hmmlearn import hmm
from nltk import FreqDist
El primer paso es abrir el fichero. Ya tenemos el txt, de modo que hacemos un open, leemos todo el texto con el .read y lo guardamos en la variable llamada file.
Ya que los textos que tenemos no están estructurados de ninguna forma, solo son un montón de cuentos metidos en un fichero, lo siguiente que haremos es separar el dataset en frases. Para eso hacemos un file.split por salto de línea («\n»); de este modo, nos quedamos con todas las frases del dataset.
Ahora lo que haremos será generar el diccionario que nos hace el mapeo para los signos de puntuación del texto, de cara a eliminarlos de todas las frases. Es muy importante que no haya signos de puntuación en nuestro dataset, ya que eso mete muchísimo ruido en los algoritmos.
Cuando hacemos el split, puede haber espacios dobles, por lo que con el ciclo for se eliminarán esos dobles espacios:
#Ejemplo del modelo oculto de Markov
file = open ("merged_clean.txt", 'r', encoding = 'utf - 8').read ()
sentences = file.split ("\n")
table = str.maketrans (' ', ' ', string.punctuation)
for index, sentence in enumerate (sentences):
if sentence == " " :
del sentences [index]
Una vez tenemos ya todas las frases limpias, lo que vamos a hacer es iterar por cada una de las frases y vamos a tokenizar todas las palabras. Recorremos, línea a línea, cada una de las frases que tenemos y hacemos un split por espacios para obtener todas esas palabras.
Después analizaremos cada una de las palabras que tenemos en «lines», para ver si tienen algún tipo de puntuación; en caso de que lo tengan, vamos a eliminarlo con el translate:
#Ejemplo del modelo oculto de Markov
lines = [line.split () for line in sentences]
for line_index, line in enumerate (lines):
for word_index, word in enumerate (line):
lines [line_index] [word_index] = word.translate (table)
words = [word.lower () for line in lines for word in line]
table = str.maketrans (' ', ' ', string.punctuation)
for index, word in enumerate (words):
words [index] = word.translate (table)
alphabet = set (words)
le = LabelEncoder ()
le.fit (list (alphabet))
seq = le.transform (words)
features = np.fromiter (seq, np.int64)
features = features.reshape (-1, 1)
#features = np.atleast_2d (features).T
fd = FreqDist (seq)
#Ejemplo del modelo oculto de Markov
print (words [:10])
print (seq [:10])
#Ejemplo del modelo oculto de Markov
model = hmm.MultinomialHMM (n_componentes = 3, init_params = "ste")
#Ejemplo del modelo oculto de Markov
print (lines [:2])
print (features [:2])
¿Qué sigue?
Ahora que sabes qué es el modelo oculto de Markov, es el momento de seguir formándote en alguna de las numerosas temáticas que tiene el ámbito del Big Data. En KeepCoding te ofrecemos la posibilidad de aprender con los mejores profesionales, que te guiarán a través de la teoría y la práctica para que, en unos pocos meses, te transformes en un gran profesional IT. Échale un vistazo al temario de nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp y descubre esta formación intensiva de alta calidad. ¡Solicita ya más información y da el paso que impulsará tu futuro!