Pregunta

Tengo un algoritmo que genera las cadenas basándose en una lista de palabras.¿Cómo puedo separar sólo las cadenas que suena como las palabras en inglés?es decir.descarte RDLO manteniendo SEÑOR.

EDITAR: Para aclarar, que no necesita ser real de las palabras en el diccionario.Ellos sólo necesitan de sonido, como el inglés.Por ejemplo KEAL sería aceptado.

¿Fue útil?

Solución

Usted puede construir una markov de la cadena de de un gran texto en inglés.

Después se puede alimentar de las palabras en la cadena de markov y comprobar cuán alta es la probabilidad de que la palabra es el inglés.

Ver aquí: http://en.wikipedia.org/wiki/Markov_chain

En la parte inferior de la página se puede ver la markov texto generador.Lo que quieres es exactamente el reverso de la misma.

En pocas palabras:La markov-la cadena de tiendas para cada personaje, las probabilidades de que el próximo personaje va a seguir.Se puede extender esta idea a dos o tres personajes si usted tiene suficiente memoria.

Otros consejos

La manera más sencilla con los filtros Bayesianos (Python ejemplo de http://sebsauvage.net/python/snyppets/#bayesian)

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]

Usted podría acercarse a este encadenamiento de un candidato de la cadena en dígrafos—pares de adjascent letras—y la comprobación de cada uno de bigramas en contra de una tabla de inglés dígrafo frecuencias.

  • Simple:si cualquier dígrafo es lo suficientemente bajo en la tabla de frecuencias (o directamente ausente), rechazar la cadena como inverosímil.(Cadena contiene un QZ dígrafo?Rechazar!)
  • Menos simple:calcular el total de la plausibilidad de toda la cadena en términos de, por ejemplo, un producto de las frecuencias de cada uno de bigramas dividido por la frecuencia media de una tarjeta de cadena en inglés de esa longitud.Esto le permitiría a ambos (a) acepta una cadena con una extraña baja frecuencia de bigramas entre otro modo de alta frecuencia de bigramas, y (b) rechazar una cadena con varias bajas-pero-no-muy-bajo-el-umbral de dígrafos.

Cualquiera de los que se requieren algunos ajustes del umbral(s), la segunda técnica más que la primera.

Haciendo lo mismo con los trigramas probablemente sería más robusto, aunque también es probable que conduzca a un poco más estricto conjunto de "validez" de las cuerdas.Si eso es una victoria o no depende de su aplicación.

Bigramas y trigrama tablas basadas en la investigación existente corpus puede ser gratuito o de compra (yo no encuentro ninguna libremente disponible, pero sólo hizo un somero de google hasta el momento), pero se puede calcular un dígrafo o trigrama tabla de ti de cualquier buen tamaño corpus de texto en inglés.Sólo manivela a través de cada palabra como un símbolo y un recuento de cada uno de los bigramas—usted puede manejar esto como un hash con un dígrafo, como clave y un incrementado número entero contador como el valor.

Inglés morfología y fonética inglesa son (el famoso!) menos de isométrica, por lo que esta técnica podría generar cadenas de "look" en inglés, pero presente problemático prounciations.Este es otro argumento para trigramas en lugar de dígrafos—la extrañeza producida por el análisis de los sonidos que utilizan varias cartas en secuencia para producir un determinado fonema serán reducidos si el n-grama abarca todo el sonido.(Piensa en el "arado" o "tsunami", por ejemplo).

Es muy fácil generar inglés palabras que suenan mediante una cadena de Markov.Yendo hacia atrás es más de un desafío, sin embargo.¿Cuál es el margen de error aceptable para los resultados?Siempre se puede tener una lista de pares de letras, triples, etc, y el grado basado en eso.

Usted debe investigar "pronunciables" contraseña de los generadores, ya que estamos tratando de lograr la misma tarea.

Un Perl solución sería Cripta::PassGen, que se puede entrenar con un diccionario (por lo que podría entrenar a varios idiomas si es necesario).Camina a través del diccionario y recoge estadísticas sobre 1, 2, y 3 de la carta de las secuencias, a continuación, construye nuevas "palabras", basada en frecuencias relativas.

Metaphone y Doble Metaphone son similares a SOUNDEX, salvo que puede ser sintonizada más hacia su objetivo de SOUNDEX.Están diseñados para "hash" palabras basado en su fonética "sonido", y son buenos en hacer esto para el idioma inglés (pero no tanto en otros idiomas y los nombres propios).

Una cosa a tener en cuenta con los tres algoritmos es que son extremadamente sensibles a la primera letra de la palabra.Por ejemplo, si usted está tratando de averiguar si KEAL es el inglés que suena, usted no encontrará un partido a REAL debido a que las letras iniciales son diferentes.

