
Su tarea es simple: le dice en qué lenguaje está escrito algún texto. Esto es muy útil como un paso de preprocesamiento para los datos lingüísticos en aplicaciones de procesamiento del lenguaje natural, como la clasificación de texto y la verificación de hechizos. Otros casos de uso, por ejemplo, pueden incluir correos electrónicos de enrutamiento al departamento de servicio al cliente geográficamente ubicado geográficamente, según los idiomas de los correos electrónicos.
La detección de idiomas a menudo se realiza como parte de grandes marcos de aprendizaje automático o aplicaciones de procesamiento de lenguaje natural. En los casos en que no necesita la funcionalidad completa de esos sistemas o no quiere aprender las cuerdas de ellos, una pequeña biblioteca flexible es útil.
Hasta ahora, la única otra biblioteca integral de código abierto en el ecosistema GO para esta tarea es Whatlanggo . Desafortunadamente, tiene dos inconvenientes principales:
Lingua tiene como objetivo eliminar estos problemas. Casi no necesita ninguna configuración y produce resultados bastante precisos en texto largo y corto, incluso en palabras y frases individuales. Se basa en métodos basados en reglas y estadísticos, pero no utiliza ningún diccionarios de palabras. Tampoco necesita una conexión a ninguna API o servicio externo. Una vez que se ha descargado la biblioteca, se puede usar completamente fuera de línea.
En comparación con otras bibliotecas de detección de idiomas, el enfoque de Lingua está en la calidad sobre la cantidad , es decir, obtener la detección adecuada para un pequeño conjunto de idiomas primero antes de agregar otros nuevos. Actualmente, los siguientes 75 idiomas son compatibles:
Lingua puede informar estadísticas de precisión para algunos datos de prueba agrupados disponibles para cada idioma compatible. Los datos de prueba para cada idioma se dividen en tres partes:
Tanto los modelos de idiomas como los datos de prueba se han creado a partir de documentos separados de los corpus wortschatz ofrecidos por la Universidad de Leipzig, Alemania. Los datos rastreados de varios sitios web de noticias se han utilizado para la capacitación, cada corpus comprende un millón de oraciones. Para las pruebas, se han utilizado corpus hechos de sitios web elegidos arbitrariamente, cada uno comprende diez mil oraciones. De cada corpus de prueba, se ha extraído un subconjunto aleatorio no organizado de 1000 palabras individuales, 1000 pares de palabras y 1000 oraciones, respectivamente.
Dados los datos de prueba generados, he comparado los resultados de detección de Lingua y Whatlanggo que se ejecutan sobre los datos de los 75 idiomas compatibles con Lingua . Además, he agregado el CLD3 de Google a la comparación con la ayuda de los enlaces GOCLD3. Los idiomas que no son compatibles con CLD3 o Whatlanggo simplemente se ignoran durante el proceso de detección.
Cada una de las siguientes secciones contiene dos parcelas. La trama de barra muestra los resultados de precisión detallados para cada idioma compatible. La gráfica de cuadros ilustra las distribuciones de los valores de precisión para cada clasificador. Las cajas en sí representan las áreas en las que se encuentran el 50 % de los datos medios. Dentro de las cajas de colores, las líneas horizontales marcan la mediana de las distribuciones.
La siguiente tabla muestra estadísticas detalladas para cada idioma y clasificador, incluida la media, la mediana y la desviación estándar.
| Idioma | Promedio | Palabras individuales | Pares de palabras | Oraciones | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lengua (Modo de alta precisión) | Lengua (modo de baja precisión) | CLD3 | Que | Lengua (Modo de alta precisión) | Lengua (modo de baja precisión) | CLD3 | Que | Lengua (Modo de alta precisión) | Lengua (modo de baja precisión) | CLD3 | Que | Lengua (Modo de alta precisión) | Lengua (modo de baja precisión) | CLD3 | Que | |
| africaans | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| albanés | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| árabe | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| armenio | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| Azerbaiyano | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| vasco | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| Bielorruso | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| bengalí | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| Bokmal | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| bosnio | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| búlgaro | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| catalán | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| Chino | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| croata | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| checo | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| danés | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Holandés | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Inglés | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| esperanto | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| Estonio | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| finlandés | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Francés | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| Ganda | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| georgiano | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| Alemán | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| Griego | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| Gujarati | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| hebreo | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| hindi | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| húngaro | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| islandés | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| indonesio | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| irlandés | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| italiano | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| japonés | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Kazáceo | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| coreano | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| latín | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| letón | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| lituano | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| macedónio | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| malayo | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| maorí | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| Marathi | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| mongol | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| Nynorsk | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| persa | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| Polaco | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| portugués | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| punjabi | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| rumano | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| ruso | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| serbio | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| Shona | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| eslovaco | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| esloveno | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| somalí | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| Sotho | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| Español | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| swahili | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| sueco | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| Tagalo | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| Tamil | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| Telugu | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| tailandés | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| Tsonga | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| Tswana | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| turco | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ucranio | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| Urdu | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| vietnamita | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| galés | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| Yoruba | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| zulú | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| Significar | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Mediana | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| Desviación estándar | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
Cada detector de lenguaje utiliza un modelo probabilístico N-Gram entrenado en la distribución de personajes en algún corpus de entrenamiento. La mayoría de las bibliotecas solo usan n-gramos de tamaño 3 (trigramas) que es satisfactorio para detectar el lenguaje de fragmentos de texto más largos que consisten en múltiples oraciones. Sin embargo, para frases cortas o palabras únicas, los trigramas no son suficientes. Cuanto más corto sea el texto de entrada, menos n-gramos están disponibles. Las probabilidades estimadas a partir de tales n-gramos no son confiables. Esta es la razón por la cual Lingua utiliza N-Grams de tamaños 1 hasta 5, lo que resulta en una predicción mucho más precisa del lenguaje correcto.
Una segunda diferencia importante es que Lingua no solo usa un modelo estadístico de este tipo, sino también un motor basado en reglas. Este motor primero determina el alfabeto del texto de entrada y busca caracteres que sean únicos en uno o más idiomas. Si exactamente un idioma se puede elegir de manera confiable de esta manera, el modelo estadístico ya no es necesario. En cualquier caso, el motor basado en reglas filtra los idiomas que no satisfacen las condiciones del texto de entrada. Solo entonces, en un segundo paso, se tiene en cuenta el modelo probabilístico N-Gram. Esto tiene sentido porque cargar menos modelos de idioma significa menos consumo de memoria y un mejor rendimiento de tiempo de ejecución.
En general, siempre es una buena idea restringir el conjunto de idiomas a considerar en el proceso de clasificación utilizando los métodos API respectivos. Si sabe de antemano que ciertos idiomas nunca ocurren en un texto de entrada, no permita que participen en el proceso de clasificación. El mecanismo de filtrado del motor basado en reglas es bastante bueno, sin embargo, el filtrado basado en su propio conocimiento del texto de entrada siempre es preferible.
Si desea reproducir los resultados de precisión anteriores, puede generar los informes de prueba usted mismo para los clasificadores y todos los idiomas haciendo:
cd cmd
go run accuracy_reporter.go
Para que GOCLD3 se ejecute con éxito, debe instalar la versión exacta 3.17.3 de los búferes de protocolo de Google, lo cual es un poco desafortunado. Para cada detector e idioma, un archivo de informe de prueba se escribe en /accuracy-reports . Como ejemplo, aquí está la salida actual del informe de lengua alemana:
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
Lingua requiere al menos Go Versión 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
El código fuente se acompaña de un extenso conjunto de pruebas unitarias. Para ejecutar las pruebas, simplemente diga:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}Por defecto, Lingua devuelve el idioma más probable para un texto de entrada dado. Sin embargo, hay ciertas palabras que se escriben igual en más de un idioma. La palabra prólogo , por ejemplo, es una palabra válida de inglés y francés. Lingua generaría inglés o francés, lo que podría estar equivocado en el contexto dado. Para casos como ese, es posible especificar una distancia relativa mínima que las probabilidades logaritmizadas y resumidas para cada lenguaje posible tienen que satisfacer. Se puede decir de la siguiente manera:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} Tenga en cuenta que la distancia entre las probabilidades del idioma depende de la longitud del texto de entrada. Cuanto más largo sea el texto de entrada, mayor será la distancia entre los idiomas. Entonces, si desea clasificar frases de texto muy cortas, no establezca la distancia relativa mínima demasiado alta. De lo contrario, Unknown se devolverá la mayor parte del tiempo como en el ejemplo anterior. Este es el valor de retorno para los casos en que la detección del idioma no es posible de manera confiable. Este valor no está destinado a ser incluido en el conjunto de lenguajes de entrada al construir el detector de idiomas. Si lo incluye, se eliminará automáticamente del conjunto de lenguajes de entrada.
Saber sobre el lenguaje más probable es bueno, pero ¿qué tan confiable es la probabilidad calculada? ¿Y qué menos probables son los otros idiomas examinados en comparación con el más probable? Estas preguntas también se pueden responder:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} En el ejemplo anterior, se devuelve una porción de ConfidenceValue que contiene todos los idiomas posibles ordenados por su valor de confianza en el orden descendente. Cada valor es una probabilidad entre 0.0 y 1.0. Las probabilidades de todos los idiomas se sumarán a 1.0. Si el motor de reglas identifica inequívocamente el idioma, el valor 1.0 siempre se devolverá para este idioma. Los otros idiomas recibirán un valor de 0.0.
También hay un método para devolver el valor de confianza de un solo idioma específico:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04El valor que calcula este método es un número entre 0.0 y 1.0. Si el motor de regla identifica inequívocamente el lenguaje, el valor 1.0 siempre se devolverá. Si el idioma dado no es compatible con esta instancia de detector, el valor 0.0 siempre se devolverá.
De forma predeterminada, Lingua utiliza la carga perezosa para cargar solo aquellos modelos de lenguaje a pedido que se consideran relevantes por el motor de filtro basado en reglas. Para los servicios web, por ejemplo, es bastante beneficioso precargar todos los modelos de lenguaje en la memoria para evitar una latencia inesperada mientras espera la respuesta del servicio. Si desea habilitar el modo de carga ansiosa, puede hacerlo así:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Múltiples instancias de LanguageDetector comparten los mismos modelos de idioma en la memoria a los que se accede asincrónicamente por las instancias.
La alta precisión de la detección de Lingua tiene el costo de ser notablemente más lento que otros detectores de idiomas. Los modelos de idiomas grandes también consumen cantidades significativas de memoria. Es posible que estos requisitos no sean factibles para los sistemas que se cuentan con recursos bajos. Si desea clasificar principalmente textos largos o necesita guardar recursos, puede habilitar un modo de baja precisión que cargue solo un pequeño subconjunto de los modelos de idioma en la memoria:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()La desventaja de este enfoque es que la precisión de detección para textos cortos que consisten en menos de 120 caracteres disminuirá significativamente. Sin embargo, la precisión de detección para textos que tienen más de 120 caracteres no se verán afectados.
En el modo de alta precisión (el valor predeterminado), el detector del idioma consume aproximadamente 1,800 MB de memoria si se cargan todos los modelos de idioma. En el modo de baja precisión, el consumo de memoria se reduce a aproximadamente 110 MB. El objetivo es reducir aún más el consumo de memoria en versiones posteriores.
Una alternativa para una huella de memoria más pequeña y un rendimiento más rápido es reducir el conjunto de idiomas al construir el detector de idiomas. En la mayoría de los casos, no es aconsejable construir el detector a partir de todos los idiomas compatibles. Cuando tiene conocimiento sobre los textos que desea clasificar, casi siempre puede descartar ciertos idiomas como imposibles o poco probables.
A diferencia de la mayoría de los otros detectores de idiomas, Lingua puede detectar múltiples idiomas en textos de lenguaje mixto. Esta característica puede producir resultados bastante razonables, pero todavía está en un estado experimental y, por lo tanto, el resultado de detección depende en gran medida del texto de entrada. Funciona mejor en modo de alta precisión con múltiples palabras largas para cada idioma. Cuanto más cortas son las frases y sus palabras, menos precisas son los resultados. Reducir el conjunto de idiomas al construir el detector del idioma también puede mejorar la precisión de esta tarea si los idiomas que ocurren en el texto son iguales a los idiomas respaldados por la instancia del detector de idiomas respectivo.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} En el ejemplo anterior, se devuelve una porción de DetectionResult . Cada entrada en el corte describe una sección de texto de lenguaje único contiguo, proporcionando índices de inicio y finalización de la subcadena respectiva.
Puede haber tareas de clasificación en las que sepa de antemano que los datos de su idioma definitivamente no se escriben en latín, por ejemplo. La precisión de la detección puede mejorar en tales casos si excluye ciertos idiomas del proceso de decisión o simplemente incluye explícitamente idiomas relevantes:
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )Eche un vistazo a los problemas planificados.
Cualquier contribución a Lingua es muy apreciada. Lea las instrucciones para CONTRIBUTING.md sobre cómo agregar nuevos idiomas a la biblioteca.