predict4all 은 정확하고 빠르며 가벼운 다국어 무료 오픈 소스 다음 단어 예측 라이브러리 입니다.
가상 키보드, 텍스트 편집기, AAC 시스템 등 가능한 다음 단어를 표시하고 사용자 입력을 돕기 위해 애플리케이션에 통합되는 것을 목표로 합니다.
predict4all 독창성은 수정 모델에 있습니다 . 이는 일련의 수정 규칙(일반 또는 특정: 악센트, 문법, 누락된 공백 등) 덕분에 작동합니다. 이 수정 모델을 사용하면 스트링 거리 기술에 비해 예측 초기에 수정이 발생할 수 있습니다. 이를 통해 교정이 기존 교정기(예: GBoard)와 유사하지만 사용자 오류(조음 장애, 난독증 등)를 기반으로 하는 사용자 정의 규칙으로 향상될 수도 있습니다.
predict4all CMRRF Kerpape 및 Hopital Raymond Poincaré의 언어 치료사 및 작업 치료사와 공동 설계하여 음성 및 텍스트 쓰기 문제가 있는 사용자의 요구 사항과 요구 사항을 일치시킵니다. 난독증과 난독증이 있는 사람들이 범하는 일반적이고 특정한 실수를 파악하기 위해 특별한 주의를 기울였습니다.
현재 predict4all 프랑스어를 지원합니다(제공된 규칙 및 사전 훈련된 언어 모델).
이 라이브러리는 CMRRF Kerpape, Hopital Raymond Poincaré 및 BdTln Team, LIFAT, Université de Tours가 참여하는 공동 프로젝트인 predict4all 에서 개발되었습니다.
predict4all 프랑스 파리의 Fondation de l'Avenir 산하 Fondation du Groupe Matmut, Fondation Paul Bennetot의 지원을 받습니다( 프로젝트 AP-FPB 16-001 ).
이 프로젝트는 다음 AAC 소프트웨어에 통합되었습니다: LifeCompanion, Sibylle, CiviKey
이 프로젝트는 여전히 AAC4ALL 프로젝트에서 개발되고 있습니다.
언어 모델을 훈련시키거나("자신의 언어 모델 훈련하기" 참조) 다운로드하십시오. 미리 계산된 프랑스어 모델을 사용할 수 있습니다.
프랑스어 모델은 Wikipedia 및 자막 코퍼스의 2천만 개 이상의 단어에 대해 훈련되었습니다. 어휘에는 ~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 Maven Central에 새 버전을 게시하기 위해 Github 작업을 사용하여 구축되었습니다.
버전을 생성하려면
출판 참고문서