محلل عالية الدقة مع نماذج لـ 11 لغة ، يتم تنفيذها في بيثون. استنادًا إلى التحليل الدوري مع تشفير محامي ذاتي من ACL 2018 ، مع تغييرات إضافية موصوفة في تحليل الدوائر الانتخابية متعددة اللغات مع الاهتمام الذاتي والتدريب.
نيو فبراير 2021: الإصدار 0.2.0 من محلل بيركلي العصبي قد خرج الآن ، مع نماذج عالية الجودة مسبقًا لجميع اللغات. يستخدم الاستدلال الآن Pytorch بدلاً من TensorFlow (كان التدريب دائمًا Pytorch فقط). قطرات الدعم لبيثون 2.7 و 3.5. يتضمن الدعم المحدث للتدريب واستخدام المحللين الخاص بك ، استنادًا إلى اختيارك للنموذج الذي تم تدريبه مسبقًا.
إذا كنت مهتمًا في المقام الأول بتدريب نماذج التحليل الخاصة بك ، فانتقل إلى قسم التدريب في هذا ReadMe.
لتثبيت المحلل ، قم بتشغيل الأمر:
$ pip install beneparملاحظة: تعتبر Benepar 0.2.0 ترقية رئيسية على الإصدار السابق ، وتأتي مع نماذج محلل جديدة تمامًا وعالية الجودة. إذا لم تكن مستعدًا للترقية ، فيمكنك تثبيت إصدار Benepar الخاص بك إلى الإصدار السابق (0.1.3).
مطلوب Python 3.6 (أو الأحدث) و Pytorch 1.6 (أو الأحدث). راجع موقع Pytorch على الويب للحصول على تعليمات حول كيفية الاختيار بين إصدارات GPU و CPU فقط من Pytorch ؛ سيستخدم Benepar تلقائيًا وحدة معالجة الرسومات إذا كان متاحًا لـ Pytorch.
الطريقة الموصى بها لاستخدام Benepar هي من خلال التكامل مع Spacy. إذا كنت تستخدم Spacy ، فيجب عليك تثبيت نموذج Spacy للغة الخاصة بك. للغة الإنجليزية ، أمر التثبيت هو:
$ python -m spacy download en_core_web_mdيتم استخدام نموذج Spacy فقط للتجزئة الرمزية وتقسيم الجملة. إذا لم يكن التحليل الخاص باللغة خارج التحليل مطلوبًا ، فيمكنك أيضًا التخلي عن نموذج خاص باللغة وبدلاً من ذلك استخدام نموذج متعدد اللغات لا يؤدي إلا إلى الرمز المميز والتجزئة. أحد هذه النماذج ، التي تمت إضافتها حديثًا في Spacy 3.0 ، يجب أن تعمل مع اللغة الإنجليزية والألمانية والكورية والبولندية والسويدية (ولكن ليس الصينية ، لأنه لا يبدو أنه يدعم تجزئة الكلمات الصينية).
يجب تنزيل نماذج التحليل بشكل منفصل ، باستخدام الأوامر:
>> > import benepar
>> > benepar . download ( 'benepar_en3' )راجع قسم النماذج المتاح أدناه للحصول على قائمة كاملة من النماذج.
الطريقة الموصى بها لاستخدام Benepar هي من خلال تكاملها مع Spacy:
>> > import benepar , spacy
>> > nlp = spacy . load ( 'en_core_web_md' )
>> > if spacy . __version__ . startswith ( '2' ):
nlp . add_pipe ( benepar . BeneparComponent ( "benepar_en3" ))
else :
nlp . add_pipe ( "benepar" , config = { "model" : "benepar_en3" })
>> > doc = nlp ( "The time for action is now. It's never too late to do something." )
>> > sent = list ( doc . sents )[ 0 ]
>> > print ( sent . _ . parse_string )
( S ( NP ( NP ( DT The ) ( NN time )) ( PP ( IN for ) ( NP ( NN action )))) ( VP ( VBZ is ) ( ADVP ( RB now ))) (. .))
>> > sent . _ . labels
( 'S' ,)
>> > list ( sent . _ . children )[ 0 ]
The time for action نظرًا لأن Spacy لا يوفر واجهة برمجة تطبيقات دائرة انتخابية رسمية ، يمكن الوصول إلى جميع الطرق من خلال مساحات أسماء التمديد Span._ و Token._ .
خصائص الامتداد التالية متوفرة:
Span._.labels : tuple من الملصقات للمدى المحدد. قد يكون للسبان ملصقات متعددة عندما تكون هناك سلاسل أحادية في شجرة التحليل.Span._.parse_string : تمثيل سلسلة لشجرة التحليل لفترة معينة.Span._.constituents : تكرار على كائنات Span للناشئين الفرعية في اجتياز المسبق لشجرة التحليل.Span._.parent : الوالد Span في شجرة التحليل.Span Span._.childrenToken._.labels ، Token._.parse_string ، Token._.parent ستثير هذه الطرق استثناءًا عند استدعاء فترة ليست مكونة في شجرة التحليل. يمكن تجنب مثل هذه الأخطاء عن طريق اجتياز شجرة التحليل بدءًا من مستوى الجملة (عن طريق التكرار على doc.sents ) أو مع كائن Token فردي.
هناك أيضًا واجهة NLTK ، والتي تم تصميمها للاستخدام مع مجموعات البيانات المعلنة مسبقًا ومنضدات الأشجار ، أو عند دمج المحلل في خط أنابيب NLP الذي يؤدي بالفعل (على الأقل) رمز الرمز المميز وتقسيم الجملة. من أجل التحليل بدءًا من النص الخام ، يتم تشجيعك بشدة على استخدام Spacy و benepar.BeneparComponent بدلاً من ذلك.
استخدام عينة مع NLTK:
>> > import benepar
>> > parser = benepar . Parser ( "benepar_en3" )
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
space_after = [ False , True , False , False , False ],
tags = [ '``' , 'VB' , 'RB' , '.' , "''" ],
escaped_words = [ '``' , 'Fly' , 'safely' , '.' , "''" ],
)
>> > tree = parser . parse ( input_sentence )
>> > print ( tree )
( TOP ( S ( `` `` ) ( VP ( VB Fly ) ( ADVP ( RB safely ))) (. .) ( '' '' ))) ليس كل مجالات benepar.InputSentence مطلوبة ، ولكن يجب تحديد واحدة على الأقل من words escaped_words . سيحاول المحللون تخمين قيمة الحقول المفقودة ، على سبيل المثال:
>> > input_sentence = benepar . InputSentence (
words = [ '"' , 'Fly' , 'safely' , '.' , '"' ],
)
>> > parser . parse ( input_sentence ) استخدم parse_sents لتحليل جمل متعددة.
>> > input_sentence1 = benepar . InputSentence (
words = [ 'The' , 'time' , 'for' , 'action' , 'is' , 'now' , '.' ],
)
>> > input_sentence2 = benepar . InputSentence (
words = [ 'It' , "'s" , 'never' , 'too' , 'late' , 'to' , 'do' , 'something' , '.' ],
)
>> > parser . parse_sents ([ input_sentence1 , input_sentence2 ])تتيح بعض نماذج المحلل أيضًا إدخال نص Unicode للاستخدام/الاستخدام التفاعلي ، ولكن تم إحباط تمرير سلاسل النص الخام بشدة لأي تطبيق يهم الدقة.
>> > parser . parse ( '"Fly safely."' ) # For debugging/interactive use only. عند التحليل من النص الخام ، نوصي باستخدام spacy و benepar.BeneparComponent بدلاً من ذلك. والسبب هو أن نماذج المحللون لا تشحن مع رمز الرمز أو الجملة الخائن ، وقد لا تتضمن بعض النماذج tagger جزء من الكلام أيضًا. يجب استخدام مجموعة الأدوات لملء مكونات خطوط الأنابيب هذه ، وتفوق Spacy على NLTK في جميع هذه المناطق (أحيانًا بهامش كبير).
تتوفر نماذج المحللين المدربين التالية. لاستخدام تكامل Spacy ، ستحتاج أيضًا إلى تثبيت نموذج Spacy للغة المناسبة.
| نموذج | لغة | معلومات |
|---|---|---|
benepar_en3 | إنجليزي | 95.40 F1 على مجموعة اختبار WSJ المنقحة. تستخدم بيانات التدريب الرمز المميز المنقح والشرح النحوي استنادًا إلى نفس الإرشادات التي يتمتع بها English Web TreeBank و Ontonotes ، والتي تتوافق بشكل أفضل مع ممارسات الرمز المميز الحديث في مكتبات مثل Spacy. بناء على t5-small. |
benepar_en3_large | إنجليزي | 96.29 F1 على مجموعة اختبار WSJ المنقحة. تستخدم بيانات التدريب الرمز المميز المنقح والشرح النحوي استنادًا إلى نفس الإرشادات التي يتمتع بها English Web TreeBank و Ontonotes ، والتي تتناسب بشكل أفضل مع ممارسات الرمز المميز الحديثة في مكتبات مثل Spacy. بناء على T5-large. |
benepar_zh2 | الصينية | 92.56 F1 على مجموعة الاختبار CTB 5.1. يسمح الاستخدام مع Spacy بدعم التحليل من النص الخام ، لكن API NLTK يدعم فقط تحليل الجمل المميزة سابقًا. بناءً على Electra-180g-large الصينية. |
benepar_ar2 | عربي | 90.52 F1 على مجموعة الاختبار SPMRL2013/2014. يدعم فقط باستخدام API NLTK لتحليل الجمل المميزة سابقًا. التحليل من النص الخام وتكامل Spacy غير مدعوم. بناء على XLM-R. |
benepar_de2 | الألمانية | 92.10 F1 على مجموعة الاختبار SPMRL2013/2014. بناء على XLM-R. |
benepar_eu2 | الباسك | 93.36 F1 على مجموعة الاختبار SPMRL2013/2014. يتطلب الاستخدام مع Spacy أولاً تنفيذ دعم الباسك في Spacy. بناء على XLM-R. |
benepar_fr2 | فرنسي | 88.43 F1 على مجموعة الاختبار SPMRL2013/2014. بناء على XLM-R. |
benepar_he2 | العبرية | 93.98 F1 على مجموعة الاختبار SPMRL2013/2014. يدعم فقط باستخدام API NLTK لتحليل الجمل المميزة سابقًا. التحليل من النص الخام وتكامل Spacy غير مدعوم. بناء على XLM-R. |
benepar_hu2 | المجري | 96.19 F1 على مجموعة الاختبار SPMRL2013/2014. يتطلب الاستخدام مع Spacy نموذجًا مجريًا لـ Spacy. يدعم API NLTK فقط تحليل الجمل المميزة سابقًا. بناء على XLM-R. |
benepar_ko2 | كوري | 91.72 F1 على مجموعة الاختبار SPMRL2013/2014. يمكن استخدامها مع نموذج تجزئة الجملة متعدد اللغات من Spacy (يتطلب Spacy V3.0). يدعم API NLTK فقط تحليل الجمل المميزة سابقًا. بناء على XLM-R. |
benepar_pl2 | بولندي | 97.15 F1 على مجموعة الاختبار SPMRL2013/2014. بناء على XLM-R. |
benepar_sv2 | السويدية | 92.21 F1 على مجموعة الاختبار SPMRL2013/2014. يمكن استخدامها مع نموذج تجزئة الجملة متعدد اللغات من Spacy (يتطلب Spacy V3.0). بناء على XLM-R. |
benepar_en3_wsj | إنجليزي | النظر في استخدام benepar_en3 أو benepar_en3_large بدلاً من ذلك . 95.55 F1 على مجموعة اختبار WSJ الكنسي المستخدمة لعقود من منشورات تحليل الدائرة الإنجليزية. استنادا إلى Bert-Large-uncared. نحن نعتقد أن إرشادات التعليقات التوضيحية المنقحة المستخدمة في تدريب benepar_en3 / benepar_en3_large أكثر ملاءمة للاستخدام في اتجاه مجرى النهر لأنها تتعامل بشكل أفضل مع استخدام اللغة في نص الويب ، وأكثر اتساقًا مع الممارسات الحديثة في تحليل التبعية والمكتبات مثل Spacy. ومع ذلك ، فإننا نقدم نموذج benepar_en3_wsj للحالات التي لا يكون فيها استخدام اتفاقيات banbanking المنقحة مناسبة ، مثل قياس النماذج المختلفة على نفس مجموعة البيانات. |
يتطلب التدريب استنساخ هذا المستودع من جيثب. بينما يتم توزيع رمز النموذج في src/benepar في حزمة benepar على PYPI ، فإن البرامج النصية للتدريب والتقييم مباشرة تحت src/ ليست كذلك.
benepar ، بما في ذلك: NLTK 3.2 ، torch-tructure 0.4 ، Transformers 4.3.0 ، أو متوافق.make داخل EVALB/ Directory لتجميع evalb قابلة للتنفيذ. سيتم استدعاء هذا من بيثون للتقييم. إذا كان التدريب على مجموعات بيانات SPMRL ، فستحتاج إلى make داخل EVALB_SPMRL/ directory بدلاً من ذلك. يمكن تدريب نموذج جديد باستخدام Command python src/main.py train ... بعض الحجج المتاحة هي:
| دعوى | وصف | تقصير |
|---|---|---|
--model-path-base | قاعدة المسار لاستخدامها لتوفير النماذج | ن/أ |
--evalb-dir | مسار إلى دليل التقييم | EVALB/ |
--train-path | طريق لتدريب الأشجار | data/wsj/train_02-21.LDC99T42 |
--train-path-text | الرمز المميز الاختياري لبيانات التدريب | تخمين النص الخام. انظر --text-processing |
--dev-path | طريق إلى أشجار التنمية | data/wsj/dev_22.LDC99T42 |
--dev-path-text | الرمز المميز الاختياري لبيانات التطوير | تخمين النص الخام. انظر --text-processing |
--text-processing | الاستدلال لتخمين النص الخام من ملفات الأشجار الرمزية descructive. انظر load_trees() في src/treebanks.py | القواعد الافتراضية للغات غير العربية والصينية والعبرية |
--subbatch-max-tokens | الحد الأقصى لعدد الرموز المميزة للمعالجة بالتوازي أثناء التدريب (قد لا يتناسب دفعة كاملة في ذاكرة GPU) | 2000 |
--parallelize | توزيع طبقات النموذج المسبق (مثل T5) عبر وحدات معالجة الرسومات المتعددة. | استخدم في معالجة GPU واحدة على الأكثر |
--batch-size | عدد الأمثلة في تحديث التدريب | 32 |
--checks-per-epoch | عدد تقييمات التطوير لكل فترة | 4 |
--numpy-seed | بذرة عشوائية numpy | عشوائي |
--use-pretrained | استخدام المشفر قبل التدريب | لا تستخدم التشفير المدربين مسبقًا |
--pretrained-model | نموذج للاستخدام إذا تم تمرير --use-pretrained . قد يكون مسارًا أو معرفًا نموذجًا من مركز Huggingface Model | bert-base-uncased |
--predict-tags | يضيف مكون وضع علامات على جزء الكلام وخسارة مساعدة إلى المحلل اللغوي | لا تتوقع العلامات |
--use-chars-lstm | استخدم تمثيلات كلمة charlstm المستفادة | لا تستخدم charlstm |
--use-encoder | استخدم طبقات المحولات المستفادة أعلى النموذج الذي تم تدريبه مسبقًا أو charlstm | لا تستخدم طبقات محولات إضافية |
--num-layers | عدد طبقات المحولات التي يجب استخدامها إذا تم تمرير --use-encoder | 8 |
--encoder-max-len | الحد الأقصى لطول الجملة (بالكلمات) المسموح بها لطبقات محول إضافية | 512 |
الحجج الإضافية متاحة لمجاوب غيرها الأخرى ؛ انظر make_hparams() في src/main.py . يمكن تحديدها على سطر الأوامر ، مثل --num-layers 2 (للمعلمات العددية) ، --predict-tags (للمعلمات المنطقية التي الافتراضي إلى خطأ) ، أو --no-XXX (للمعلمات المنطقية التي الافتراضية التي إلى صحيح).
لكل تقييم للتطوير ، يتم حساب درجة F على مجموعة التطوير ومقارنتها مع الأفضل السابق. إذا كان النموذج الحالي أفضل ، فسيتم حذف النموذج السابق وسيتم حفظ النموذج الحالي. سيتم اشتقاق اسم الملف الجديد من قاعدة مسار النموذج المقدمة ونطاق تطوير F.
قبل تدريب المحلل ، ستحتاج أولاً إلى الحصول على بيانات التدريب المناسبة. نحن نقدم إرشادات حول كيفية معالجة مجموعات البيانات القياسية مثل PTB و CTB و SMPRL 2013/2014 بيانات المهمة المشتركة. بعد اتباع التعليمات الخاصة ببيانات WSJ الإنجليزية ، يمكنك استخدام الأمر التالي لتدريب محلل إنجليزي باستخدام المقاييس المفرطة الافتراضية:
python src/main.py train --use-pretrained --model-path-base models/en_bert_base
انظر EXPERIMENTS.md لمزيد من الأمثلة على خيارات الفائقة الجيدة.
يمكن تقييم النموذج المحفوظ على مجموعة اختبار باستخدام python src/main.py test ... مع الوسائط التالية:
| دعوى | وصف | تقصير |
|---|---|---|
--model-path | مسار النموذج المحفوظ | ن/أ |
--evalb-dir | مسار إلى دليل التقييم | EVALB/ |
--test-path | طريق لاختبار الأشجار | data/23.auto.clean |
--test-path-text | الرمز المميز الاختياري لبيانات الاختبار | تخمين النص الخام. انظر --text-processing |
--text-processing | الاستدلال لتخمين النص الخام من ملفات الأشجار الرمزية descructive. انظر load_trees() في src/treebanks.py | القواعد الافتراضية للغات غير العربية والصينية والعبرية |
--test-path-raw | المسار البديل لاختبار الأشجار المستخدمة في evalb فقط (المستخدمة في التحقق المزدوج هذا التقييم ضد الأشجار المعالجة مسبقا لا يحتوي على أي أخطاء) | قارن بالأشجار من --test-path |
--subbatch-max-tokens | الحد الأقصى لعدد الرموز المميزة للمعالجة بالتوازي (لا يحتوي وحدة معالجة الرسومات على ذاكرة كافية لمعالجة مجموعة البيانات الكاملة في دفعة واحدة) | 500 |
--parallelize | توزيع طبقات النموذج المسبق (مثل T5) عبر وحدات معالجة الرسومات المتعددة. | استخدم في معالجة GPU واحدة على الأكثر |
--output-path | مسار لكتابة الأشجار المتوقعة إلى (استخدام "-" ل stdout). | لا تنقذ الأشجار المتوقعة |
--no-predict-tags | استخدم علامات جزء من الكلام عند تشغيل evalb. هذا هو المعيار للمنشورات ، وقد يعطي حذف هذه العلم درجات عالية من F1. | استخدم علامات جزء من الكلام المتوقعة لـ Evalb ، إذا كان ذلك متاحًا |
على سبيل المثال ، يمكنك تقييم نموذج مدرب باستخدام الأمر التالي:
python src/main.py test --model-path models/en_bert_base_dev=*.pt
يمكن لحزمة benepar استخدام نقاط التفتيش المحفوظة مباشرة عن طريق استبدال اسم طراز مثل benepar_en3 بمسار مثل models/en_bert_base_dev_dev=95.67.pt ومع ذلك ، فإن إطلاق نقاط التفتيش من الملفات الواحدة لديه بعض أوجه القصور:
استخدم src/export.py لتحويل ملف نقطة التفتيش إلى دليل يلف كل شيء عن نموذج مدرب. على سبيل المثال،
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
عند التصدير ، هناك أيضًا خيار --compress الذي يقوم بضبط أوزان النموذج قليلاً ، بحيث يمكن ضغط دليل الإخراج في أرشيف مضغوط بحجم أصغر بكثير. نستخدم هذا لإصدارات النموذج الرسمية لدينا ، لأنه من المتاعب لتوزيع أوزان النماذج التي يبلغ حجمها 2 جيجابايت+. عند استخدام خيار --compress ، يوصى بتحديد مجموعة اختبار من أجل التحقق من أن الضغط له بالفعل تأثير ضئيل على تحليل التحليل. لا ينصح باستخدام بيانات التطوير للتحقق ، حيث تم استخدام بيانات التطوير بالفعل لمعيار اختيار النموذج أثناء التدريب.
python src/export.py export
--model-path models/en_bert_base_dev=*.pt
--output-dir=models/en_bert_base
--test-path=data/wsj/test_23.LDC99T42
يحتوي البرنامج النصي src/export.py أيضًا على مجموعة فرعية test تشبه تقريبًا python src/main.py test ، باستثناء أنه يدعم النماذج المصدرة وله أعلام مختلفة قليلاً. يمكننا تشغيل الأمر التالي للتحقق من أن المحلل الإنجليزي الخاص بنا باستخدام Bert-Large-uncated يحقق بالفعل 95.55 F1 على مجموعة اختبار WSJ الكنسي:
python src/export.py test --model-path benepar_en3_wsj --test-path data/wsj/test_23.LDC99T42
انظر EXPERIMENTS.md .
إذا كنت تستخدم هذا البرنامج للبحث ، فيرجى الاستشهاد بأوراقنا على النحو التالي:
@inproceedings{kitaev-etal-2019-multilingual,
title = "Multilingual Constituency Parsing with Self-Attention and Pre-Training",
author = "Kitaev, Nikita and
Cao, Steven and
Klein, Dan",
booktitle = "Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics",
month = jul,
year = "2019",
address = "Florence, Italy",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P19-1340",
doi = "10.18653/v1/P19-1340",
pages = "3499--3505",
}
@inproceedings{kitaev-klein-2018-constituency,
title = "Constituency Parsing with a Self-Attentive Encoder",
author = "Kitaev, Nikita and
Klein, Dan",
booktitle = "Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2018",
address = "Melbourne, Australia",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/P18-1249",
doi = "10.18653/v1/P18-1249",
pages = "2676--2686",
}
يعتمد الرمز في هذا المستودع وأجزاء من هذا ReadMe على https://github.com/mitchellstern/minimal-span-parser