predict4all ist eine genaue, schnelle, leichte, mehrsprachige, kostenlose und Open-Source-Bibliothek zur Vorhersage des nächsten Wortes .
Es soll in Anwendungen integriert werden, um mögliche nächste Wörter anzuzeigen und Benutzereingaben zu erleichtern: virtuelle Tastaturen, Texteditoren, AAC-Systeme ...
predict4all Originality basiert auf seinem Korrekturmodell : Es funktioniert dank einer Reihe von Korrekturregeln (allgemein oder spezifisch: Akzente, Grammatik, fehlende Leerzeichen usw.). Dieses Korrekturmodell ermöglicht, dass die Korrektur im Vergleich zu String-Distance-Techniken früher in der Vorhersage erfolgt. Dies ermöglicht auch, dass die Korrektur dem vorhandenen Korrektor (z. B. GBoard) ähnelt, jedoch um benutzerdefinierte Regeln erweitert wird, die auf Benutzerfehlern (Dysorthographie, Legasthenie usw.) basieren.
predict4all wurde gemeinsam mit Logopäden und Ergotherapeuten von CMRRF Kerpape und Hopital Raymond Poincaré entwickelt, um sicherzustellen, dass es den Bedürfnissen und Anforderungen von Benutzern mit Sprach- und Textschreibproblemen entspricht. Besonderes Augenmerk wurde darauf gelegt, häufige und besondere Fehler von Menschen mit Dysorthographie und Legasthenie zu ermitteln.
Derzeit unterstützt predict4all die französische Sprache (bereitgestellte Regeln und vorab trainiertes Sprachmodell).
Diese Bibliothek wurde im Rahmen des Gemeinschaftsprojekts predict4all entwickelt, an dem CMRRF Kerpape, Hopital Raymond Poincaré und BdTln Team, LIFAT, Université de Tours beteiligt waren
predict4all wird unterstützt von der Fondation Paul Bennetot, der Fondation du Groupe Matmut unter der Fondation de l'Avenir, Paris, Frankreich ( Projekt AP-FPB 16-001 )
Dieses Projekt wurde in die folgende AAC-Software integriert: LifeCompanion, Sibylle, CiviKey
Das Projekt wird weiterhin im AAC4ALL-Projekt entwickelt.
Trainieren Sie (siehe „Trainieren Sie Ihr eigenes Sprachmodell“) oder laden Sie ein Sprachmodell herunter. Es ist ein vorberechnetes französisches Sprachmodell verfügbar:
Das französische Sprachmodell wurde mit mehr als 20 Millionen Wörtern aus Wikipedia und dem Untertitelkorpus trainiert. Der Wortschatz enthält ca. 112.000 einzigartige Wörter.
Holen Sie sich die Bibliothek über Ihren bevorzugten Abhängigkeitsmanager:
Maven
< dependency >
< groupId >io.github.mthebaud</ groupId >
< artifactId > predict4all </ artifactId >
< version >1.2.0</ version >
</ dependency >
Gradle
implementation 'io.github.mthebaud: predict4all :1.2.0'
In den folgenden Beispielen gehen wir davon aus, dass Sie das Sprachmodell, den Prädiktor usw. initialisiert haben.
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
}
Vollständigen Arbeitscode für diese Beispiele und komplexere Beispiele finden Sie in predict4all -example
Bitte lesen Sie das Javadoc (öffentliche Klassen sind gut dokumentiert)
WordPredictionResult predictionResult = wordPredictor . predict ( "j'aime manger des " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Ergebnis (französisches Sprachmodell)
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 );
}
Ergebnis (französisches Sprachmodell)
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)
Um den WordPredictor zu optimieren, können Sie PredictionParameter javadoc erkunden
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 );
}
Ergebnis (französisches Sprachmodell)
é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)
In diesem Beispiel wird „Entfernen“ positiv, da der erste Buchstabe im Wort falsch ist: Der zuvor eingegebene Text sollte vor dem Einfügen entfernt werden.
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 );
}
Ergebnis (französisches Sprachmodell)
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)
In diesem Beispiel erscheint das Wort „gare“, nachdem das Modell mit „je vais à la gare“ trainiert wurde.
Seien Sie vorsichtig , denn wenn Sie ein Modell mit einem falschen Satz trainieren, werden Ihre Daten beschädigt.
Wenn Sie ein dynamisches Modell verwenden, sollten Sie darauf achten, zwei verschiedene Dateien zu speichern/laden: Benutzer-Ngrams und Benutzer-Wortwörterbuch.
Die Originaldateien werden nicht geändert und können von verschiedenen Benutzern gemeinsam genutzt werden: das gute Implementierungsmuster.
Sobald Ihr Modell trainiert ist, möchten Sie es möglicherweise speichern:
dynamicNGramDictionary . saveDictionary ( new File ( "fr_user_ngrams.bin" ));
und später erneut laden (und an den WordPredictor-Konstruktor übergeben)
DynamicNGramDictionary dynamicNGramDictionary = DynamicNGramDictionary . load ( new File ( "fr_user_ngrams.bin" ));
Sie können das Wortwörterbuch auch speichern, wenn neue Wörter hinzugefügt wurden:
dictionary . saveUserDictionary ( new File ( "fr_user_words.bin" ));
und später erneut laden (auf einer vorhandenen WordDictionary-Instanz)
dictionary . loadUserDictionary ( new File ( "fr_user_words.bin" ));
Manchmal ist es sinnvoll, das verfügbare Vokabular zu ändern, um Vorhersagen besser an den Benutzer anzupassen.
Dies kann mit WordDictionary erfolgen. Sie können beispielsweise ein Wort deaktivieren:
Word maisonWord = dictionary . getWord ( "maison" );
maisonWord . setForceInvalid ( true , true );
Oder Sie können dem Benutzer alle zum Wörterbuch hinzugefügten benutzerdefinierten Wörter anzeigen:
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 ()));
Wenn Sie Wörter ändern (ursprüngliche oder von Benutzern hinzugefügte Wörter), vergessen Sie nicht, das Benutzerwörterbuch zu speichern: Es speichert Benutzerwörter, aber auch Änderungen an Originalwörtern.
Weitere Informationen finden Sie im Word-Javadoc
Bei der Verwendung predict4all sollten Sie Folgendes beachten:
Um Ihr eigenes Sprachmodell zu trainieren, müssen Sie zunächst Folgendes vorbereiten:
Eine gute CPU ist ebenfalls ein wichtiger Punkt: predict4all verwendet stark Multithread-Algorithmen. Je mehr Kern Sie erhalten, desto schneller wird das Training
Anschließend können Sie die ausführbare JAR-Datei (vorkompilierte Version verfügbar) über eine Befehlszeile ausführen:
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
Dieser Befehl startet ein Training, das es der JVM ermöglicht, 16 GB Speicher zu erhalten und eine Eingabe- und Ausgabekonfiguration anzugeben.
Die generierten Datendateien lauten fr_ngrams.bin und fr_words.bin
Alternativ können Sie LanguageDataModelTrainer in predict4all -model-trainer-cmd überprüfen, um Ihr Training programmgesteuert zu starten.
Bitte teilen Sie uns mit, ob Sie predict4all nutzen!
Fühlen Sie sich frei, ein Problem zu lösen, wenn Sie Hilfe benötigen oder einen Fehler finden.
Diese Software wird unter der Apache-Lizenz 2.0 vertrieben (siehe Datei LIZENZ)
In diesem Projekt wurden verschiedene NLP-Techniken entwickelt (hauptsächlich Ngram-basiert).
predict4all wird mithilfe von Github-Aktionen erstellt, um neue Versionen auf Maven Central zu veröffentlichen
Um eine Version zu erstellen
Referenzdokument zum Veröffentlichen