python - Puntuación de una cadena basada en cómo se parece al inglés
cryptography cryptanalysis (5)
No estoy seguro de cómo redactar exactamente esta pregunta, así que aquí hay un ejemplo:
string1 = "THEQUICKBROWNFOX" string2 = "KLJHQKJBKJBHJBJLSDFD"
Quiero una función que marque string1 más alto que string2 y un millón de otras cadenas de galimatías. Tenga en cuenta la falta de espacios, por lo que esta es una función de carácter por carácter, no palabra por palabra.
En los años 90 escribí una función de puntuación de trigramas en Delphi y la llené con trigramas de Huck Finn, y estoy considerando transferir el código a C o Python o convertirlo en una herramienta independiente, pero debe haber formas más eficientes. por ahora. Haré esto millones de veces, así que la velocidad es agradable. Probé la biblioteca de pitón Reverend.Thomas Beyse () y la entrené con algunas cadenas de mayúsculas, pero parece requerir espacios entre palabras y, por lo tanto, devuelve una puntuación de []. Encontré algunas bibliotecas de Markov Chain, pero también parecían requerir espacios entre palabras. Aunque por mi comprensión de ellos, no veo por qué debería ser el caso ...
De todos modos, hago un montón de criptoanálisis, por lo que en el futuro las funciones de puntuación que usan espacios y signos de puntuación serían útiles, pero ahora mismo solo necesito ALLCAPITALLETTERS.
¡Gracias por la ayuda!
Comenzaría con un modelo de probabilidad simple de la probabilidad de cada letra, dada la carta anterior (posiblemente nula, al comienzo de la palabra). Puedes construir esto en base a un archivo de diccionario. Luego puede expandir esto para usar 2 o 3 letras anteriores como contexto para condicionar las probabilidades si el modelo inicial no es lo suficientemente bueno. Luego, multiplique todas las probabilidades para obtener un puntaje para la palabra, y posiblemente tome la raíz n-ésima (donde N es la longitud de la cadena) si desea normalizar los resultados para poder comparar palabras de diferentes longitudes.
No sé cómo funciona, pero Mail::SpamAssassin::Plugin::TextCat
analiza el correo electrónico y adivina qué idioma es (con docenas de idiomas admitidos).
No veo por qué una cadena de Markov no pudo ser modificada para funcionar. Crearía un tipo de diccionario de archivos de texto y lo leería para poblar inicialmente la estructura de datos. Simplemente usaría una cadena de n letras para predecir la siguiente letra, en lugar de n palabras para predecir la siguiente palabra. Entonces, en lugar de generar una carta aleatoriamente, es probable que desee sacar la probabilidad de la siguiente letra. Por ejemplo, si tenía la cadena actual de "TH" y la siguiente letra era "E", iría a su mapa y vería la probabilidad de que una "E" siga a "TH". Personalmente, simplemente sumaría todas estas probabilidades mientras recorría la cadena, pero la forma de crear exactamente un puntaje a partir de la probabilidad depende de usted. Puede normalizarlo para la longitud de la cuerda, para permitirle comparar cuerdas cortas y largas.
Ahora que lo pienso, este método favorecería cadenas con palabras más largas, ya que un diccionario no incluiría frases. Por otra parte, podría llenar el diccionario no solo con palabras sueltas, sino también con frases cortas con los espacios eliminados. Entonces, la puntuación no solo puntuaría según el inglés de las palabras separadas, sino también por la serie de palabras en inglés. No es un sistema perfecto, pero proporcionaría una puntuación constante.
Estoy pensando que quizás podrías aplicar algunas ideas de síntesis de texto a voz aquí. En particular, si un programa de síntesis de voz puede producir una pronunciación para una palabra, entonces se puede considerar "inglés".
El paso de preproceso se denomina conversión de grafema a fonema y, por lo general, conduce a la probabilidad de asignar cadenas a los sonidos.
Aquí hay un documento que describe algunos enfoques para este problema. (No pretendo que este documento tenga autoridad, ya que solo fue un resultado de búsqueda altamente calificado, y realmente no tengo experiencia en esta área).
El Índice de coincidencia podría ser útil aquí, consulte https://en.wikipedia.org/wiki/Index_of_coincidence .
Para empezar, simplemente calcule la diferencia del IC con el valor esperado de 1.73 (vea Wikipedia arriba). Para un uso avanzado, es posible que desee calcular el valor esperado utilizando algún ejemplo de corpus de lenguaje.