predict4all — это точная, быстрая, легкая, многоязычная, бесплатная библиотека предсказания следующего слова с открытым исходным кодом .
Его цель — интегрировать в приложения для отображения возможных следующих слов и облегчения пользовательского ввода: виртуальные клавиатуры, текстовые редакторы, системы AAC...
Оригинальность predict4all заключается в его модели коррекции : она работает благодаря набору правил коррекции (общих или конкретных: акценты, грамматика, недостающее пространство и т. д.). Эта модель коррекции позволяет проводить коррекцию на более раннем этапе прогнозирования по сравнению с методами определения расстояния между строками. Это также позволяет сделать коррекцию аналогичной существующему корректору (например, GBoard), но дополнить ее специальными правилами, основанными на ошибках пользователя (дисортография, дислексия и т. д.).
predict4all был разработан совместно с логопедами и эрготерапевтами из CMRRF Kerpape и Hopital Raymond Poincaré, чтобы гарантировать, что он соответствует потребностям и требованиям пользователей с проблемами речи и письма. Особое внимание было уделено выявлению типичных и частных ошибок, допускаемых людьми с дизорфографией и дислексией.
В настоящее время predict4all поддерживает французский язык (предоставляются правила и предварительно обученная языковая модель).
Эта библиотека была разработана в рамках совместного проекта predict4all с участием CMRRF Kerpape, Hopital Raymond Poincaré и BdTln Team, LIFAT, Université de Tours.
predict4all поддерживается Fondation Paul Bennetot, Fondation du Groupe Matmut при Fondation de l'Avenir, Париж, Франция ( проект AP-FPB 16-001 ).
Этот проект был интегрирован в следующее программное обеспечение AAC: LifeCompanion, Sibylle, CiviKey.
Проект все еще разрабатывается в рамках проекта AAC4ALL.
Тренируйтесь (см. «Тренировка собственной языковой модели») или скачайте языковую модель. Доступна предварительно рассчитанная модель французского языка:
Модель французского языка была обучена на более чем 20 миллионах слов из Википедии и корпуса субтитров. Словарь содержит ~112 000 уникальных слов.
Получите библиотеку через ваш любимый менеджер зависимостей:
Мавен
< dependency >
< groupId >io.github.mthebaud</ groupId >
< artifactId > predict4all </ artifactId >
< version >1.2.0</ version >
</ dependency >
Градл
implementation 'io.github.mthebaud: predict4all :1.2.0'
В следующих примерах мы предполагаем, что вы инициализировали языковую модель, предиктор и т. д.
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
}
Вы можете найти полный рабочий код для этих и более сложных примеров в predict4all -example.
Пожалуйста, прочитайте Javadoc (публичные классы хорошо документированы)
WordPredictionResult predictionResult = wordPredictor . predict ( "j'aime manger des " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Результат (модель французского языка)
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 );
}
Результат (модель французского языка)
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)
Чтобы настроить WordPredictor, вы можете изучить 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 );
}
Результат (модель французского языка)
é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)
В этом примере удаление становится положительным, поскольку первая буква в слове неверна: предыдущий набранный текст должен быть удален перед вставкой.
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 );
}
Результат (модель французского языка)
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)
В этом примере слово «gare» появляется после обучения модели с помощью «je vais à la gare».
Будьте осторожны : обучение модели с неправильным предложением приведет к повреждению ваших данных.
При использовании динамической модели вам следует позаботиться о сохранении/загрузке двух разных файлов: пользовательских ngrams и словаря пользовательских слов.
Исходные файлы не будут изменены и будут доступны другим пользователям: хороший шаблон реализации.
Как только ваша модель будет обучена, вы можете сохранить ее:
dynamicNGramDictionary . saveDictionary ( new File ( "fr_user_ngrams.bin" ));
а затем снова загрузите его (и передайте конструктору WordPredictor)
DynamicNGramDictionary dynamicNGramDictionary = DynamicNGramDictionary . load ( new File ( "fr_user_ngrams.bin" ));
Вы также можете сохранить словарь слов, если были добавлены новые слова:
dictionary . saveUserDictionary ( new File ( "fr_user_words.bin" ));
а затем загрузите его снова (в существующем экземпляре WordDictionary)
dictionary . loadUserDictionary ( new File ( "fr_user_words.bin" ));
Иногда полезно изменить доступный словарь, чтобы лучше адаптировать прогнозы к пользователю.
Это можно сделать работая с WordDictionary, например, можно отключить слово:
Word maisonWord = dictionary . getWord ( "maison" );
maisonWord . setForceInvalid ( true , true );
Или вы можете показать пользователю все слова, добавленные в словарь:
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 ()));
Когда вы изменяете слова (исходные или добавленные пользователями), не забудьте сохранить пользовательский словарь: он сохранит не только пользовательские слова, но и исходные модификации слов.
Дополнительную информацию можно найти в Word javadoc.
При использовании predict4all вы должны принять во внимание, что:
Чтобы обучить собственную языковую модель, вам сначала необходимо подготовить:
Хороший процессор также является ключевым моментом: predict4all активно использует многопоточные алгоритмы, поэтому чем больше ядер вы получите, тем быстрее будет обучение.
Затем вы можете запустить исполняемый файл jar (доступна предварительно скомпилированная версия) с помощью командной строки:
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
Эта команда запустит обучение, позволяющее JVM получить 16 ГБ памяти и предоставляющее конфигурацию ввода и вывода.
Сгенерированные файлы данных будут fr_ngrams.bin и fr_words.bin.
Кроме того, вы можете проверить LanguageDataModelTrainer в predict4all -model-trainer-cmd, чтобы запустить обучение программно.
Пожалуйста, дайте нам знать, если вы используете predict4all !
Не стесняйтесь задавать вопросы, если вам нужна помощь или если вы обнаружили ошибку.
Это программное обеспечение распространяется по лицензии Apache 2.0 (см. файл ЛИЦЕНЗИЯ).
В этом проекте были разработаны различные техники НЛП (в основном на основе нграмм).
predict4all создан с использованием действий Github для публикации новых версий на Maven Central.
Чтобы создать версию
Справочный документ по издательскому делу