2008-12-21 1272 views
7

Más específicamente, estoy tratando de verificar si la cadena dada (una oración) está en turco.La mejor manera de devolver el idioma de una cadena dada

Puedo verificar si la cadena tiene caracteres turcos como Ç, Ş, Ü, Ö, Ğ etc. Sin embargo, eso no es muy confiable ya que pueden convertirse a C, S, U, O, G antes de que yo reciba el cuerda.

Otro método es tener las 100 palabras más utilizadas en turco y comprobar si la oración incluye alguna/algunas de esas palabras. Puedo combinar estos dos métodos y usar un sistema de puntos.

¿Cuál crees que es la forma más eficaz de resolver mi problema en Python?

pregunta relacionada: (human) Language of a document (Perl, Google API de traducción)

+0

Duplicado: http://stackoverflow.com/questions/257125/human-language-of-a-document –

+0

@ S.Lott: He agregado un enlace a la pregunta. – jfs

Respuesta

14

Una opción sería utilizar un clasificador bayesiano como Reverend. La página de inicio reverendo da esta sugerencia para un detector de lenguaje ingenuo:

from reverend.thomas import Bayes 
guesser = Bayes() 
guesser.train('french', 'le la les du un une je il elle de en') 
guesser.train('german', 'der die das ein eine') 
guesser.train('spanish', 'el uno una las de la en') 
guesser.train('english', 'the it she he they them are were to') 
guesser.guess('they went to el cantina') 
guesser.guess('they were flying planes') 
guesser.train('english', 'the rain in spain falls mainly on the plain') 
guesser.save('my_guesser.bay') 

entrenamiento con conjuntos de fichas más complejas fortalecería los resultados. Para obtener más información sobre la clasificación bayesiana, see here y here.

10

Un método estadístico sencillo que he utilizado antes:

obtener una cantidad decente de texto de entrenamiento de la muestra en el idioma que se desea detectar. Divídelo en trigramas, p.

"Hello foobar" en trigramas es: 'Hel', 'ell', 'llo', 'lo', 'o f', 'fo', 'foo', 'oob', 'oba', 'bar'

Para todos los datos fuente, cuente la frecuencia de aparición de cada trigrama, presumiblemente en un dict donde key = trigram y value = frequency. Puede limitar esto a las 300 combinaciones de 3 letras más frecuentes o algo si lo desea. Saca el dict a otro lado.

Para saber si una nueva muestra de texto está escrita en el mismo idioma, repita los pasos anteriores para el texto de muestra. Ahora, todo lo que tienes que hacer es calcular una correlación entre las frecuencias de trigrama de muestra y las frecuencias de trigrama de entrenamiento. Tendrá que jugar un poco para elegir una correlación de umbral por encima de la cual esté dispuesto a considerar que la entrada es turca o no.

Este método ha demostrado ser muy precisa, superando a métodos más sofisticados, ver

Cavnar & Trenkle (1994): "N-Gram-Based Text Categorization"

Usando trigramas resuelve el problema de la utilización de listas de palabras, ya que hay un gran número de palabras en cualquier lenguaje dado, especialmente dadas las diferentes permutaciones gramaticales. Intenté buscar palabras comunes, el problema es que a menudo dan un falso positivo para algún otro idioma, o ellos mismos tienen muchas permutaciones. El método estadístico no requiere mucho espacio de almacenamiento y no requiere un análisis complejo. Por cierto, este método solo funciona para lenguajes con un sistema de escritura fonética, pero funciona mal con lenguajes que usan un lenguaje ideográfico (es decir, chino, japonés, coreano).

Alternativamente Wikipedia tiene una sección sobre Turquía en its handy language recognition chart.

-1

¿Por qué no utilizar una biblioteca de corrección ortográfica existente? Verificación ortográfica para varios idiomas, elija el idioma con el recuento de errores más bajo.

Cuestiones relacionadas