Según el caso, es posible que le interese utilizar uno de los siguientes métodos:
Método 0: use una API o biblioteca
Por lo general, hay algunos problemas con estas bibliotecas porque algunas de ellas no son precisas para textos pequeños, faltan algunos idiomas, son lentas, requieren conexión a Internet, no son gratuitas, ... Pero en general, se adaptarán a la mayoría de las necesidades. .
Método 1: modelos de lenguaje
Un modelo de lenguaje nos da la probabilidad de una secuencia de palabras. Esto es importante porque nos permite detectar de manera robusta el idioma de un texto, incluso cuando el texto contiene palabras en otros idiomas (por ejemplo: "'Hola' significa 'hola' en español" ).
Puede utilizar N modelos de idiomas (uno por idioma) para calificar su texto. El idioma detectado será el idioma del modelo que le otorgó la puntuación más alta.
Si desea construir un modelo de lenguaje simple para esto, optaría por 1 gramo. Para hacer esto, solo necesita contar el número de veces que ha aparecido cada palabra de un texto grande (por ejemplo, Wikipedia Corpus en lenguaje "X").
Entonces, la probabilidad de una palabra será su frecuencia dividida por el número total de palabras analizadas (suma de todas las frecuencias).
the 23135851162
of 13151942776
and 12997637966
to 12136980858
a 9081174698
in 8469404971
for 5933321709
...
=> P("'Hola' means 'hello' in spanish") = P("hola") * P("means") * P("hello") * P("in") * P("spanish")
Si el texto a detectar es bastante grande, recomiendo muestrear N palabras al azar y luego usar la suma de logaritmos en lugar de multiplicaciones para evitar problemas de precisión de punto flotante.
P(s) = 0.03 * 0.01 * 0.014 = 0.0000042
P(s) = log10(0.03) + log10(0.01) + log10(0.014) = -5.376
Método 2: conjuntos de intersección
Un enfoque aún más simple es preparar N conjuntos (uno por idioma) con las M palabras más frecuentes. Luego cruce su texto con cada conjunto. El conjunto con el mayor número de intersecciones será su idioma detectado.
spanish_set = {"de", "hola", "la", "casa",...}
english_set = {"of", "hello", "the", "house",...}
czech_set = {"z", "ahoj", "závěrky", "dům",...}
...
text_set = {"hola", "means", "hello", "in", "spanish"}
spanish_votes = text_set.intersection(spanish_set)
english_votes = text_set.intersection(english_set)
czech_votes = text_set.intersection(czech_set)
...
Método 3: compresión zip
Esto es más una curiosidad que cualquier otra cosa, pero aquí va ... Puede comprimir su texto (por ejemplo, LZ77) y luego medir la distancia del zip con respecto a un texto comprimido de referencia (idioma de destino). Personalmente, no me gustó porque es más lento, menos preciso y menos descriptivo que otros métodos. Sin embargo, puede haber aplicaciones interesantes para este método. Para leer más: Árboles de idiomas y compresión