Pregunta

cadenas de Markov son una forma (casi estándar) para generar galimatías aleatorio que parece inteligente para el ojo no entrenado. ¿Cómo haría usted para identificar Markov texto generado a partir de un texto escrito humana.

Sería increíble si los recursos que apuntan a Python son de usar.

¿Fue útil?

Solución

Se puede usar un enfoque de "fuerza bruta", mediante el cual se compara el lenguaje generado con los datos recogidos en n-gramas de orden más alto que el modelo de Markov que la generó.

es decir. Si el idioma se generó con un segundo modelo de Markov, hasta 3 gramos van a tener las frecuencias correctas, pero de 4 gramos probablemente no lo hará.

Se puede llegar hasta frecuencias de 5 gramos de público n-gram conjunto de datos es enorme, aunque - 24G comprimido - que necesita para obtener por correo en DVD de LDC.

EDIT: Se ha añadido algunos detalles de implementación

Los n-gramas que ya se han contado, por lo que sólo necesita almacenar los conteos (o frecuencias) de una manera que es fácil de buscar. Una base de datos indexada correctamente, o tal vez un índice de Lucene debería funcionar.

Dado un fragmento de texto, escanear a través de ella y buscar la frecuencia de cada 5 gramos en su base de datos, y ver dónde se clasifica en comparación con otros 5 gramos que comienzan con los mismos 4 palabras.

En la práctica, un obstáculo más grande podría ser los términos de la licencia del conjunto de datos. Usarlo para una aplicación comercial podría estar prohibido.

Otros consejos

Un enfoque simple sería tener un gran grupo de seres humanos leen texto de entrada para usted y ver si el texto tiene sentido. Estoy sólo la mitad en broma, esto es un problema complicado.

Creo que esto es un problema difícil, porque Markov cadena de texto generada va a tener una gran cantidad de las mismas propiedades de texto humana real en términos de frecuencia de palabras y las relaciones simples entre el orden de las palabras.

Las diferencias entre el texto real y el texto que genera una cadena de Markov están en reglas de nivel superior de la gramática y en significado semántico, que son difíciles de codificar mediante programación. El otro problema es que las cadenas de Markov son lo suficientemente buenos para la generación de texto que a veces vienen con declaraciones gramatical y semánticamente correcto.

A modo de ejemplo, he aquí un rel="noreferrer"> aforismo :

  

Hoy en día, se sentiría convencido de que   la voluntad humana es libre; mañana,   teniendo en cuenta la cadena indisoluble de   la naturaleza, que se vería en la libertad como una   mera ilusión y declarar la naturaleza para ser   todo-en-todo.

Si bien esta cadena fue escrito por un programa de ordenador, es difícil decir que un ser humano nunca diría esto.

Creo que a menos que nos puede dar detalles más específicos sobre el equipo y el texto generado por el hombre que exponen las diferencias más obvias que será difícil de resolver esto utilizando la programación de computadoras.

Sugiero una generalización de la respuesta de Evan: hacer un modelo de Markov de su propia y entrenarlo con una gran parte de la (muy grande) muestra que está dado, reservando el resto de la muestra como "datos de prueba". Ahora, ver lo bien que el modelo que ha entrenado hace en los datos de prueba, por ejemplo, con una prueba de chi cuadrado que sugieren situación en la que "el ajuste es demasiado bueno" (lo que sugiere que los datos de prueba es de hecho generada por este modelo), así como aquellas en las que el ajuste es muy mala (error en la estructura del modelo que sugiere - un exceso modelo de formación esmeradas con la estructura equivocada hace un mal trabajo notoriamente en estos casos).

Por supuesto, todavía hay muchos problemas para la calibración, como la estructura del modelo - que se sospeche que un modelo simple basado en Ntuples de las palabras y poco más, o uno más sofisticado con estados de gramática y similares. Afortunadamente, usted puede calibrar las cosas bastante bien mediante el uso de grandes corpus de los conocidos-a-ser-natural de texto y también se genera a sí mismo con los modelos de varias estructuras.

Un enfoque diferente es usar NLTK para analizar las frases que le den - un pequeño número de mis-análisis sintácticos es de esperar, incluso en el texto naturales (como los seres humanos son imperfectos y también lo es el analizador - puede no saber que la palabra X puede ser utilizado como un verbo y sólo clasificarlo como un sustantivo, etc, etc), pero la mayoría de los modelos de Markov (a menos que estén modelando esencialmente la misma estructura gramatical su analizador pasa a estar usando - y se pueden utilizar varios programas de análisis para tratar de contrarrestar eso! -) causarán mucho más mis-análisis sintácticos que incluso los seres humanos disléxicos. Una vez más, calibre que en los textos naturales vs sintéticos, y verá lo que quiero decir! -)

Si tuviera varios grandes textos generados-Markov, posiblemente podría determinar que eran tan mediante la comparación de las frecuencias de palabras entre cada una de las muestras. Desde cadenas de Markov dependen de probabilidades de palabras constantes, las proporciones de cualquier palabra dada deben ser aproximadamente igual de muestra a muestra.

El crowdsourcing. Utilizar Mechanical Turk y obtener un número de seres humanos para votar en esta. Incluso hay algunas bibliotecas para ayudarle a sacar esto adelante. Por ejemplo:

Aquí hay una entrada de blog de O'Reilly Radar sobre consejos para el uso de Mechanical Turk para realizar su trabajo:

Si se escribe un programa que genera las probabilidades de transición de Markov de cualquier secuencia de símbolos, y luego calcula la tasa de entropía de la matriz de Markov. (Ver http://en.wikipedia.org/wiki/Entropy_rate#Entropy_rates_for_Markov_chains ) Este es básicamente una estimación de la facilidad con que el texto podría predecirse utilizando sólo la cadena de Markov (mayor entropía medios más duro para predecir). Por lo tanto yo creo que cuanto menor sea la entropía de la matriz de Markov es, es más probable que la muestra de texto es controlado por una matriz de Markov. Si tiene alguna pregunta sobre cómo escribir el código, resulta que tengo un programa en Python que hace exactamente esto en mi equipo, por lo que puede ayudar a salir

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top