
Sa tâche est simple: il vous indique dans quelle langue un texte est écrit. Ceci est très utile comme étape de prétraitement pour les données linguistiques dans les applications de traitement du langage naturel telles que la classification du texte et la vérification des orthographiques. D'autres cas d'utilisation, par exemple, peuvent inclure des e-mails de routage vers le bon service client géographiquement situé géographiquement, sur la base des langues des e-mails.
La détection du langage se fait souvent dans le cadre de grands cadres d'apprentissage automatique ou d'applications de traitement du langage naturel. Dans les cas où vous n'avez pas besoin des fonctionnalités à part entière de ces systèmes ou ne voulez pas apprendre les cordes de ceux-ci, une petite bibliothèque flexible est utile.
Jusqu'à présent, la seule autre bibliothèque open source complète de l'écosystème Go pour cette tâche est Whatlanggo . Malheureusement, il présente deux inconvénients majeurs:
Lingua vise à éliminer ces problèmes. Elle n'a presque pas besoin de configuration et donne des résultats assez précis sur le texte long et court, même sur des mots et des phrases uniques. Elle s'appuie à la fois sur des méthodes basées sur des règles et statistiques mais n'utilise aucun dictionnaire de mots. Elle n'a pas non plus besoin d'une connexion à aucune API ou service externe. Une fois la bibliothèque téléchargée, elle peut être utilisée complètement hors ligne.
Par rapport aux autres bibliothèques de détection de langues, Lingua se concentre sur la qualité de la quantité , c'est-à-dire que la détection est correcte pour un petit ensemble de langues avant d'en ajouter de nouvelles. Actuellement, les 75 langues suivantes sont prises en charge:
Lingua est en mesure de signaler les statistiques de précision pour certaines données de test groupées disponibles pour chaque langue prise en charge. Les données de test pour chaque langue sont divisées en trois parties:
Les modèles linguistiques et les données de test ont été créés à partir de documents distincts des corpus Wortschatz offerts par l'Université de Leipzig, en Allemagne. Les données rampées à partir de divers sites de nouvelles ont été utilisées pour la formation, chaque corpus comprenant un million de phrases. Pour les tests, les corpus en sites Web choisis arbitrairement ont été utilisés, chacun comprenant dix mille phrases. À partir de chaque corpus de test, un sous-ensemble aléatoire non trié de 1000 mots simples, 1000 paires de mots et 1000 phrases a été extrait, respectivement.
Compte tenu des données de test générées, j'ai comparé les résultats de détection de Lingua et Whatlanggo sur les données des 75 langues prises en charge de Lingua . De plus, j'ai ajouté CLD3 de Google à la comparaison avec l'aide des liaisons GOCLD3. Les langues qui ne sont pas prises en charge par CLD3 ou Whatlanggo sont simplement ignorées pendant le processus de détection.
Chacune des sections suivantes contient deux parcelles. Le tracé de la barre montre les résultats de précision détaillés pour chaque langue prise en charge. Le tracé de la boîte illustre les distributions des valeurs de précision pour chaque classificateur. Les boîtes elles-mêmes représentent les zones dans lesquelles les 50% du milieu se trouvent dans les données. Dans les boîtes colorées, les lignes horizontales marquent la médiane des distributions.
Le tableau ci-dessous montre des statistiques détaillées pour chaque langue et classificateur, y compris la moyenne, la médiane et l'écart type.
| Langue | Moyenne | Mots simples | Paires de mots | Phrases | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Lingua (Mode de haute précision) | Lingua (mode de faible précision) | CLD3 | Whatlang | Lingua (Mode de haute précision) | Lingua (mode de faible précision) | CLD3 | Whatlang | Lingua (Mode de haute précision) | Lingua (mode de faible précision) | CLD3 | Whatlang | Lingua (Mode de haute précision) | Lingua (mode de faible précision) | CLD3 | Whatlang | |
| afrikaans | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| albanais | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| arabe | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| arménien | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| azerbaïdjanais | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| Basque | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| Biéloruste | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| bengali | 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 |
| Bosnie | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| bulgare | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| catalan | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| Chinois | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| croate | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| tchèque | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| danois | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| Néerlandais | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| Anglais | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| espéranto | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| estonien | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| finlandais | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| Français | 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 | - | - |
| géorgien | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| Allemand | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| grec | 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 |
| hébreu | 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 |
| hongrois | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| islandais | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| indonésien | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| irlandais | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| italien | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| japonais | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| Kazakh | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| coréen | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| latin | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| letton | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| lituanien | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| Macédonien | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| malais | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| Maoris | 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 |
| persan | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| polonais | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| portugais | 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 |
| roumain | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| russe | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| serbe | 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 |
| slovaque | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| slovène | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| somali | 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 | - |
| Espagnol | 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 | - |
| suédois | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| Tagalog | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| Tamoul | 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 |
| thaïlandais | 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 | - | - |
| turc | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| ukrainien | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| Ourdou | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| vietnamien | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| gallois | 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 |
| zoulou | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| Signifier | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| Médian | 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 |
| Écart-type | 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 |
Chaque détecteur de langue utilise un modèle N-gram probabiliste formé sur la distribution des caractères dans certains corpus d'entraînement. La plupart des bibliothèques n'utilisent que des n-grammes de taille 3 (trigrammes), ce qui est satisfaisant pour détecter la langue des fragments de texte plus longs composés de plusieurs phrases. Pour les phrases courtes ou les mots uniques, cependant, les trigrammes ne suffisent pas. Plus le texte d'entrée est court, moins les grammes N sont disponibles. Les probabilités estimées à partir de ces quelques n-grammes ne sont pas fiables. C'est pourquoi Lingua utilise des n-grammes de tailles 1 jusqu'à 5, ce qui se traduit par une prédiction beaucoup plus précise de la langue correcte.
Une deuxième différence importante est que Lingua n'utilise pas seulement un tel modèle statistique, mais aussi un moteur basé sur des règles. Ce moteur détermine d'abord l'alphabet du texte d'entrée et recherche des caractères uniques dans une ou plusieurs langues. Si exactement une langue peut être choisie de manière fiable de cette façon, le modèle statistique n'est plus nécessaire. Dans tous les cas, le moteur basé sur des règles filtre les langues qui ne satisfont pas aux conditions du texte d'entrée. Ce n'est qu'à ce moment-là, dans une deuxième étape, le modèle probabiliste N-gram est pris en considération. Cela a du sens car le chargement des modèles de langue moins de la langue signifie moins de consommation de mémoire et de meilleures performances d'exécution.
En général, c'est toujours une bonne idée de restreindre l'ensemble des langues à considérer dans le processus de classification en utilisant les méthodes API respectives. Si vous savez au préalable que certaines langues ne se produisent jamais dans un texte d'entrée, ne laissez pas les personnes participer au processus de classifcation. Le mécanisme de filtrage du moteur basé sur des règles est assez bon, cependant, le filtrage basé sur votre propre connaissance du texte d'entrée est toujours préférable.
Si vous souhaitez reproduire les résultats de précision ci-dessus, vous pouvez générer les rapports de test vous-même pour les classificateurs et toutes les langues en faisant:
cd cmd
go run accuracy_reporter.go
Pour que GOCLD3 s'exécute avec succès, vous devez installer la version 3.17.3 exacte des tampons de protocole de Google, ce qui est un peu regrettable. Pour chaque détecteur et langue, un fichier de rapport de test est ensuite rédigé dans /accuracy-reports . À titre d'exemple, voici la sortie actuelle du rapport allemand de Lingua :
##### 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 nécessite au moins GO Version 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
Le code source s'accompagne d'une vaste suite de test unitaire. Pour exécuter les tests, dites simplement:
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
}Par défaut, Lingua renvoie la langue la plus probable pour un texte d'entrée donné. Cependant, certains mots sont orthographiés de la même manière dans plus d'une langue. Le mot prologue , par exemple, est à la fois un mot anglais et français valide. Lingua sortirait l'anglais ou le français, ce qui pourrait être faux dans le contexte donné. Pour des cas comme celui-ci, il est possible de spécifier une distance relative minimale que les probabilités logarithmiques et résumées pour chaque langue possible doivent satisfaire. Il peut être énoncé de la manière suivante:
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
} Sachez que la distance entre les probabilités de langue dépend de la longueur du texte d'entrée. Plus le texte d'entrée est long, plus la distance entre les langues est grande. Donc, si vous souhaitez classer les phrases de texte très courtes, ne définissez pas la distance relative minimale trop élevée. Sinon, Unknown sera retourné la plupart du temps comme dans l'exemple ci-dessus. Il s'agit de la valeur de retour pour les cas où la détection du langage n'est pas possible de manière fiable. Cette valeur n'est pas destinée à être incluse dans l'ensemble des langages d'entrée lors de la construction du détecteur de langue. Si vous l'incluez, il sera automatiquement supprimé de l'ensemble des langages d'entrée.
Connaître le langage le plus probable est agréable, mais à quel point la probabilité calculée est-elle fiable? Et à quel point les autres langues examinées sont-elles moins probables par rapport à la plus probable? Ces questions peuvent également être répondues:
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
} Dans l'exemple ci-dessus, une tranche de ConfidenceValue est renvoyée contenant toutes les langues possibles triées par leur valeur de confiance dans l'ordre descendant. Chaque valeur est une probabilité entre 0,0 et 1,0. Les probabilités de toutes les langues résumeront à 1.0. Si la langue est identifiée sans ambiguïté par le moteur de règle, la valeur 1.0 sera toujours retournée pour cette langue. Les autres langues recevront une valeur de 0,0.
Il existe également une méthode pour renvoyer la valeur de confiance pour une langue spécifique uniquement:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04La valeur que cette méthode calcule est un nombre entre 0,0 et 1,0. Si la langue est identifiée sans ambiguïté par le moteur de règle, la valeur 1.0 sera toujours retournée. Si la langue donnée n'est pas prise en charge par cette instance de détection, la valeur 0.0 sera toujours renvoyée.
Par défaut, Lingua utilise un chargement paresseux pour charger uniquement les modèles de langue à la demande qui sont considérés comme pertinents par le moteur de filtre basé sur des règles. Pour les services Web, par exemple, il est plutôt avantageux de précharger tous les modèles de langue en mémoire pour éviter une latence inattendue en attendant la réponse du service. Si vous souhaitez activer le mode de chargement impatient, vous pouvez le faire comme ceci:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () Plusieurs instances de LanguageDetector partagent les mêmes modèles de langue en mémoire qui sont accessibles de manière asynchrone par les instances.
La haute précision de détection de Lingua se fait au prix d'être sensiblement plus lent que les autres détecteurs de langue. Les grands modèles de langue consomment également des quantités importantes de mémoire. Ces exigences pourraient ne pas être réalisables pour les systèmes à faible teneur en ressources. Si vous souhaitez classer les textes principalement longs ou devez enregistrer des ressources, vous pouvez activer un mode de faible précision qui ne charge qu'un petit sous-ensemble des modèles de langue en mémoire:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()L'inconvénient de cette approche est que la précision de détection pour les textes courts composés de moins de 120 caractères baissera considérablement. Cependant, la précision de détection pour les textes de plus de 120 caractères restera principalement non affectées.
En mode haute précision (par défaut), le détecteur de langue consomme environ 1 800 Mo de mémoire si tous les modèles de langue sont chargés. En mode de faible précision, la consommation de mémoire est réduite à environ 110 Mo. L'objectif est de réduire davantage la consommation de mémoire dans les versions ultérieures.
Une alternative pour une empreinte mémoire plus petite et des performances plus rapides consiste à réduire l'ensemble des langues lors de la construction du détecteur de langue. Dans la plupart des cas, il n'est pas conseillé de construire le détecteur à partir de toutes les langues prises en charge. Lorsque vous avez des connaissances sur les textes que vous souhaitez classer, vous pouvez presque toujours exclure certaines langues comme impossibles ou peu susceptibles de se produire.
Contrairement à la plupart des autres détecteurs de langues, Lingua est capable de détecter plusieurs langues dans des textes mixtes. Cette fonctionnalité peut donner des résultats tout à fait raisonnables, mais il est toujours dans un état expérimental et, par conséquent, le résultat de détection dépend fortement du texte d'entrée. Il fonctionne mieux en mode haute précision avec plusieurs longs mots pour chaque langue. Plus les phrases et leurs mots sont courts, moins les résultats sont précis. La réduction de l'ensemble des langues lors de la construction du détecteur de langues peut également améliorer la précision de cette tâche si les langues survenant dans le texte sont égales aux langues prises en charge par l'instance de détecteur de langage respectif.
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.'
} Dans l'exemple ci-dessus, une tranche de DetectionResult est renvoyée. Chaque entrée de la tranche décrit une section de texte unique contigu, fournissant des indices de démarrage et de fin de la sous-chaîne respective.
Il peut y avoir des tâches de classification où vous savez au préalable que vos données linguistiques ne sont certainement pas écrites en latin, par exemple. La précision de détection peut devenir meilleure dans de tels cas si vous excluez certaines langues du processus de décision ou incluez simplement explicitement les langues pertinentes:
// 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 )Jetez un œil aux problèmes prévus.
Toute contribution à Lingua est très appréciée. Veuillez lire les instructions dans CONTRIBUTING.md pour comment ajouter de nouvelles langues à la bibliothèque.