بالنظر إلى الوزن = [0.25 ، 0.25 ، 0.25 ، 0.25] (القيمة الافتراضية) ،
جملة_bleu ([['a'، 'b'، 'c']]، ['a'، 'b'، 'c']) = 0
بينما جمل_bleu ([['a'، 'b'، 'c']]، ['a'، 'b'، 'd']) = 0.7598
من الواضح أن النتيجة السابقة يجب أن تكون أكبر من الأخيرة ، أو يجب أن تكون كلتا الدرجتين 0
ما هو إصدار الكود الذي تستخدمه؟
$ python
>>> import nltk
>>> nltk.__version__
'3.2.1'
تم إصلاح تطبيق BLEU مؤخرًا مع حل # 1330. إذا كنت تستخدم الفرع develop
لـ nltk
، فيجب أن يكون هذا هو الناتج:
>>> import nltk
>>> from nltk import bleu
>>> ref = hyp = 'abc'
>>> bleu([ref], hyp)
1.0
>>> from nltk import bleu
>>> ref, hyp = 'abc', 'abd'
>>> bleu([ref], hyp)
0.7598356856515925
نظرًا لأن السلسلة عبارة عن قائمة من الأحرف و nltk
تستورد sentence_bleu()
إلى عمليات الاستيراد ذات المستوى الأعلى ، فإن الكود أعلاه هو نفسه:
>>> from nltk.translate.bleu_score import sentence_bleu
>>> sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'c'])
1.0
>>> sentence_bleu([['a', 'b', 'c']], ['a', 'b', 'd'])
0.7598356856515925
لتثبيت أحدث فرع develop
، جرب:
pip install https://github.com/nltk/nltk/archive/develop.zip
( لاحظ أن فرع التطوير يتعرض _أخطاء أكثر غير متوقعة_ ويوصى بأن يقوم المستخدمون بتثبيت master
أو الإصدار الرسمي )
في ملاحظة ذات صلة ولكن لا تشارك بشكل مباشر في التنفيذ الحالي لـ nltk
لـ bleu
، فإن التطبيق السابق بدون الإصلاح # 1330 يخضع لنفس عيوب multi-bleu.perl
. ربما تجد أنه من المثير للاهتمام معرفة سبب إرجاعه للصفر بدون الإصلاح الأخير: https://gist.github.com/alvations/e5922afa8c91472d25c58b2d712a93e7
شكرا alvations . الإصدار الأصلي من nltk الذي استخدمته كان 3.2. لقد قمت بتحديثه إلى 3.2.1 الآن وهو الآن يرفع ZeroDivisionError. واستخدمت Python 3.5.2
الإصدار الثابت الوحيد من BLEU موجود في الفرع develop
. يرجى الانتظار حتى يتم إصداره في NLTK 3.2.2 أو تثبيت فرع develop
(لكن لاحظ أن فرع التطوير قد يتعرض لأخطاء لم يتم اختبارها).
موافق. سأنتظر. ولكن في الحالة التي ذكرتها أعلاه ، إذا كان الوزن هو [0.25 ، 0.25 ، 0.25 ، 0.25] ، فإن نتائج الجمل_بليليو ([['a'، 'b'، 'c']]، ['a'، 'b يجب أن يكون كل من '،' c ']) وكسلي_بليو ([[' a '،' b '،' c ']]، [' a '،' b '،' d ']) صفرًا ، وفقًا للورقة الأصلية
لم تأخذ الورقة الأصلية في الحسبان حقيقة أن p_n
يمكن أن يكون 0 إذا كان طول المرجع / الفرضية أقل من n
، راجع المعادلة في القسم 2.3 من http: //www.aclweb .org / مختارات / P02-1040.pdf. نظرًا لأنه كان من المفترض أن يكون مجموع نقاط ، فإن احتمال وجود مراجع / فرضيات أقل من طول n
لم يتم تناولها في الورقة.
إذا نظرنا إلى الصيغة في القسم 2.3 ، فإنها تأخذ exp(log(p_n))
وعندما يكون p_n
0 ، فإنها تدخل في خطأ في مجال الرياضيات لأن دالة اللوغاريتم (أي y = log x
) خط مقارب عند x = 0 ، بحيث يجب أن يكون مدى x أكبر من 0.
لذا ، إذا أردنا تنفيذ BLEU الأصلي ، يجب أن يتلقى المستخدم تحذيرًا يقول شيئًا مثل "لا يمكن حساب BLEU" كلما كان هناك خطأ في المجال الرياضي. لذلك تحاول الإصدارات الأحدث من BLEU إصلاحها بالعديد من الاختراقات المختلفة ، ويمكن العثور على محفوظات الإصدارات على https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/mteval-v13a. رر # L17
يرجى ملاحظة أن الإصدار الأخير من BLEU يأتي مع وظائف التنعيم من ورق Chen and Cherry (2014) ليس في إصدار Moses من mteval.pl
.
آمل أن يساعد الشرح.
التعليق الأكثر فائدة
لم تأخذ الورقة الأصلية في الحسبان حقيقة أن
p_n
يمكن أن يكون 0 إذا كان طول المرجع / الفرضية أقل منn
، راجع المعادلة في القسم 2.3 من http: //www.aclweb .org / مختارات / P02-1040.pdf. نظرًا لأنه كان من المفترض أن يكون مجموع نقاط ، فإن احتمال وجود مراجع / فرضيات أقل من طولn
لم يتم تناولها في الورقة.إذا نظرنا إلى الصيغة في القسم 2.3 ، فإنها تأخذ
exp(log(p_n))
وعندما يكونp_n
0 ، فإنها تدخل في خطأ في مجال الرياضيات لأن دالة اللوغاريتم (أيy = log x
) خط مقارب عند x = 0 ، بحيث يجب أن يكون مدى x أكبر من 0.لذا ، إذا أردنا تنفيذ BLEU الأصلي ، يجب أن يتلقى المستخدم تحذيرًا يقول شيئًا مثل "لا يمكن حساب BLEU" كلما كان هناك خطأ في المجال الرياضي. لذلك تحاول الإصدارات الأحدث من BLEU إصلاحها بالعديد من الاختراقات المختلفة ، ويمكن العثور على محفوظات الإصدارات على https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/mteval-v13a. رر # L17
يرجى ملاحظة أن الإصدار الأخير من BLEU يأتي مع وظائف التنعيم من ورق Chen and Cherry (2014) ليس في إصدار Moses من
mteval.pl
.آمل أن يساعد الشرح.