traductor traducir traduccion shopkins inglés ingles google español chrome buscar string linguistics nlp

string - traducir - traductor de inglés a español



¿Cómo puedo determinar si una cadena aleatoria suena como en inglés? (13)

Tengo un algoritmo que genera cadenas basadas en una lista de palabras de entrada. ¿Cómo separé solo las cadenas que suenan como palabras en inglés? es decir. descarta RDLO mientras mantienes a LORD .

EDITAR: para aclarar, no es necesario que sean palabras reales en el diccionario. Solo necesitan sonar como inglés. Por ejemplo, KEAL sería aceptado.


¡Eso suena como una tarea bastante complicada! Por la parte superior de mi cabeza, un fonema consonante necesita una vocal antes o después. ¡Determinar qué es un fonema será bastante difícil! Probablemente necesite escribir manualmente una lista de ellos. Por ejemplo, "TR" está bien, pero no "TD", etc.


¿Tienen que ser palabras en inglés reales, o simplemente cadenas que parecen ser palabras en inglés?

Si solo tienen que verse como posibles palabras en inglés, podrías hacer un análisis estadístico de algunos textos en inglés reales y determinar qué combinaciones de letras ocurren con frecuencia. Una vez que hayas hecho eso, puedes descartar cadenas que son demasiado improbables, aunque algunas de ellas pueden ser palabras reales.

O podría simplemente usar un diccionario y rechazar palabras que no están en él (con algunas concesiones para plurales y otras variaciones).


Debería investigar generadores de contraseñas "pronunciables", ya que están tratando de realizar la misma tarea.

Una solución Perl sería Crypt :: PassGen , que puedes entrenar con un diccionario (para que puedas entrenarlo en varios idiomas si es necesario). Recorre el diccionario y recopila estadísticas en secuencias de 1, 2 y 3 letras, luego crea nuevas "palabras" basadas en frecuencias relativas.


Es bastante fácil generar palabras que suenan en inglés usando una cadena de Markov. Sin embargo, retroceder es más un desafío. ¿Cuál es el margen de error aceptable para los resultados? Siempre podría tener una lista de pares de letras comunes, triples, etc., y calificarlos en función de eso.


Estaría tentado de ejecutar el algoritmo soundex sobre un diccionario de palabras en inglés y almacenar en caché los resultados, luego soundexar la cadena candidata y hacer coincidir el caché.

Dependiendo de los requisitos de rendimiento, puede calcular un algoritmo de distancia para los códigos soundex y aceptar cadenas 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 quiere 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, deberá proporcionar una implementación de read_english_dictionary.

EDITAR : Su ejemplo de "KEAL" estará bien, ya que tiene el mismo código soundex (K400) que "KEEL". Puede que necesite registrar palabras rechazadas y verificarlas manualmente si desea tener una idea de la tasa de fallas.


La manera más fácil con los filtros bayesianos (ejemplo de Python 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)]


Podrías abordar esto haciendo una cadena de candidatos en bigramas -pairs de letras adyacentes- y comprobando cada bigrama contra una tabla de frecuencias de bigrames inglesas.

  • Simple: si un bigram es lo suficientemente bajo en la tabla de frecuencias (o completamente ausente), rechace la cadena como inverosímil. (¿La cadena contiene un "bigote" "QZ"? ¡Rechazar!)
  • Menos simple: calcule la verosimilitud general de toda la cadena en términos de, por ejemplo, un producto de las frecuencias de cada bigram dividido por la frecuencia media de una cadena válida en inglés de esa longitud. Esto le permitiría tanto (a) aceptar una cadena con un bigram impar de baja frecuencia entre bigramas de alta frecuencia, y (b) rechazar una cadena con varios bigrams individuales bajos, pero no muy por debajo del umbral .

Cualquiera de estos requerirá un ajuste del (de los) umbral (es), la segunda técnica más que la primera.

Hacer lo mismo con los trigramas probablemente sea más robusto, aunque también conducirá a un conjunto algo más estricto de cadenas "válidas". Si eso es un triunfo o no depende de su aplicación.

