predict4all是一个准确、快速、轻量级、多语言、免费且开源的下一个单词预测库。
它的目标是集成到应用程序中以显示可能的下一个单词并帮助用户输入:虚拟键盘、文本编辑器、AAC 系统......
predict4all独创性在于其校正模型:它的工作原理归功于一组校正规则(一般或特定:重音、语法、缺失空格等)。与弦距离技术相比,该校正模型允许在预测中更早地进行校正。这也允许校正类似于现有的校正器(例如 GBoard),但可以通过基于用户错误(拼写障碍、阅读障碍等)的自定义规则进行增强
predict4all是与 CMRRF Kerpape 和 Hospital Raymond Poincaré 的言语治疗师和职业治疗师共同设计的,以确保它满足有言语和文本书写困难的用户的需求和要求。特别注意确定患有拼写障碍和阅读障碍的人所犯的常见和特殊错误。
目前, predict4all支持法语(提供规则和预训练语言模型)。
该库是在与 CMRRF Kerpape、Hopital Raymond Poincaré 和 BdTln 团队、LIFAT、图尔大学合作的predict4all合作项目中开发的
predict4all得到了法国巴黎 Fondation de l'Avenir 基金会下的 Fondation Paul Bennetot 和 Fondation du Groupe Matmut 的支持(项目 AP-FPB 16-001 )
该项目已集成到以下 AAC 软件中:LifeCompanion、Sibylle、CiviKey
该项目仍在AAC4ALL项目中开发。
训练(请参阅“训练您自己的语言模型”)或下载语言模型。可以使用预先计算的法语模型:
法语语言模型已根据维基百科和字幕语料库中超过 2000 万个单词进行了训练。词汇表包含约 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,您可以探索 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 );
}
结果(法语模型)
é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)
在此示例中,在使用“je vais à la gare”训练模型后出现“gare”一词。
请小心,用错误的句子训练模型会损坏您的数据。
使用动态模型时,您应该注意保存/加载两个不同的文件:用户 ngram 和用户单词词典。
原始文件不会被修改,可以在不同用户之间共享:良好的实现模式。
模型训练完成后,您可能需要保存它:
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时,您应该注意:
要训练自己的语言模型,您首先需要准备:
一个好的CPU也是一个关键点: 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 获得 16GB 内存,并给出输入和输出配置。
生成的数据文件将是fr_ngrams.bin和fr_words.bin
或者,您可以检查predict4all -model-trainer-cmd中的LanguageDataModelTrainer以编程方式启动训练。
如果您使用predict4all请告诉我们!
如果您需要帮助或发现错误,请随时填写问题。
该软件根据Apache License 2.0分发(请参阅文件 LICENCE)
该项目开发了各种 NLP 技术(主要基于 ngram)
predict4all是使用 Github actions 构建的,在 Maven Central 上发布新版本
创建版本
出版参考文件