predict4all เป็น ไลบรารีการทำนายคำถัดไปที่แม่นยำ รวดเร็ว น้ำหนักเบา หลายภาษา ฟรีและเป็นโอเพ่นซอร์ส
โดยมีจุดมุ่งหมายที่จะบูรณาการในแอปพลิเคชันเพื่อแสดงคำถัดไปที่เป็นไปได้ และช่วยเหลือผู้ใช้ในการป้อนข้อมูล: แป้นพิมพ์เสมือน โปรแกรมแก้ไขข้อความ ระบบ AAC...
ความคิดริเริ่ม predict4all อยู่ในโมเดลการแก้ไข : ทำงานได้ด้วยชุดกฎการแก้ไข (ทั่วไปหรือเฉพาะเจาะจง: สำเนียง ไวยากรณ์ การเว้นวรรคที่หายไป ฯลฯ) โมเดลการแก้ไขนี้ช่วยให้การแก้ไขเกิดขึ้นเร็วขึ้นในการทำนาย เมื่อเทียบกับเทคนิคระยะห่างของสตริง นอกจากนี้ยังช่วยให้การแก้ไขมีความคล้ายคลึงกับตัวแก้ไขที่มีอยู่ (เช่น GBoard) แต่ได้รับการปรับปรุงด้วยกฎที่กำหนดเองตามข้อผิดพลาดของผู้ใช้ (dysorthography, dyslexia ฯลฯ)
predict4all ได้รับการออกแบบร่วมกับนักบำบัดการพูดและนักกิจกรรมบำบัดจาก CMRRF Kerpape และ Hopital Raymond Poincaré เพื่อให้แน่ใจว่าตรงกับความต้องการและข้อกำหนดสำหรับผู้ใช้ที่มีปัญหาด้านคำพูดและการเขียนข้อความ มีการให้ความสนใจเป็นพิเศษเพื่อพิจารณาข้อผิดพลาดทั่วไปและข้อผิดพลาดเฉพาะที่เกิดขึ้นจากผู้ที่เป็นโรค dysorthography และ dyslexia
ปัจจุบัน predict4all รองรับภาษาฝรั่งเศส (กฎที่ให้มาและโมเดลภาษาที่ได้รับการฝึกอบรมล่วงหน้า)
ห้องสมุดนี้ได้รับการพัฒนาในโครงการความร่วมมือ predict4all ที่เกี่ยวข้องกับ CMRRF Kerpape, Hopital Raymond Poincaré และทีม BdTln, LIFAT, Université de Tours
predict4all ได้รับการสนับสนุนโดย Fondation Paul Bennetot, Fondation du Groupe Matmut ภายใต้ Fondation de l'Avenir ปารีส ประเทศฝรั่งเศส ( โครงการ AP-FPB 16-001 )
โปรเจ็กต์นี้ได้รับการรวมเข้ากับซอฟต์แวร์ AAC ต่อไปนี้: LifeCompanion, Sibylle, CiviKey
โครงการดังกล่าวยังได้รับการพัฒนาในโครงการ AAC4ALL
ฝึกฝน (ดู "การฝึกโมเดลภาษาของคุณเอง") หรือดาวน์โหลดโมเดลภาษา มีแบบจำลองภาษาฝรั่งเศสที่คำนวณล่วงหน้า:
แบบจำลองภาษาฝรั่งเศสได้รับการฝึกอบรมเกี่ยวกับคำศัพท์มากกว่า 20 ล้านคำจาก Wikipedia และคลังคำบรรยาย คำศัพท์ประกอบด้วยคำศัพท์ที่ไม่ซ้ำกันประมาณ 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)
ในตัวอย่างนี้ คำว่า "gare" จะปรากฏขึ้นหลังจากฝึกโมเดลด้วย "je vais à la gare"
ระวัง การฝึกโมเดลด้วยประโยคที่ผิดจะทำให้ข้อมูลของคุณเสียหาย
เมื่อใช้โมเดลไดนามิก คุณควรดูแลการบันทึก/โหลดไฟล์สองไฟล์ที่แตกต่างกัน ได้แก่ ngrams ของผู้ใช้ และพจนานุกรมคำของผู้ใช้
ไฟล์ต้นฉบับจะไม่ได้รับการแก้ไข เพื่อแชร์กับผู้ใช้ที่แตกต่างกัน: รูปแบบการใช้งานที่ดี
เมื่อโมเดลของคุณได้รับการฝึกฝนแล้ว คุณอาจต้องการบันทึก:
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
หรือคุณสามารถตรวจสอบ LanguageDataModelTrainer ใน predict4all -model-trainer-cmd เพื่อเริ่มการฝึกอบรมของคุณโดยทางโปรแกรม
โปรดแจ้งให้เราทราบหากคุณใช้ predict4all !
อย่าลังเลที่จะกรอกปัญหาหากคุณต้องการความช่วยเหลือหรือพบข้อบกพร่อง
ซอฟต์แวร์นี้เผยแพร่ภายใต้ Apache License 2.0 (ดูไฟล์ใบอนุญาต)
โครงการนี้ได้รับการพัฒนาเทคนิค NLP ต่างๆ (อิงตาม ngram เป็นหลัก)
predict4all สร้างขึ้นโดยใช้การกระทำของ Github เพื่อเผยแพร่เวอร์ชันใหม่บน Maven Central
เพื่อสร้างเวอร์ชัน
เอกสารอ้างอิงเกี่ยวกับการเผยแพร่