Las tablas Bigram y Trigram basadas en corpus de investigación existentes pueden estar disponibles de forma gratuita o compradas (no encontré ninguna disponible de forma gratuita, pero solo hice un google superficial hasta el momento), pero se puede calcular un bigram o tabla de trigram de uno mismo corpus de tamaño de texto en inglés. Simplemente revise cada palabra como un token y calcule cada uno de los bigramas (puede manejar esto como un hash con un bigram dado como clave y un contador de enteros incrementado como valor).

La morfología inglesa y la fonética inglesa son (¡increíblemente!) Menos que isométricas, por lo que esta técnica bien podría generar cadenas que "parezcan" en inglés pero presenten problemas problemáticos. Este es otro argumento para los trigramas en lugar de los bigramas: la rareza producida por el análisis de los sonidos que usan varias letras en secuencia para producir un fonema dado se reducirá si el n-grama abarca todo el sonido. (Piense en "arar" o "tsunami", por ejemplo).


Probablemente evaluaría cada palabra usando un algoritmo SOUNDEX contra una base de datos de palabras en inglés. Si está haciendo esto en un servidor SQL, debería ser bastante fácil configurar una base de datos que contenga una lista de la mayoría de las palabras en inglés (utilizando un diccionario disponible gratuitamente), y el servidor MSSQL tiene SOUNDEX implementado como un algoritmo de búsqueda disponible.

Obviamente, puede implementarlo usted mismo si lo desea, en cualquier idioma, pero podría ser una gran tarea.

De esta forma, obtendrías una evaluación de cuánto suena cada palabra como una palabra en inglés existente, si es que hay alguna, y podrías establecer algunos límites para qué tan bajo quieres aceptar los resultados. Probablemente desee considerar cómo combinar los resultados de varias palabras, y probablemente modificaría los límites de aceptación basados ​​en las pruebas.


Puede compararlos con un diccionario (disponible gratuitamente en Internet), pero puede ser costoso en términos de uso de la CPU. Aparte de eso, no conozco ninguna otra forma programática para hacerlo.


Puedes construir una cadena de markov de un enorme texto en inglés.

Después, puede alimentar palabras en la cadena de markov y comprobar qué tan alta es la probabilidad de que la palabra sea en inglés.

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

En la parte inferior de la página, puede ver el generador de texto de markov. Lo que quieres es exactamente lo contrario.

En pocas palabras: la cadena de markov almacena para cada personaje las probabilidades de que el siguiente personaje siga. Puede extender esta idea a dos o tres caracteres si tiene suficiente memoria.


Sugeriría algunas reglas simples y los pares estándar y trillizos serían buenos.

Por ejemplo, las palabras que suenan en inglés tienden a seguir el patrón de vocal-consonante-vocal, aparte de algunos diptongos y pares de consonantes estándar (por ejemplo, th, ie y ei, oo, tr). Con un sistema así deberías quitar casi todas las palabras que no suenan como que podrían ser inglés. En una inspección más cercana, descubrirá que probablemente eliminará muchas palabras que también suenan a inglés, pero luego puede comenzar a agregar reglas que permitan un rango más amplio de palabras y ''entrenar'' su algoritmo manualmente.

No eliminará todos los falsos negativos (p. Ej., No creo que pueda llegar a una regla para incluir ''ritmo'' sin codificar explícitamente en ese ritmo es una palabra) pero proporcionará un método de filtrado.

También estoy asumiendo que quieres cadenas que podrían ser palabras en inglés (suenan razonables cuando se pronuncian) en lugar de cadenas que son definitivamente palabras con un significado en inglés.



Metaphone y Double Metaphone son similares a SOUNDEX, excepto que pueden ajustarse más a su objetivo que SOUNDEX . Están diseñados para "cortar" palabras en función de su "sonido" fonético, y son buenos para hacer esto en inglés (pero no tanto en otros idiomas y nombres propios).

Una cosa a tener en cuenta con los tres algoritmos es que son extremadamente sensibles a la primera letra de su palabra. Por ejemplo, si está tratando de averiguar si KEAL está sonando en inglés, no encontrará una coincidencia con REAL porque las letras iniciales son diferentes.