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 上發布新版本
建立版本
出版參考文件