predict4allは、正確、高速、軽量、多言語対応、無料のオープンソースの次の単語予測ライブラリです。
これは、仮想キーボード、テキスト エディタ、AAC システムなどのアプリケーションに統合して、次に考えられる単語を表示し、ユーザー入力を支援することを目指しています。
predict4all独自性はその修正モデルにあります。修正ルールは一連の修正ルール (一般的または特定: アクセント、文法、スペースの欠落など) のおかげで機能します。この補正モデルにより、文字列距離技術と比較して、予測の早い段階で補正を行うことができます。これにより、既存の修正ツール (GBoard など) と同様の修正を行うこともできますが、ユーザーのエラー (綴り障害、失読症など) に基づいたカスタム ルールで強化することもできます。
predict4all 、CMRRF ケルパペとレイモンド ポアンカレ病院の言語療法士および作業療法士と共同設計され、音声とテキストの書き込みに問題があるユーザーのニーズと要件を確実に満たすように設計されました。発語障害や失読症を持つ人々が犯す一般的な間違いや特定の間違いを特定するために、特に注意が払われました。
現在、 predict4allフランス語をサポートしています (提供されたルールと事前トレーニングされた言語モデル)。
このライブラリは、CMRRF Kerpape、Raymond Poincaré 病院、BdTln チーム、LIFAT、Université de Tours が関与する共同プロジェクトpredict4allで開発されました。
predict4allは、フランス、パリのアヴニール財団の下にあるポール・ベネトー財団、マットムット財団によって支援されています (プロジェクト AP-FPB 16-001 )。
このプロジェクトは、次の AAC ソフトウェアに統合されています: LifeCompanion、Sibille、CiviKey
プロジェクトは現在も AAC4ALL プロジェクトで開発されています。
トレーニングするか (「独自の言語モデルのトレーニング」を参照)、言語モデルをダウンロードします。事前に計算されたフランス語モデルが利用可能です。
フランス語モデルは、Wikipedia と字幕コーパスからの +2,000 万以上の単語に基づいてトレーニングされています。語彙には、約 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 とユーザー単語辞書の 2 つの異なるファイルの保存/読み込みに注意する必要があります。
元のファイルは変更されず、さまざまなユーザー間で共有されます。これは、優れた実装パターンです。
モデルがトレーニングされたら、それを保存することをお勧めします。
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 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 GB のメモリを取得できるようにし、入出力構成を提供します。
生成されるデータ ファイルは、 fr_ngrams.binおよびfr_words.binになります。
あるいは、 predict4all -model-trainer-cmdでLanguageDataModelTrainer をチェックして、プログラムでトレーニングを開始することもできます。
predict4all使用している場合はお知らせください。
サポートが必要な場合、またはバグを見つけた場合は、お気軽に問題を記入してください。
このソフトウェアはApache License 2.0に基づいて配布されます (ファイル LICENCE を参照)
このプロジェクトは、さまざまな NLP 手法 (主に ngram ベース) を開発しました。
predict4all Maven Central で新しいバージョンを公開するために Github アクションを使用して構築されています
バージョンを作成するには
出版に関する参考資料