predict4all est une bibliothèque de prédiction de mots suivants précise, rapide, légère, multilingue, gratuite et open source .
Il a pour vocation d'être intégré dans des applications pour afficher les mots suivants possibles et faciliter la saisie de l'utilisateur : claviers virtuels, éditeurs de texte, systèmes AAC...
L'originalité predict4all réside dans son modèle de correction : il fonctionne grâce à un ensemble de règles de correction (générales ou spécifiques : accents, grammaire, espace manquant, etc). Ce modèle de correction permet à la correction d'intervenir plus tôt dans la prédiction par rapport aux techniques de distance par chaîne. Cela permet également à la correction d'être similaire au correcteur existant (par exemple GBoard) mais d'être améliorée avec une règle personnalisée basée sur les erreurs de l'utilisateur (dysorthographie, dyslexie, etc.)
predict4all a été co-conçu avec des orthophonistes et des ergothérapeutes du CMRRF Kerpape et de l'Hôpital Raymond Poincaré pour s'assurer qu'il corresponde aux besoins et exigences des utilisateurs ayant des troubles de la parole et de l'écriture de textes. Une attention particulière a été accordée à la détermination des erreurs courantes et particulières commises par les personnes atteintes de dysorthographie et de dyslexie.
Actuellement, predict4all prend en charge la langue française (règles fournies et modèle linguistique pré-entraîné).
Cette bibliothèque a été développée dans le cadre du projet collaboratif predict4all impliquant le CMRRF Kerpape, l'Hôpital Raymond Poincaré et l'équipe BdTln, LIFAT, Université de Tours
predict4all est soutenu par la Fondation Paul Bennetot, Fondation du Groupe Matmut sous la Fondation de l'Avenir, Paris, France ( projet AP-FPB 16-001 )
Ce projet a été intégré dans les logiciels AAC suivants : LifeCompanion, Sibylle, CiviKey
Le projet est toujours développé dans le projet AAC4ALL.
Entraînez-vous (voir « Entraîner votre propre modèle de langage ») ou téléchargez un modèle de langage. Un modèle de langue française pré-calculé est disponible :
Le modèle de langue française a été entraîné sur plus de +20 millions de mots issus de Wikipédia et du corpus de sous-titres. Le vocabulaire contient environ 112 000 mots uniques.
Obtenez la bibliothèque via votre gestionnaire de dépendances préféré :
Maven
< dependency >
< groupId >io.github.mthebaud</ groupId >
< artifactId > predict4all </ artifactId >
< version >1.2.0</ version >
</ dependency >
Graduation
implementation 'io.github.mthebaud: predict4all :1.2.0'
Dans les exemples suivants, nous supposons que vous avez initialisé un modèle de langage, un prédicteur, etc.
final File FILE_NGRAMS = new File ( "fr_ngrams.bin" );
final File FILE_WORDS = new File ( "fr_words.bin" );
LanguageModel languageModel = new FrenchLanguageModel ();
PredictionParameter predictionParameter = new PredictionParameter ( languageModel );
WordDictionary dictionary = WordDictionary . loadDictionary ( languageModel , FILE_WORDS );
try ( StaticNGramTrieDictionary ngramDictionary = StaticNGramTrieDictionary . open ( FILE_NGRAMS )) {
WordPredictor wordPredictor = new WordPredictor ( predictionParameter , dictionary , ngramDictionary );
// EXAMPLE CODE SHOULD RUN HERE
}
Vous pouvez trouver le code de travail complet pour ces exemples et des exemples plus complexes dans predict4all -example
Veuillez lire le Javadoc (les cours publics sont bien documentés)
WordPredictionResult predictionResult = wordPredictor . predict ( "j'aime manger des " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Résultat (modèle de langue française)
trucs = 0.16105959785338766 (insert = trucs, remove = 0, space = true)
fruits = 0.16093509126844632 (insert = fruits, remove = 0, space = true)
bonbons = 0.11072838908013616 (insert = bonbons, remove = 0, space = true)
gâteaux = 0.1107102433239866 (insert = gâteaux, remove = 0, space = true)
frites = 0.1107077522148962 (insert = frites, remove = 0, space = true)
WordPredictionResult predictionResult = wordPredictor . predict ( "je te r" );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Résultat (modèle de langue française)
rappelle = 0.25714609184509885 (insert = appelle, remove = 0, space = true)
remercie = 0.12539880967030353 (insert = emercie, remove = 0, space = true)
ramène = 0.09357117922321868 (insert = amène, remove = 0, space = true)
retrouve = 0.07317575867400958 (insert = etrouve, remove = 0, space = true)
rejoins = 0.06404375655722373 (insert = ejoins, remove = 0, space = true)
Pour régler WordPredictor, vous pouvez explorer PredictionParameter javadoc
CorrectionRuleNode root = new CorrectionRuleNode ( CorrectionRuleNodeType . NODE );
root . addChild ( FrenchDefaultCorrectionRuleGenerator . CorrectionRuleType . ACCENTS . generateNodeFor ( predictionParameter ));
predictionParameter . setCorrectionRulesRoot ( root );
predictionParameter . setEnableWordCorrection ( true );
WordPredictor wordPredictor = new WordPredictor ( predictionParameter , dictionary , ngramDictionary );
WordPredictionResult predictionResult = wordPredictor . predict ( "il eta" );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Résultat (modèle de langue française)
était = 0.9485814446960688 (insert = était, remove = 3, space = true)
établit = 0.05138460933797299 (insert = établit, remove = 3, space = true)
étale = 7.544080911878824E-6 (insert = étale, remove = 3, space = true)
établissait = 4.03283914323952E-6 (insert = établissait, remove = 3, space = true)
étaye = 4.025324786425216E-6 (insert = étaye, remove = 3, space = true)
Dans cet exemple, supprimer devient positif car la première lettre du mot est incorrecte : le texte saisi précédemment doit être supprimé avant l'insertion.
DynamicNGramDictionary dynamicNGramDictionary = new DynamicNGramDictionary ( 4 );
predictionParameter . setDynamicModelEnabled ( true );
WordPredictor wordPredictor = new WordPredictor ( predictionParameter , dictionary , ngramDictionary , dynamicNGramDictionary );
WordPredictionResult predictionResult = wordPredictor . predict ( "je vais à la " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
wordPredictor . trainDynamicModel ( "je vais à la gare" );
predictionResult = wordPredictor . predict ( "je vais à la " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Résultat (modèle de langue française)
fête = 0.3670450710570904 (insert = fête, remove = 0, space = true)
bibliothèque = 0.22412342109445696 (insert = bibliothèque, remove = 0, space = true)
salle = 0.22398910838330122 (insert = salle, remove = 0, space = true)
fin = 0.014600071765987328 (insert = fin, remove = 0, space = true)
suite = 0.014315510457449597 (insert = suite, remove = 0, space = true)
- After training
fête = 0.35000112941797795 (insert = fête, remove = 0, space = true)
bibliothèque = 0.2137161256141207 (insert = bibliothèque, remove = 0, space = true)
salle = 0.213588049788271 (insert = salle, remove = 0, space = true)
gare = 0.045754860284824 (insert = gare, remove = 0, space = true)
fin = 0.013922109328323544 (insert = fin, remove = 0, space = true)
Dans cet exemple, le mot « gare » apparaît après avoir entraîné le modèle avec « je vais à la gare ».
Attention , entraîner un modèle avec une mauvaise phrase corrompra vos données.
Lorsque vous utilisez un modèle dynamique, vous devez prendre soin de sauvegarder/charger deux fichiers différents : les ngrammes utilisateur et le dictionnaire de mots utilisateur.
Les fichiers originaux ne seront pas modifiés, pour être partagés entre différents utilisateurs : le bon modèle d'implémentation.
Une fois votre modèle entraîné, vous souhaiterez peut-être le sauvegarder :
dynamicNGramDictionary . saveDictionary ( new File ( "fr_user_ngrams.bin" ));
et plus tard, chargez-le à nouveau (et transmettez-le au constructeur WordPredictor)
DynamicNGramDictionary dynamicNGramDictionary = DynamicNGramDictionary . load ( new File ( "fr_user_ngrams.bin" ));
Vous pouvez également sauvegarder le dictionnaire de mots si de nouveaux mots ont été ajoutés :
dictionary . saveUserDictionary ( new File ( "fr_user_words.bin" ));
et chargez-le à nouveau plus tard (sur une instance WordDictionary existante)
dictionary . loadUserDictionary ( new File ( "fr_user_words.bin" ));
Il est parfois utile de modifier le vocabulaire disponible pour mieux adapter les prédictions à l'utilisateur.
Cela peut être fait en travaillant avec WordDictionary, par exemple, vous pouvez désactiver un mot :
Word maisonWord = dictionary . getWord ( "maison" );
maisonWord . setForceInvalid ( true , true );
Ou vous pouvez montrer à l'utilisateur tous les mots personnalisés ajoutés au dictionnaire :
dictionary . getAllWords (). stream ()
. filter ( w -> w . isValidToBePredicted ( predictionParameter )) // don't want to display to the user the word that would never appears in prediction
. filter ( Word :: isUserWord ) // get only the user added words
. forEach ( w -> System . out . println ( w . getWord ()));
Lorsque vous modifiez des mots (originaux ou ajoutés par les utilisateurs), n'oubliez pas de sauvegarder le dictionnaire utilisateur : il enregistrera les mots des utilisateurs mais également les modifications des mots originaux.
Vous pouvez trouver plus d’informations en consultant Word javadoc
Lorsque vous utilisez predict4all , vous devez noter que :
Pour entraîner votre propre modèle de langage, vous devrez d'abord préparer :
Un bon CPU est également un point clé : predict4all utilise fortement des algorithmes multi-thread, donc plus vous obtenez de cœurs, plus l'entraînement sera rapide
Ensuite, vous pouvez exécuter l'exécutable jar (version précompilée disponible) avec une ligne de commande :
java -Xmx16G -jar predict4all -model-trainer-cmd-1.1.0-all.jar -config fr_training_configuration.json -language fr -ngram-dictionary fr_ngrams.bin -word-dictionary fr_words.bin path/to/corpus
Cette commande lancera un entraînement, permettant à la JVM d'obtenir 16 Go de mémoire, et donnant une configuration d'entrée et de sortie.
Les fichiers de données générés seront fr_ngrams.bin et fr_words.bin
Vous pouvez également consulter LanguageDataModelTrainer dans predict4all -model-trainer-cmd pour lancer votre formation par programme.
S'il vous plaît laissez-nous savoir si vous utilisez predict4all !
N'hésitez pas à remplir un problème si vous avez besoin d'aide ou si vous trouvez un bug.
Ce logiciel est distribué sous la Licence Apache 2.0 (voir fichier LICENCE)
Ce projet a développé diverses techniques de PNL (principalement basées sur ngram)
predict4all est construit à l'aide des actions Github pour publier de nouvelles versions sur Maven Central
Pour créer une version
Document de référence sur l'édition