predict4all es una biblioteca de predicción de siguientes palabras precisa, rápida, liviana, multilingüe, gratuita y de código abierto .
Su objetivo es integrarse en aplicaciones para mostrar posibles palabras siguientes y ayudar a la entrada del usuario: teclados virtuales, editores de texto, sistemas AAC...
La originalidad predict4all reside en su modelo de corrección : funciona gracias a un conjunto de reglas de corrección (generales o específicas: acentos, gramática, espacios faltantes, etc.). Este modelo de corrección permite que la corrección se produzca antes en la predicción en comparación con las técnicas de distancia de cuerdas. Esto también permite que la corrección sea similar al corrector existente (por ejemplo, GBoard), pero mejorada con reglas personalizadas basadas en errores del usuario (disortografía, dislexia, etc.).
predict4all fue diseñado conjuntamente con logopedas y terapeutas ocupacionales de CMRRF Kerpape y el Hospital Raymond Poincaré para garantizar que satisfaga las necesidades y requisitos de los usuarios con problemas de habla y escritura de textos. Se prestó especial atención a determinar errores comunes y particulares cometidos por personas con disortografía y dislexia.
Actualmente, predict4all admite el idioma francés (reglas proporcionadas y un modelo de lenguaje previamente entrenado).
Esta biblioteca fue desarrollada en el proyecto colaborativo predict4all en el que participan CMRRF Kerpape, Hopital Raymond Poincaré y BdTln Team, LIFAT, Université de Tours.
predict4all cuenta con el apoyo de la Fondation Paul Bennetot, Fondation du Groupe Matmut bajo la Fondation de l'Avenir, París, Francia ( proyecto AP-FPB 16-001 )
Este proyecto se ha integrado en el siguiente software AAC: LifeCompanion, Sibylle, CiviKey
El proyecto todavía está desarrollado en el proyecto AAC4ALL.
Entrene (consulte "Entrenar su propio modelo de lenguaje") o descargue un modelo de lenguaje. El modelo de idioma francés precalculado está disponible:
El modelo de idioma francés se ha entrenado en más de 20 millones de palabras de Wikipedia y corpus de subtítulos. El vocabulario contiene ~112 000 palabras únicas.
Obtenga la biblioteca a través de su administrador de dependencias favorito:
experto
< dependency >
< groupId >io.github.mthebaud</ groupId >
< artifactId > predict4all </ artifactId >
< version >1.2.0</ version >
</ dependency >
Gradle
implementation 'io.github.mthebaud: predict4all :1.2.0'
En los siguientes ejemplos, asumimos que inicializó el modelo de lenguaje, el predictor, 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
}
Puede encontrar el código de trabajo completo para estos ejemplos y otros más complejos en predict4all -example
Lea el Javadoc (las clases públicas están bien documentadas)
WordPredictionResult predictionResult = wordPredictor . predict ( "j'aime manger des " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Resultado (modelo de lengua francesa)
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 );
}
Resultado (modelo de lengua francesa)
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)
Para ajustar WordPredictor, puede explorar el javadoc PredictionParameter
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 );
}
Resultado (modelo de lengua francesa)
é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)
En este ejemplo, eliminar se vuelve positivo ya que la primera letra de la palabra es incorrecta: el texto escrito anteriormente debe eliminarse antes de insertar.
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 );
}
Resultado (modelo de lengua francesa)
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)
En este ejemplo, la palabra "gare" aparece después de entrenar el modelo con "je vais à la gare".
Tenga cuidado , entrenar un modelo con una oración incorrecta dañará sus datos.
Cuando utilice un modelo dinámico, debe encargarse de guardar/cargar dos archivos diferentes: ngrams de usuario y diccionario de palabras de usuario.
Los archivos originales no se modificarán y se compartirán entre diferentes usuarios: el buen patrón de implementación.
Una vez que su modelo esté entrenado, es posible que desee guardarlo:
dynamicNGramDictionary . saveDictionary ( new File ( "fr_user_ngrams.bin" ));
y luego cargarlo nuevamente (y pasarlo al constructor de WordPredictor)
DynamicNGramDictionary dynamicNGramDictionary = DynamicNGramDictionary . load ( new File ( "fr_user_ngrams.bin" ));
También puedes guardar el diccionario de palabras si se han agregado nuevas palabras:
dictionary . saveUserDictionary ( new File ( "fr_user_words.bin" ));
y luego cargarlo nuevamente (en una instancia de WordDictionary existente)
dictionary . loadUserDictionary ( new File ( "fr_user_words.bin" ));
A veces resulta útil modificar el vocabulario disponible para adaptar mejor las predicciones al usuario.
Esto se puede hacer trabajando con WordDictionary, por ejemplo, puedes desactivar una palabra:
Word maisonWord = dictionary . getWord ( "maison" );
maisonWord . setForceInvalid ( true , true );
O puede mostrarle al usuario todas las palabras personalizadas agregadas al diccionario:
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 ()));
Cuando modifique palabras (originales o agregadas por los usuarios), no olvide guardar el diccionario del usuario: guardará las palabras del usuario pero también las modificaciones de las palabras originales.
Puedes encontrar más información consultando Word javadoc
Al utilizar predict4all , debes tener en cuenta que:
Para entrenar su propio modelo de lenguaje, primero deberá preparar:
Una buena CPU también es un punto clave: predict4all utiliza fuertemente algoritmos multiproceso, por lo que cuanto más núcleo obtenga, más rápido será el entrenamiento.
Luego, puede ejecutar el jar ejecutable (versión precompilada disponible) con una línea de comando:
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
Este comando iniciará un entrenamiento, lo que permitirá que la JVM obtenga 16 GB de memoria y brindará una configuración de entrada y salida.
Los archivos de datos generados serán fr_ngrams.bin y fr_words.bin
Alternativamente, puede consultar LanguageDataModelTrainer en predict4all -model-trainer-cmd para iniciar su capacitación mediante programación.
¡Háganos saber si utiliza predict4all !
No dude en completar un problema si necesita ayuda o si encuentra un error.
Este software se distribuye bajo la Licencia Apache 2.0 (ver archivo LICENCIA)
En este proyecto se desarrollaron varias técnicas de PNL (principalmente basadas en ngram)
predict4all se construye utilizando acciones de Github para publicar nuevas versiones en Maven Central
Para crear una versión
Documento de referencia sobre edición.