predict4all é uma biblioteca de previsão de próxima palavra precisa, rápida, leve, multilíngue, gratuita e de código aberto .
Pretende ser integrado em aplicações para exibir possíveis próximas palavras e ajudar na entrada do usuário: teclados virtuais, editores de texto, sistemas AAC...
A originalidade predict4all está no seu modelo de correção : funciona graças a um conjunto de regras de correção (gerais ou específicas: acentos, gramática, falta de espaço, etc). Este modelo de correção permite que a correção aconteça mais cedo na previsão em comparação com as técnicas de distância das cordas. Isto também permite que a correção seja semelhante ao corretor existente (por exemplo, GBoard), mas seja aprimorada com regras personalizadas baseadas em erros do usuário (disortografia, dislexia, etc.)
predict4all foi co-projetado com fonoaudiólogos e terapeutas ocupacionais do CMRRF Kerpape e Hopital Raymond Poincaré para garantir que atenda às necessidades e requisitos do usuário com problemas de fala e escrita de texto. Foi dada especial atenção à determinação de erros comuns e particulares cometidos por pessoas com disortografia e dislexia.
Atualmente, predict4all oferece suporte ao idioma francês (regras fornecidas e modelo de idioma pré-treinado).
Esta biblioteca foi desenvolvida no projeto colaborativo predict4all envolvendo CMRRF Kerpape, Hopital Raymond Poincaré e BdTln Team, LIFAT, Université de Tours
predict4all é apoiado pela Fondation Paul Bennetot, Fondation du Groupe Matmut sob Fondation de l'Avenir, Paris, França ( projeto AP-FPB 16-001 )
Este projeto foi integrado nos seguintes softwares AAC: LifeCompanion, Sibylle, CiviKey
O projeto ainda é desenvolvido no projeto AAC4ALL.
Treine (consulte "Treinando seu próprio modelo de linguagem") ou baixe um modelo de linguagem. O modelo pré-computado em francês está disponível:
O modelo da língua francesa foi treinado em mais de 20 milhões de palavras da Wikipedia e corpus de legendas. O vocabulário contém aproximadamente 112.000 palavras únicas.
Obtenha a biblioteca através do seu gerenciador de dependências favorito:
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'
Nos exemplos a seguir, presumimos que você inicializou o modelo de linguagem, o preditor, etc.
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
}
Você pode encontrar o código funcional completo para esses exemplos e outros mais complexos em predict4all -example
Por favor, leia o Javadoc (as classes públicas estão bem documentadas)
WordPredictionResult predictionResult = wordPredictor . predict ( "j'aime manger des " );
for ( WordPrediction prediction : predictionResult . getPredictions ()) {
System . out . println ( prediction );
}
Resultado (modelo em francês)
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 );
}
Resultado (modelo em francês)
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)
Para ajustar o WordPredictor, você pode explorar 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 );
}
Resultado (modelo em francês)
é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)
Neste exemplo, remover torna-se positivo porque a primeira letra da palavra está incorreta: o texto digitado anteriormente deve ser removido antes de inserir.
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 );
}
Resultado (modelo em francês)
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)
Neste exemplo, a palavra “gare” aparece após treinar o modelo com “je vais à la gare”.
Tenha cuidado , treinar um modelo com frase errada corromperá seus dados.
Ao usar um modelo dinâmico, você deve ter o cuidado de salvar/carregar dois arquivos diferentes: ngrams do usuário e dicionário de palavras do usuário.
Os arquivos originais não serão modificados, para serem compartilhados entre diferentes usuários: o bom padrão de implementação.
Depois que seu modelo estiver treinado, você pode salvá-lo:
dynamicNGramDictionary . saveDictionary ( new File ( "fr_user_ngrams.bin" ));
e depois carregue-o novamente (e passe-o para o construtor WordPredictor)
DynamicNGramDictionary dynamicNGramDictionary = DynamicNGramDictionary . load ( new File ( "fr_user_ngrams.bin" ));
Você também pode salvar o dicionário de palavras se novas palavras forem adicionadas:
dictionary . saveUserDictionary ( new File ( "fr_user_words.bin" ));
e depois carregue-o novamente (em uma instância existente do WordDictionary)
dictionary . loadUserDictionary ( new File ( "fr_user_words.bin" ));
Às vezes é útil modificar o vocabulário disponível para melhor adaptar as previsões ao usuário.
Isso pode ser feito trabalhando com WordDictionary, por exemplo, você pode desabilitar uma palavra:
Word maisonWord = dictionary . getWord ( "maison" );
maisonWord . setForceInvalid ( true , true );
Ou você pode mostrar ao usuário todas as palavras personalizadas adicionadas ao dicionário:
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 ()));
Ao modificar palavras (originais ou adicionadas pelos usuários), não se esqueça de salvar o dicionário do usuário: ele salvará as palavras do usuário, mas também as modificações das palavras originais.
Você pode encontrar mais informações no Word javadoc
Ao usar predict4all , você deve observar que:
Para treinar seu próprio modelo de linguagem, primeiro você precisa se preparar:
Uma boa CPU também é um ponto chave: predict4all usa fortemente algoritmos multithreaded, então quanto mais núcleo você obtiver, mais rápido será o treinamento
Então, você pode executar o jar executável (versão pré-compilada disponível) com uma linha de comando:
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
Este comando iniciará um treinamento, permitindo que a JVM obtenha 16GB de memória, e dando uma configuração de entrada e saída.
Os arquivos de dados gerados serão fr_ngrams.bin e fr_words.bin
Alternativamente, você pode verificar LanguageDataModelTrainer em predict4all -model-trainer-cmd para iniciar seu treinamento programaticamente.
Por favor, deixe-nos saber se você usa predict4all !
Sinta-se à vontade para preencher um problema se precisar de ajuda ou se encontrar um bug.
Este software é distribuído sob a Licença Apache 2.0 (ver arquivo LICENCE)
Este projeto desenvolveu várias técnicas de PNL (principalmente baseadas em ngram)
predict4all é construído usando ações do Github para publicar novas versões no Maven Central
Para criar uma versão
Documento de referência sobre publicação