predict4all عبارة عن مكتبة دقيقة وسريعة وخفيفة الوزن ومتعددة اللغات ومجانية ومفتوحة المصدر للتنبؤ بالكلمات التالية .
ويهدف إلى أن يكون مدمجًا في التطبيقات لعرض الكلمات التالية المحتملة ومساعدة المستخدم على إدخال: لوحات المفاتيح الافتراضية، ومحررات النصوص، وأنظمة AAC...
تكمن أصالة predict4all في نموذج التصحيح الخاص بها : فهي تعمل بفضل مجموعة من قواعد التصحيح (عامة أو خاصة: علامات التشكيل، القواعد، المساحة المفقودة، إلخ). يسمح نموذج التصحيح هذا بإجراء التصحيح مبكرًا في التنبؤ مقارنة بتقنيات مسافة السلسلة. يسمح هذا أيضًا بأن يكون التصحيح مشابهًا للمصحح الموجود (مثل GBoard) ولكن مع تعزيزه بقاعدة مخصصة تعتمد على أخطاء المستخدم (خلل التنسج، وعسر القراءة، وما إلى ذلك)
تم تصميم predict4all بالاشتراك مع معالجي النطق والمعالجين المهنيين من CMRRF Kerpape وHopital Raymond Poincaré للتأكد من أنه يتوافق مع احتياجات ومتطلبات المستخدم الذي يعاني من مشاكل في الكلام وكتابة النصوص. تم إيلاء اهتمام خاص لتحديد الأخطاء الشائعة والخاصة التي يرتكبها الأشخاص الذين يعانون من خلل التلفظ وعسر القراءة.
حاليًا، يدعم predict4all اللغة الفرنسية (القواعد المقدمة ونموذج اللغة المدرب مسبقًا).
تم تطوير هذه المكتبة في المشروع التعاوني predict4all الذي يضم CMRRF Kerpape وHopital Raymond Poincaré وBdTln Team و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 مليون كلمة من ويكيبيديا ومجموعة الترجمات. تحتوي المفردات على حوالي 112000 كلمة فريدة.
احصل على المكتبة من خلال مدير التبعية المفضل لديك:
مخضرم
< 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".
كن حذرًا ، فتدريب النموذج باستخدام جملة خاطئة سيؤدي إلى إتلاف بياناتك.
عند استخدام نموذج ديناميكي، يجب عليك الاهتمام بحفظ/تحميل ملفين مختلفين: user 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 ، يجب أن تأخذ في الاعتبار ما يلي:
لتدريب نموذج اللغة الخاص بك، ستحتاج أولاً إلى إعداد:
تعد وحدة المعالجة المركزية الجيدة أيضًا نقطة أساسية: يستخدم predict4all بقوة خوارزميات متعددة الخيوط، لذلك كلما حصلت على المزيد من النواة، كلما كان التدريب أسرع
بعد ذلك، يمكنك تشغيل الجرة القابلة للتنفيذ (الإصدار المترجم مسبقًا متاح) باستخدام سطر الأوامر:
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 جيجابايت، وتوفير تكوين الإدخال والإخراج.
ستكون ملفات البيانات التي تم إنشاؤها هي fr_ngrams.bin و fr_words.bin
وبدلاً من ذلك، يمكنك التحقق من LanguageDataModelTrainer في predict4all -model-trainer-cmd لبدء تدريبك برمجيًا.
يرجى إعلامنا إذا كنت تستخدم predict4all !
لا تتردد في ملء مشكلة إذا كنت بحاجة إلى مساعدة أو إذا وجدت خطأ.
يتم توزيع هذا البرنامج بموجب ترخيص Apache 2.0 (راجع ملف الترخيص)
تم تطوير هذا المشروع لتقنيات البرمجة اللغوية العصبية (NLP بشكل أساسي)
تم تصميم predict4all باستخدام إجراءات Github لنشر إصدارات جديدة على Maven Central
لإنشاء نسخة
وثيقة مرجعية بشأن النشر