He oído hablar de Cadenas de Markov Ya era hora de que aprendiera más sobre ellas y desarrollara una sencilla y divertida aplicación de cadenas de Markov. Estoy seguro de que no quieres estancarte en los detalles matemáticos de las cadenas de Markov - ¡aprender construyendo una aplicación es donde está toda la diversión!
En este blog, mostraremos cómo crear una aplicación "Marky" que utiliza cadenas de Markov para generar tuits sin sentido basados en tu historial de Twitter. Utiliza Couchbase Server para almacenar y procesar los datos para generar estos tweets.
Marky utiliza Couchbase Server vistas procesar datos
La función de mapa de Marky es :
si(doc.cuerpo) {
var palabras = doc.cuerpo.dividir(/s+/);
si (palabras.longitud >= 1) {
emite([null, palabras[0]], 1);
}
para(var i = 0; i < (palabras.longitud – 1); i++) {
var par = [palabras[i], palabras[i+1]];
emite(par, 1);
}
}
}
A alto nivel, divide el texto en trozos más pequeños utilizando una ventana deslizante sobre 2 palabras consecutivas e intenta reagrupar estos trozos en el orden correcto para formar frases basándose en un peso estadístico. Al final, se obtiene un texto sin sentido que resulta divertido de leer.
Por ejemplo: Dado el texto de entrada "En este blog, le mostraremos cómo construir una aplicación", emitirá los pares Clave,Valor -
[null, "En"] 1
["En", "este"] 1
["este", "blog,"] 1
["blog,", "nosotros"] 1
["nosotros", "haremos"] 1
["will", "show"] 1
["show", "you"] 1
["tú", "cómo"] 1
["cómo", "a"] 1
["a", "construir"] 1
["build", "an"] 1
["an", "aplicación"] 1
Para generar una palabra, consultamos la vista utilizando la última palabra que hemos generado. Por ejemplo, para obtener candidatos a una palabra que siga a "el", utilizamos los parámetros startkey=["el"]&endkey=["el",{}]&group_level=2&reduce=true
Esto obtendrá todos los pares de palabras que empiecen por "el", agrupará los pares que sean iguales y ejecutará la función de reducción de la vista en cada grupo. Marky utiliza la función de reducción _sum, que sumará los valores que se le den. Ejecutando esto en la base de datos dkatz_ebooks se obtiene:
["el", "#1″] 1
["el", "100″] 1
["el", "2″] 1
["la", "capacidad"] 3
["el", "absoluto"] 1
["la", "respuesta"] 1
["la", "aplicación"] 1
["la", "aplicación"] 1
["el", "área,"] 1
["el", "fondo."] 1
Para elegir la palabra que sale después de "la", elegimos una palabra que le sigue al azar, pero ponderamos nuestra elección en función de la frecuencia con la que aparece el par de palabras en la entrada. Esto significa que damos a "capacidad" una probabilidad de 3/12 o 25% de ser elegida aquí, mientras que el resto de las palabras tienen cada una una probabilidad de 1/12 o 8,3%.
Puesto que al principio de una frase emparejamos la primera palabra con null (por ejemplo: [null, "In"] en el ejemplo anterior), podemos hacer la misma consulta con null para empezar una nueva salida y obtener palabras que probablemente inicien un pensamiento, o un tuit, o lo que fuera nuestra entrada. También tenemos que hacer esto si no tenemos suerte y no obtenemos ninguna palabra candidata de la primera consulta. Esto podría ocurrir si la palabra de la consulta sólo apareciera al final de los textos de entrada que procesamos.
Aplicación Marky
Marky utiliza un simple clojure wrapper construido por la comunidad. Para configurar marky, crea un archivo marky-config.clj y dirígelo a tu cluster de Couchbase Server y a tu cuenta de twitter. Añade algunos datos semilla, cuentas de usuario de twitter o atom feeds y estarás listo para lanzar la aplicación.
:pass ""
:cburl "https://localhost:8091/"
:twitter {:app-key "XXXXXXXXX"
:app-secret "XXXXXXXXXX"
:user-token "XXXXXXXX"
:user-secret "XXXXXXXX"}
:jobs
[:period, :after están en segundos, :ttl está en días.
{:type :twitter :user "user-handle1" :period 3600 :ttl 60}
{:type :twitter :user "user-handle2" :period 3600 :ttl 60}
{:type :send-tweet :period 3600 :after 600}
{:type :atom :url "https://some-domain/rssfeed.php" :period 86400 :ttl 60}]}
He aquí algunos divertidos tweets de Marky -




¿Quieres conseguir a Marky?
Puede descargar el código fuente de Marky aquí
También puede contribuir al proyecto clojure wrapper aquí
¡Diviértete!
—-
Gracias a Aaron por elaborar el código en clojure.