Estaría tentado a ejecutar el algoritmo soundex más de un diccionario de palabras en inglés y caché de los resultados, luego de soundex su candidato a la cadena y el partido contra el caché.

Dependiendo de los requisitos de desempeño, usted podría trabajar a una distancia algoritmo soundex códigos y aceptar cadenas de caracteres dentro de una cierta tolerancia.

Soundex es muy fácil de implementar - ver Wikipedia para una descripción del algoritmo.

Una implementación de ejemplo de lo que quieres hacer sería:

def soundex(name, len=4):
    digits = '01230120022455012623010202'
    sndx = ''
    fc = ''

    for c in name.upper():
        if c.isalpha():
            if not fc: fc = c
            d = digits[ord(c)-ord('A')]
            if not sndx or (d != sndx[-1]):
                sndx += d

    sndx = fc + sndx[1:]
    sndx = sndx.replace('0','')
    return (sndx + (len * '0'))[:len]

real_words = load_english_dictionary()
soundex_cache = [ soundex(word) for word in real_words ]

if soundex(candidate) in soundex_cache:
    print "keep"
else:
    print "discard"

Obviamente, usted necesitará proporcionar una implementación de read_english_dictionary.

EDITAR:Su ejemplo de "KEAL" va a estar bien, ya que tiene el mismo código soundex (K400) como "la QUILLA".Usted puede necesitar registro rechazado palabras y comprobar manualmente si desea obtener una idea de la tasa de fracaso.

¿Tienen que ser real de las palabras en inglés, o simplemente las cadenas que parece que podría ser las palabras en inglés?

Si sólo hay que ver como posible Palabras en inglés que podría hacer algunos análisis estadísticos sobre algunos de los verdaderos textos en inglés y averiguar qué combinaciones de letras se producen con frecuencia.Una vez que hayas hecho esto, usted puede tirar de las cuerdas, que son demasiado improbable, aunque algunos de ellos pueden ser las palabras reales.

O usted podría utilizar un diccionario y rechazar las palabras que no están en ella (con algunas asignaciones para los plurales y otras variaciones).

Se podría comparar a un diccionario (disponible gratuitamente en internet), pero que puede ser costoso en términos de uso de la CPU.Aparte de eso, no sé de ninguna otra manera programática para hacerlo.

Eso suena bastante una tarea!La parte superior de mi cabeza, un fonema consonante necesidades de una vocal, ya sea antes o después de ella.La determinación de lo que un fonema es que será bastante duro, aunque!Usted probablemente tendrá que escribir manualmente una lista de ellos.Por ejemplo, "TR" está bien, pero no "TD", etc.

Probablemente me evaluar cada palabra mediante un algoritmo SOUNDEX contra una base de datos de palabras en inglés.Si usted está haciendo esto en un SQL-server debería ser bastante fácil para la instalación de una base de datos que contiene una lista de la mayoría de las palabras en inglés (utilizando libremente disponible del diccionario), y MSSQL server tiene SOUNDEX implementado como una búsqueda del algoritmo.

Obviamente, usted puede implementar esto si usted quiere, en cualquier idioma - pero podría ser una gran tarea.

De esta manera se obtendría una evaluación de cuánto cada palabra suena como un existente palabra en inglés, si la hubiere, y usted puede configurar algunos límites para lo bajo que usted desea aceptar los resultados.Quizás quieras considerar cómo combinar los resultados de varias palabras, y probablemente modificar la aceptación de los límites basados en pruebas.

Te sugiero mirar el phi de la prueba y el índice de coincidencia. http://www.threaded.com/cryptography2.htm

Te sugiero un par de reglas simples y estándar de parejas y tríos sería bueno.

Por ejemplo, el inglés palabras que suenan tienden a seguir el patrón de vocal-consonante-vocal, aparte de algunos dipthongs y estándar pares de consonantes (por ejemplo,th, ie y de la ie, oo, tr).Con un sistema como el que usted debe franja de casi todas las palabras que no suena como que podría ser el inglés.Que iba a encontrar en una inspección más cercana de que probablemente se tira un montón de palabras que suenan como el inglés, pero usted puede entonces comenzar a agregar reglas que permiten una amplia gama de palabras y "entrenar" a su algoritmo de forma manual.

No retire todos los falsos negativos (por ejemplo,No creo que pueda llegar a venir para arriba con una regla para incluir 'ritmo' sin explícitamente de codificación en el que el ritmo es una palabra) pero va a proporcionar un método de filtrado.

También estoy asumiendo que usted desea cadenas que podrían ser palabras en inglés (suenan razonables cuando se pronuncia) en lugar de cadenas que definitivamente son palabras con un significado del término en inglés.

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