Como muchos sabrán, what would I say? es un una aplicación de Facebook que toma el historial de posteos de un usuario y genera posibles frases que podría llegar a decir ese usuario.
Es divertido porque genera cosas que pueden ser consideradas «poéticas» (uso la palabra, aunque no comparto la idea: pobres poetas). Algunos ejemplos podrían ser:
vine de conocer un mensaje sarcástico
me vio en estado y quise al ferrocarril
Uno de los mayores problemas de ser lingüista es que uno tiene la rara tendencia de detenerse a pensar cómo funcionan estas cosas. Lo primero que pensé fue «hay que crear una cuenta de Facebook falsa, postear sólo dos oraciones (i.e., un par mínimo) y ver qué cosas puede generar a partir de eso». (Sí, lo sé: soy un idiota). Como tampoco es que esto me obsesionaba demasiado, decidí no hacerlo.
Lo segundo que supuse fue «bueno, esta cosa claramente genera oraciones bastante aceptables, así que además de incluir un mecanismo de tipo markoviano (un robot que computa las relaciones de adyacencia entre las palabras) enriquecido con algún tipo de programita estadístico, también tiene que tener algún tipo de información sobre estructuras sintácticas recurrentes». Esta segunda idea era más fácil de verificar: me puse a ver en los posteos de los bots de mis conocidos si era posible reconocer algún tipo de «molde general» para las oraciones. No encontré exactamente eso, pero me pareció ver ciertas regularidades: (i) casi no hay construcciones nominales mal formadas, (ii) casi todos los modificadores de tipo circunstancial (adjuntos) están mal usados, (iii) por lo general, los argumentos de los verbos son incorrectos en términos semánticos (e.g., *comer una casa, *ver una canción). A partir de estos datos (?), mi hipótesis fue que la aplicación tiene información sobre cómo reconocer el verbo de una oración y sus argumentos directos (i.e., sujeto y objeto). Esto es relativamente «fácil» para el inglés o el español que tienen un orden de palabras Sujeto-Verbo-Objeto. Los circunstanciales, en cambio, se reconocerían por el uso de comas. En definitiva, lo que haría el programa es combinar aleatoriamente cosas que reconoce como sujetos, objetos, verbos y circunstanciales. Dado que no hay una verdadera gramática detrás del programita (Chomsky demostró hace 60 años que los mecanismos markovianos son insuficientes como para capturar el fenómeno sintáctico), algunas oraciones mal formadas son esperables.
(Nótese que yo estaba sobreestimando muchísimo la precisión sintáctica de la aplicación. Esto se debe a que estaba omitiendo algo bastante evidente: que la gente postea sólo aquellos estados con oraciones más o menos bien formadas. Seguramente, hay muchos mensajes agramaticales generados por el programa que son descartados por los usuarios. En otras palabras, el mini corpus con el que trabajé estaba muy filtrado por auténticos hablantes).
Se me ocurrió, finalmente, ver si en alguna parte había información sobre el funcionamiento del programa (algo que debería habérseme ocurrido antes de hipotetizar cualquier cosa). Sus creadores son bastante explícitos con respecto al mecanismo utilizado:
Technically speaking, it trains a Markov Bot based on mixture model of bigram and unigram probabilities derived from your past post history.
Básicamente, lo que dice ahí es que el programa no tiene ningún tipo de información lingüística previa (como yo había supuesto erróneamente), sino que simplemente repite patrones recurrentes. Lo de unigram y bigram refiere a cuantas palabras por delante de la que se está computando registra el programa. Por ejemplo, para una frase como el lindo día y con respecto al artículo el, un unigrama registra la aparición de lindo delante de el, mientras que un bigrama registra la aparición del par ordenado <lindo, día> delante de el. En otras palabras, lo que hace el programa es aprenderse qué palabra o par de palabras usa un usuario después de una determinada palabra. Por ejemplo, el programa sabe que «casi todas las oraciones» empiezan por un artículo (e.g., «el libro que leí», «las vacaciones te hacen bien»), por lo que seguramente empiece la oración con un artículo. Después del artículo, se fija cuál es la palabra o par de palabras que más frecuentemente aparecen en co-ocurrencia con ese artículo. Y así va generando frases, palabra a palabra. Es necesario, además, que el programita vaya armando lista de tipos de constituyentes que reconoce (el término técnico es clusters), para (i) no generar siempre las mismas oraciones y (ii) no tener que calcular toda la estadística de los patrones lingüísticos cada vez que se le pide que genere un nuevo posteo.
En fin, terminó resultando que el funcionamiento del programa era bastante aburrido desde un punto de vista lingüístico… Pero al menos no necesito escribir ningún tipo de conclusión para todo esto: tengo un viejo chiste de xkcd que resulta más que elocuente.