نما المشروع ، وتحل المكتبة الآن جميع المهام الأساسية لمعالجة اللغة الروسية الطبيعية: تجزئة إلى رموز وجمل ، والتحليل الصرفي والنحوي ، واستخراج الكيانات المسماة.
بالنسبة للمقالات الإخبارية ، فإن جودة جميع المهام قابلة للمقارنة أو أعلى من الحلول الحالية... على سبيل المثال ، تتكيف ناتاشا مع مهمة NER بمقدار نقطة مئوية واحدة أسوأ من Deeppavlov BERT NER (F1 PER 0.97 ، LOC 0.91 ، ORG 0.85) ، يزن النموذج 75 مرة أقل (27 ميجابايت) ، ويعمل على وحدة المعالجة المركزية أسرع مرتين (25 مقالة / ثانية ) من BERT NER على GPU.
يوجد 9 مستودعات في المشروع ، توحدهم مكتبة ناتاشا تحت واجهة واحدة. في المقالة ، سنتحدث عن الأدوات الجديدة ، ونقارنها بالحلول الحالية: Deeppavlov ، SpaCy ، UDPipe .
سبقت هذا longridu سلسلة من المنشورات على موقع natasha.github.io :إذا شعرت بالخوف من حجم النص أدناه ، فراقب أول 20 دقيقة من تدفق الأنبوب حول تاريخ مشروع ناتاشا ، فهناك إعادة سرد قصيرة:
- ناتاشا - جودة NER مدمجة للغة الروسية
- Navec - حفلات الزفاف المدمجة للغة الروسية
- Corus - مجموعة من مجموعات بيانات البرمجة اللغوية العصبية باللغة الروسية
- Razdel - تجزئة نص اللغة الروسية إلى رموز وعروض
- نيفال - مقارنة كمية لأنظمة البرمجة اللغوية العصبية الناطقة بالروسية
- Nerus عبارة عن مجموعة بيانات تركيبية كبيرة باللغة الروسية مع ترميز التشكل وبناء الجملة والكيانات المسماة
يستخدم النص ملاحظات ومناقشات من دردشة t.me/natural_language_processing ، وتظهر روابط لمواد جديدة في نفس المكان:
- لماذا لا تستخدم ناتاشا المتحولون. BERT في 100 سطر
- نماذج Slovnet BERT
- تيار أنبوب حول تاريخ مشروع ناتاشا
- وثائق Yargy المحدثة
- موارد إضافية على المحلل اللغوي Yargy
بالنسبة لأولئك الذين يحبون الاستماع أكثر ، تحقق من المحادثة كل ساعة في Datafest 2020 ، فهي تغطي تقريبًا هذا المنشور:
المحتوى:
- Natasha — .
- Razdel —
- Slovnet — deep learning
- Navec —
- Nerus — ,
- Corus — +
- Naeval — NLP
- Yargy- —
- Ipymarkup —
Natasha — .
في السابق ، حلت مكتبة ناتاشا مشكلة NER للغة الروسية ، وتم بناؤها على قواعد ، وأظهرت متوسط الجودة والأداء. الآن ناتاشا مشروع كبير بالكامل ، يتكون من 9 مستودعات . توحدهم مكتبة ناتاشا تحت واجهة واحدة ، وتحل المهام الأساسية لمعالجة اللغة الروسية الطبيعية: التجزئة إلى رموز وجمل ، وحفلات الزفاف المدربة مسبقًا ، وتحليل التشكل والنحو ، و lemmatization ، و NER. تعرض جميع الحلول أفضل النتائج في موضوعات الأخبار ، وتعمل بسرعة على وحدة المعالجة المركزية.
تشبه Natasha المكتبات المدمجة الأخرى: SpaCy و UDPipe و Stanza... يقوم SpaCy بتهيئة النماذج واستدعائها بشكل ضمني ، ويمرر المستخدم النص إلى الوظيفة السحرية
nlp، ويحصل على مستند تم تحليله بالكامل.
import spacy
# load ,
# , NER
nlp = spacy.load('...')
# ,
text = '...'
doc = nlp(text)
واجهة ناتاشا أكثر تفصيلاً. يقوم المستخدم صراحة بتهيئة المكونات: تحميل حفلات الزفاف الجاهزة ، ويمررها إلى صانعي النماذج. سام يدعو طرق
segment، tag_morph، parse_syntaxتجزئة في الرموز والطلب، وتحليل التشكل وبناء الجملة.
>>> from natasha import (
Segmenter,
NewsEmbedding,
NewsMorphTagger,
NewsSyntaxParser,
Doc
)
>>> segmenter = Segmenter()
>>> emb = NewsEmbedding()
>>> morph_tagger = NewsMorphTagger(emb)
>>> syntax_parser = NewsSyntaxParser(emb)
>>> text = ' , , 2019 () ...'
>>> doc = Doc(text)
>>> doc.segment(segmenter)
>>> doc.tag_morph(morph_tagger)
>>> doc.parse_syntax(syntax_parser)
>>> sent = doc.sents[0]
>>> sent.morph.print()
NOUN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
PROPN|Animacy=Inan|Case=Gen|Gender=Masc|Number=Sing
ADP
PROPN|Animacy=Inan|Case=Loc|Gender=Fem|Number=Sing
PROPN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
PROPN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
...
>>> sent.syntax.print()
┌──► nsubj
│
│ ┌► case
│ └─
│ ┌─
│ └► flat:name
┌─────┌─└───
│ │ ┌──► , punct
│ │ │ ┌► mark
│ └►└─└─ ccomp
│ │ ┌► case
│ └──►└─ obl
...
لا يعتمد مستخرج الكيان المحدد على نتائج التحليل الصرفي والتحليل ، يمكن استخدامه بشكل منفصل.
>>> from natasha import NewsNERTagger
>>> ner_tagger = NewsNERTagger(emb)
>>> doc.tag_ner(ner_tagger)
>>> doc.ner.print()
, ,
LOC──── LOC──── PER───────
2019
LOC──────────────
()
LOC─── ORG───────────────────────────────────────
...
PER────────────
ناتاشا تحل مشكلة اللماتة ، وتستخدم Pymorphy2 ونتائج التحليل الصرفي.
>>> from natasha import MorphVocab
>>> morph_vocab = MorphVocab()
>>> for token in doc.tokens:
>>> token.lemmatize(morph_vocab)
>>> {_.text: _.lemma for _ in doc.tokens}
{'': '',
'': '',
'': '',
'': '',
'': '',
'': '',
'': '',
',': ',',
'': '',
'': ''
...
لإحضار العبارة إلى شكل عادي ، لا يكفي العثور على كلمات منفردة ، بالنسبة لوزارة الخارجية الروسية ، ستصبح وزارة الخارجية الروسية ، لمنظمة القوميين الأوكرانيين - المنظمة القومية الأوكرانية. تستخدم ناتاشا نتائج التحليل ، وتأخذ في الاعتبار العلاقات بين الكلمات ، وتطبيع الكيانات المسماة.
>>> for span in doc.spans:
>>> span.normalize(morph_vocab)
>>> {_.text: _.normal for _ in doc.spans}
{'': '',
'': '',
' ': ' ',
' ': ' ',
'': '',
' ()': ' ()',
' ': ' ',
...
تجد ناتاشا أسماء وأسماء المنظمات وأسماء الأماكن في النص. بالنسبة للأسماء الموجودة في المكتبة ، توجد مجموعة من القواعد الجاهزة لمحلل Yargy-parser ، حيث تقوم الوحدة بتقسيم الأسماء الطبيعية إلى أجزاء ، من "Viktor Fedorovich Yushchenko "
{first: , last: , middle: }.
>>> from natasha import (
PER,
NamesExtractor,
)
>>> names_extractor = NamesExtractor(morph_vocab)
>>> for span in doc.spans:
>>> if span.type == PER:
>>> span.extract_fact(names_extractor)
>>> {_.normal: _.fact.as_dict for _ in doc.spans if _.type == PER}
{' ': {'first': '', 'last': ''},
' ': {'first': '', 'last': ''},
' ': {'first': '', 'last': ''},
'': {'last': ''},
' ': {'first': '', 'last': ''}}
تحتوي المكتبة على قواعد لتحليل التواريخ والمبالغ المالية والعناوين ، وهي موصوفة في كتاب التوثيق والمراجع .
تعتبر مكتبة ناتاشا مناسبة تمامًا لعرض تقنيات المشروع المستخدمة في التعليم. المحفوظات ذات أوزان النموذج مدمجة في الحزمة ، وبعد التثبيت لن تحتاج إلى تنزيل أي شيء وتكوينه.
تجمع ناتاشا بين مكتبات المشروع الأخرى تحت واجهة واحدة. لحل المشاكل العملية يجب استخدامها مباشرة:
- Razdel - تجزئة النص إلى جمل وعلامات مميزة ؛
- Navec - حفلات الزفاف المدمجة عالية الجودة ؛
- Slovnet - نماذج حديثة مدمجة للصرف ، بناء الجملة ، NER ؛
- Yargy - قواعد ومفردات لاستخراج المعلومات المنظمة ؛
- Ipymarkup - تصور NER والترميز النحوي ؛
- Corus - مجموعة من الروابط لمجموعات البيانات العامة باللغة الروسية ؛
- Nerus عبارة عن مجموعة كبيرة ذات ترميز تلقائي للكيانات المسماة ، والتشكيل والبناء .
Razdel - تجزئة نص اللغة الروسية إلى رموز وعروض
تعد مكتبة Razdel جزءًا من مشروع Natasha ، حيث تقسم النص باللغة الروسية إلى رموز وجمل. إرشادات التثبيت ، مثلا استخدام و قياس الأداء في مستودع Razdel.
>>> from razdel import tokenize, sentenize
>>> text = '- 0.5 (50/64 ³, 516;...)'
>>> list(tokenize(text))
[Substring(start=0, stop=13, text='-'),
Substring(start=14, stop=16, text=''),
Substring(start=17, stop=20, text='0.5'),
Substring(start=20, stop=21, text=''),
Substring(start=22, stop=23, text='(')
...]
>>> text = '''
... - " ?" - " --".
... . . . . ,
... '''
>>> list(sentenize(text))
[Substring(start=1, stop=23, text='- " ?"'),
Substring(start=24, stop=40, text='- " --".'),
Substring(start=41, stop=56, text=' . . . .'),
Substring(start=57, stop=76, text=' , ')]
غالبًا ما لا تهتم النماذج الحديثة بالتجزئة ، بل تستخدم BPE ، وتظهر نتائج ملحوظة ، وتتذكر جميع إصدارات GPT وحديقة حيوان BERT . تحل ناتاشا مشاكل تحليل التشكل والنحو ، فهي منطقية فقط للكلمات المنفصلة في جملة واحدة. لذلك ، نقترب بمسؤولية من مرحلة التجزئة ، في محاولة لتكرار الترميز من مجموعات البيانات المفتوحة الشائعة: SynTagRus ، OpenCorpora ، GICRYA .
سرعة وجودة Razdel قابلة للمقارنة أو أفضل من حلول أخرى مفتوحة المصدر للغة الروسية.
| حلول تجزئة الرموز | أخطاء لكل 1000 توكينز | وقت المعالجة ، بالثواني |
| Regexp-Baseline | 19 | 0.5 |
| سبا
|
17 | 5.4 |
| NLTK
|
130 | 3.1 |
| MyStem
|
19 | 4.5 |
| موسى
|
أحد عشر | 1.9 |
| SegTok
|
12 | 2.1 |
| SpaCy Russian Tokenizer
|
8 | 46.4 |
| RuTokenizer
|
15 | 1.0 |
| Razdel
|
7 | 2.6 |
| 1000 | , | |
| Regexp-baseline | 76 | 0.7 |
| SegTok
|
381 | 10.8 |
| Moses
|
166 | 7.0 |
| NLTK
|
57 | 7.1 |
| DeepPavlov
|
41 | 8.5 |
| Razdel | 43 | 4.8 |
متوسط عدد الأخطاء في 4 مجموعات بيانات : SynTagRus و OpenCorpora و GICRYA و RNC . مزيد من التفاصيل في مستودع Razdel .
لماذا نحتاج إلى Razdel على الإطلاق ، إذا كان خط الأساس بخط عادي يعطي جودة مماثلة وهناك الكثير من الحلول الجاهزة للغة الروسية؟ في الواقع ، Razdel ليس مجرد رمز مميز ، ولكنه محرك تجزئة صغير قائم على القواعد. التقسيم مهمة أساسية ، غالبًا ما تتم مواجهتها في الممارسة. على سبيل المثال ، هناك فعل قضائي ، تحتاج إلى إبراز الجزء النافذ فيه وتقسيمه إلى فقرات. بطبيعة الحال ، لا يمكن للحلول الجاهزة أن تفعل ذلك. اقرأ كيفية كتابة القواعد الخاصة بك في التعليمات البرمجية المصدر . علاوة على ذلك ، سنتحدث عن كيفية دفع نفسك وتقديم أفضل حل للرموز والعروض على محركنا.
ما هي الصعوبة؟
في اللغة الروسية ، تنتهي الجمل عادة بنقطة أو علامة استفهام أو علامة تعجب. دعنا فقط نقسم النص بتعبير عادي
[.?!]\s+. سيعطي هذا الحل 76 خطأ لكل 1000 جملة. أنواع الأخطاء وأمثلة عليها:
الاختصارات
... أي منصة بجمهور يصل إلى 3000 شخص أو أكثر هي مدون.
... وقفت باي فوقهم من نهاية القرن السابع عشر ؛
... في مسرح الحجرة الموسيقي الذي يحمل اسم B.A. بوكروفسكي.
بالاحرف الاولى
في أعقاب أوبرا "ايدومينيو" V.A.▒Motsarta - R.▒Shtrausa ...
قوائم
و2.▒dumal يكون في القنصلية الفنلندية طابور طويل جدا ...
القطارات g.▒bilety السكك الحديدية الروسية ...
في نهاية مبتسم الجملة أو نقاط مطبعية
كل من يقترح طريقة للتخلص من السلبيات - بفضل ذلك :) looked لقد بدت متأنية ... this الآن هذا غير سار ، حيث سيتم انتهاك المحتوى.
الاقتباسات ، الكلام المباشر ، في نهاية الجملة علامة اقتباس
- هل لديك عروس في المدينة؟ "" لمن لديه عروس؟ "
"من الجيد جدًا أنني لست كذلك!" ▒ الآن ، أثناء الترجمة ، ارتكبت خطأ فرويدًا: "أيديولوجيا".
يأخذ Razdel هذه الفروق الدقيقة في الاعتبار ، مما يقلل من عدد الأخطاء من 76 إلى 43 لكل 1000 جملة.
الوضع مشابه للرموز. الحل الأساسي الجيد هو regex
[--]+|[0-9]+|[^-0-9 ]، حيث يرتكب 19 خطأ لكل 1000 رمز. أمثلة:
الأعداد الكسرية ، وعلامات الترقيم المعقدة
... في أواخر الثمانينيات وأوائل التسعينيات
... يمكن ملاحظة BS-▒3 كتلة أقل قليلاً (3▒ ، ▒6 t)
- وماتت ▒.▒. هل تفهم الفتاة أيها الصقر؟!
يعمل Razdel على تقليل معدل الخطأ إلى 7 لكل 1000 رمز مميز.
مبدأ التشغيل
النظام مبني على القواعد. مبدأ التجزئة إلى الرموز والعروض هو نفسه.
جمع المرشحين
نجد في النص جميع المرشحين لنهاية الجملة: نقاط ، علامات حذف ، أقواس ، علامات اقتباس.
6. "الخيار الأكثر تكرارًا وفي نفس الوقت عالي التصنيف للإجابات" أنا سعيد "(13 عبارة ، 25 نقطة) - حالات تلقي الموافقة والتشجيع. ، ولكن بمجرد مواجهة الإجابة "أنا امرأة" ”؛ هناك عبارات تقول" زواج واحد هو كل ما ينتظرني في هذه الحياة "▒ و" عاجلاً أم آجلاً سأضطر إلى الولادة "▒.▒ المترجمون: V.▒P.▒Golovin ، F.▒V▒Zanichev ، A.▒L.Rastorguev ، R.▒V.▒Savko ، I.▒I.▒Tuchkov.
بالنسبة للرموز ، نقسم النص إلى ذرات. لا يمر حد الرمز المميز داخل الذرة تمامًا.
في نهاية عام 1980▒-▒▒-البداية1990▒-▒▒
BS▒-▒3▒ من الممكن ▒
تحديد ▒ كتلة أصغر قليلاً▒ (▒3▒، ▒6▒▒) ▒ ▒— Daandumerla▒.▒.▒.▒ هل حصلت على الفتاة الصغيرة ، ▒ الصقر▒؟!
اتحاد
نحن نتجاوز باستمرار المرشحين للانفصال ، ونزيل غير الضروريين. نحن نستخدم قائمة الاستدلال.
قائمة الاغراض. الفاصل عبارة عن فترة أو قوس ، على اليسار رقم أو حرف
6. الإجابة الأكثر تكرارًا وفي نفس الوقت ذات التصنيف العالي "أنا سعيد" (13 عبارة ، 25 نقطة) هي حالة تلقي الموافقة والمكافأة. 7.▒ من الجدير بالذكر أنه في الإجابة "أنا أعلم" ...
الأحرف الأولى. فاصل - نقطة ، حرف واحد كبير على اليسار
... جمعه V.▒P.▒Golovin ، F.▒V.▒Zanichev ، A.▒L.Rastorguev ، R.▒V.▒Savko ، I.▒I.▒Tuchkov ...
لا توجد مساحة على يمين الفاصل
... ولكن مرة واحدة فقط الإجابة "أنا امرأة" ▒ ؛ هناك عبارات "زواج واحد هو كل ما ينتظرني في هذه الحياة" و "عاجلاً أم آجلاً سألد" ▒.
لا توجد علامة نهاية الجملة قبل علامة الاقتباس أو الأقواس للإغلاق ، فهذه ليست اقتباسًا أو خطابًا مباشرًا
6. الإجابة الأكثر تكرارًا والتي تحظى بتقدير كبير هي "أنا سعيد" (13 عبارة ، 25 نقطة) ▒ - حالات الحصول على الموافقة والتشجيع. ... "الزواج الواحد هو كل ما ينتظرني في هذه الحياة" و "عاجلاً أم آجلاً سألد."
نتيجة لذلك ، يتبقى فاصلين ، نعتبرهما نهايتي الجمل.
6. البديل الأكثر تكرارا وفي نفس الوقت الذي يحظى بتقدير كبير من الإجابات "أنا سعيد" (13 عبارة ، 25 نقطة) - حالات تلقي الموافقة والتشجيع. من الجدير بالذكر أنه في الإجابة "أعلم" تم تقييمها على أنها الأكثر نمطية ، ولكن بمجرد العثور على الإجابة "أنا امرأة" ؛ هناك عبارات "زواج واحد هو كل ما ينتظرني في هذه الحياة" و "عاجلاً أم آجلاً سأضطر إلى الولادة". المؤلفون: V.P. Golovin ، F.V. Zanichev ، A.L. Rastorguev ، R.V. سافكو ، آي توتشكوف.
الإجراء مشابه للرموز ، القواعد مختلفة.
كسر أو عدد منطقي
... (3▒، ▒6 t) ...
علامات ترقيم معقدة
- نعم ومات .▒.▒. هل تفهم الفتاة أيها الصقر؟!
لا توجد مسافات حول الواصلة ، هذه ليست بداية الكلام المباشر
في نهاية 1980▒-▒ - أوائل 1990▒-▒
BS▒-▒3 يمكن ملاحظته ...
كل ما تبقى يعتبر حدود الرموز المميزة.
في نهاية 1980s-x▒-early▒1990-x▒
BS-3▒ من الممكن نغمات خفيفة كتلة ▒ (،3،6▒t▒) ▒
▒ - نعم وتوفي. ..▒ حصلت عليه▒ligirl ، ▒sokol▒؟!
محددات
تم تحسين قواعد Razdel للنص المكتوب بدقة مع علامات الترقيم الصحيحة. الحل يعمل بشكل جيد مع المقالات الإخبارية والنصوص الأدبية. في المنشورات من الشبكات الاجتماعية ، ونصوص المحادثات الهاتفية ، تكون الجودة أقل. إذا لم يكن هناك مسافة بين الجمل أو لم تكن هناك نقطة في النهاية ، أو إذا بدأت الجملة بحرف صغير ، فإن Razdel سيرتكب خطأ. اقرأ
كيفية كتابة القواعد لمهامك في التعليمات البرمجية المصدر ، لم يتم الكشف عن هذا الموضوع في الوثائق.
Slovnet - نمذجة التعلم العميق لمعالجة اللغة الروسية الطبيعية
في المشروع ، تشارك ناتاشا سلوفنت في تدريس واستدلال النماذج الحديثة للغة البرمجة اللغوية العصبية الناطقة بالروسية. تحتوي المكتبة على نماذج مضغوطة عالية الجودة لاستخراج الكيانات المسماة ، وتحليل التشكل والنحو. الجودة في جميع المهام قابلة للمقارنة أو متفوقة على الحلول المفتوحة الأخرى للغة الروسية في النصوص الإخبارية. تعليمات التثبيت ، أمثلة للاستخدام - في مستودع Slovnet . دعنا نلقي نظرة فاحصة على كيفية ترتيب حل مشكلة NER ، لأن التشكل والنحو كل شيء يتم عن طريق القياس.
في نهاية عام 2018 ، بعد مقال من Google حول BERT ، كان هناك الكثير من التقدم في معالجة اللغة الإنجليزية للغة الإنجليزية. في عام 2019 ، الرجال من مشروع DeepPavlovظهرت RuBERT متعددة اللغات المعدلة للغة الروسية . تم تدريب رئيس CRF على القمة ، واتضح أن DeepPavlov BERT NER - SOTA للغة الروسية. يتميز الطراز بجودة ممتازة ، وأخطاء أقل مرتين من أقرب مطارد DeepPavlov NER ، لكن الحجم والأداء مخيفان : 6 جيجابايت - استهلاك وحدة معالجة الرسومات (RAM) ، 2 جيجابايت - حجم النموذج ، 13 مقالة في الثانية - الأداء على وحدة معالجة الرسومات الجيدة.
في عام 2020 ، في مشروع Natasha ، تمكنا من الاقتراب من الجودة من DeepPavlov BERT NER ، وتبين أن حجم النموذج أصغر 75 مرة (27 ميجابايت) ، واستهلاك الذاكرة أقل 30 مرة (205 ميجابايت) ، والسرعة أعلى مرتين في وحدة المعالجة المركزية (25 مقالة في الثانية) ).
| ناتاشا ، Slovnet NER | ديب بافلوف بيرت نير | |
| PER / LOC / ORG F1 حسب الرموز ، متوسط المجموعة 5 ، factRuEval-2016 ، BSNLP-2019 ، Gareev | 0.97 / 0.91 / 0.85 | 0.98 / 0.92 / 0.86 |
| حجم النموذج | 27 ميغا بايت | 2 جيجا بايت |
| استهلاك الذاكرة | 205 ميغا بايت | 6 جيجا بايت (GPU) |
| الأداء ، مقالات إخبارية في الثانية (مقال واحد ≈ 1 كيلوبايت) | 25 لكل وحدة معالجة مركزية (Core i5) | 13 وحدة معالجة رسومات (RTX 2080 Ti) ، وحدة معالجة مركزية واحدة |
| وقت التهيئة ، ثوان | 1 | 35 |
| تدعم المكتبة | Python 3.5+ ، PyPy3 | Python 3.6+ |
| التبعيات | NumPy | TensorFlow |
جودة Slovnet NER أقل بنسبة 1 نقطة مئوية من SOTA DeepPavlov BERT NER ، وحجم النموذج أصغر 75 مرة ، واستهلاك الذاكرة أقل بمقدار 30 مرة ، والسرعة أعلى مرتين على وحدة المعالجة المركزية. مقارنة مع SpaCy و PullEnti وحلول أخرى لـ NER الناطق باللغة الروسية في مستودع Slovnet .
كيف تحصل على هذه النتيجة؟ وصفة قصيرة:
Slovnet NER = Slovnet BERT NER - التناظرية لـ DeepPavlov BERT NER + التقطير من خلال العلامات الاصطناعية ( Nerus ) في WordCNN-CRF مع التضمينات الكمية ( Navec ) + محرك للاستدلال على NumPy.
الآن بالترتيب. الخطة هي كما يلي: تدريب نموذج ثقيل بهندسة BERT على مجموعة بيانات مشروحة يدويًا. نحتفل به بمجموعة أخبار ، ونحصل على مجموعة بيانات تدريب تركيبية كبيرة قذرة. دعونا ندرب نموذجًا بدائيًا مضغوطًا عليه. هذه العملية تسمى التقطير: النموذج الثقيل هو المعلم ، والنموذج المدمج هو الطالب. نعتقد أن بنية BERT زائدة عن الحاجة لمشكلة NER ، ولن يفقد النموذج المضغوط الكثير من الجودة للنموذج الثقيل.
مدرس نموذجي
يتكون DeepPavlov BERT NER من مشفر RuBERT ورأس CRF. يكرر نموذج المعلم الثقيل هذه البنية مع تحسينات طفيفة.
تقيس جميع المعايير جودة NER على النصوص الإخبارية. دعونا ندرب RuBERT على الأخبار. يحتوي مستودع Corus على روابط لمجموعة الأخبار العامة باللغة الروسية ، بإجمالي 12 جيجا بايت من النصوص. نستخدم تقنيات من مقالة Facebook حول RoBERTa : مجموعات كبيرة مجمعة ، وقناع ديناميكي ، ورفض توقع الجملة التالية (NSP). يستخدم RuBERT قاموسًا ضخمًا يضم 120000 علامة فرعية - وهو إرث من BERT متعدد اللغات من Google. تقليص الحجم إلى 50000 خبر متكرر ، ستنخفض التغطية بنسبة 5٪. احصل على NewsRuBERT، يتوقع النموذج أن تكون الرموز الفرعية المقنعة في الأخبار أفضل بخمس نقاط مئوية من RuBERT (63٪ في أعلى 1).
دعونا ندرب برنامج ترميز NewsRuBERT ورئيس CRF على 1000 مقالة من Collection5 . نحصل على Slovnet BERT NER ، الجودة 0.5 نقطة مئوية أفضل من DeepPavlov BERT NER ، حجم النموذج أصغر 4 مرات (473 ميجابايت) ، يعمل 3 مرات أسرع (40 مقالة في الثانية).
NewsRuBERT = RuBERT + 12 جيجابايت من الأخبار + التقنيات من قاموس RoBERTa + 50 ألفًا.
Slovnet BERT NER (التناظرية لـ DeepPavlov BERT NER) = NewsRuBERT + رأس CRF + Collection5.
الآن ، لتدريب النماذج باستخدام بنية تشبه BERT ، من المعتاد استخدام Transformers من Hugging Face. المحولات هي 100000 سطر من كود Python. عندما تنفجر الخسارة أو القمامة عند الاستدلال ، من الصعب معرفة الخطأ الذي حدث. حسنًا ، هناك الكثير من التعليمات البرمجية مكررة. حتى لو قمنا بتدريب RoBERTa ، يمكننا بسرعة توطين المشكلة إلى 3000 سطر من التعليمات البرمجية ، ولكن هذا أيضًا كثير. مع PyTorch الحديثة ، فإن مكتبة Transformers ليست مناسبة تقريبًا. مع
torch.nn.TransformerEncoderLayerرمز النموذج الذي يشبه RoBERTa يأخذ 100 سطر:
class BERTEmbedding(nn.Module):
def __init__(self, vocab_size, seq_len, emb_dim, dropout=0.1, norm_eps=1e-12):
super(BERTEmbedding, self).__init__()
self.word = nn.Embedding(vocab_size, emb_dim)
self.position = nn.Embedding(seq_len, emb_dim)
self.norm = nn.LayerNorm(emb_dim, eps=norm_eps)
self.drop = nn.Dropout(dropout)
def forward(self, input):
batch_size, seq_len = input.shape
position = torch.arange(seq_len).expand_as(input).to(input.device)
emb = self.word(input) + self.position(position)
emb = self.norm(emb)
return self.drop(emb)
def BERTLayer(emb_dim, heads_num, hidden_dim, dropout=0.1, norm_eps=1e-12):
layer = nn.TransformerEncoderLayer(
d_model=emb_dim,
nhead=heads_num,
dim_feedforward=hidden_dim,
dropout=dropout,
activation='gelu'
)
layer.norm1.eps = norm_eps
layer.norm2.eps = norm_eps
return layer
class BERTEncoder(nn.Module):
def __init__(self, layers_num, emb_dim, heads_num, hidden_dim,
dropout=0.1, norm_eps=1e-12):
super(BERTEncoder, self).__init__()
self.layers = nn.ModuleList([
BERTLayer(
emb_dim, heads_num, hidden_dim,
dropout, norm_eps
)
for _ in range(layers_num)
])
def forward(self, input, pad_mask=None):
input = input.transpose(0, 1) # torch expects seq x batch x emb
for layer in self.layers:
input = layer(input, src_key_padding_mask=pad_mask)
return input.transpose(0, 1) # restore
class BERTMLMHead(nn.Module):
def __init__(self, emb_dim, vocab_size, norm_eps=1e-12):
super(BERTMLMHead, self).__init__()
self.linear1 = nn.Linear(emb_dim, emb_dim)
self.norm = nn.LayerNorm(emb_dim, eps=norm_eps)
self.linear2 = nn.Linear(emb_dim, vocab_size)
def forward(self, input):
x = self.linear1(input)
x = F.gelu(x)
x = self.norm(x)
return self.linear2(x)
class BERTMLM(nn.Module):
def __init__(self, emb, encoder, head):
super(BERTMLM, self).__init__()
self.emb = emb
self.encoder = encoder
self.head = head
def forward(self, input):
x = self.emb(input)
x = self.encoder(x)
return self.head(x)
هذا ليس نموذجًا أوليًا ، يتم نسخ الكود من مستودع Slovnet . المحولات جيدة للقراءة ، فهي تقوم بالكثير من العمل ، وتحشو كود المقالات باستخدام Arxiv ، وغالبًا ما يكون مصدر Python أكثر وضوحًا من الشرح في مقال علمي.
مجموعة البيانات التركيبية
دعونا نحتفل بـ 700000 مقال من مجموعة Lenta.ru بنموذج ثقيل. نحصل على مجموعة بيانات تدريب تركيبية ضخمة. الأرشيف متاح في مستودع Nerus لمشروع ناتاشا. العلامات عالية الجودة للغاية ، تقديرات F1 من خلال الرموز المميزة: PER - 99.7٪ ، LOC - 98.6٪ ، ORG - 97.2٪. أمثلة نادرة على الأخطاء:
ORG────────────── LOC────────────────────────────
241- 4- 10-
<
LOC─── LOC──────
>.
───────────~~~~~~~~~~~
ORG────────────────────~~~~~~~~~~~~~~~~
.
LOC───
<>
~~~~~~~~ LOC──────────────────
.
~~~~ ~~~~~~ LOC───
.
LOC────
-
PER─────────────────────
M&A.
~~~
:
~~~~~~~~~~~~ORG─── LOC──
,
PER─────── LOC───
,
ORG─ LOC─────────────
.
LOC
نموذج المتعلم
لم تكن هناك مشاكل في اختيار بنية نموذج المعلم الثقيل ، لم يكن هناك سوى خيار واحد - المحولات. نموذج الطالب المضغوط أكثر صعوبة ، وهناك العديد من الخيارات. من 2013 إلى 2018 ، من ظهور word2vec إلى المقالة على BERT ، توصلت البشرية إلى مجموعة من بنى الشبكات العصبية لحل مشكلة NER. جميعها لديها مخطط مشترك:
مخطط معماريات الشبكة العصبية لمهمة NER: تشفير الرمز المميز ، مشفر السياق ، وحدة فك ترميز العلامات. تفسيرات الاختصارات في مقال مراجعة بواسطة Yang (2018) .
هناك العديد من التركيبات المعمارية. أي واحد تختار؟ على سبيل المثال ، (CharCNN + Embedding) -WordBiLSTM-CRF هو مخطط نموذجي من مقال حول DeepPavlov NER ، SOTA للغة الروسية حتى عام 2019.
نتخطى الخيارات مع CharCNN و CharRNN وإطلاق شبكة عصبية صغيرة بواسطة الرموز على كل رمز ليس طريقنا ، فهو بطيء جدًا. أود أيضًا تجنب WordRNN ، يجب أن يعمل الحل على وحدة المعالجة المركزية ، وضرب المصفوفات على كل رمز ببطء. بالنسبة لـ NER ، يكون الاختيار بين Linear و CRF مشروطًا. نحن نستخدم ترميز BIO ، ترتيب العلامات مهم. علينا أن نتحمل فرامل رهيبة ، استخدم CRF. لا يزال هناك خيار واحد - تضمين WordCNN-CRF. هذا النموذج ليس حساسًا لحالة الأحرف ، فهو أمر مهم بالنسبة لـ NER ، و "الأمل" مجرد كلمة ، وربما يكون "الأمل" اسمًا. إضافة ShapeEmbedding - التضمين مع مخططات الرمز المميز ، على سبيل المثال: "NER" - EN_XX ، "Vainovich" - RU_Xx ، "!" - PUNCT_! ، "و" - RU_x ، "5.1" - NUM ، "نيويورك" - RU_Xx-Xx. مخطط Slovnet NER - (WordEmbedding + ShapeEmbedding) - WordCNN-CRF.
التقطير
دعونا ندرب Slovnet NER على مجموعة بيانات تركيبية ضخمة. دعونا نقارن النتيجة مع المعلم الثقيل Slovnet BERT NER. يتم حساب الجودة ومتوسطها على مجموعة Collection5 ، Gareev ، factRuEval-2016 ، BSNLP-2019 المحددة يدويًا. حجم عينة التدريب مهم للغاية: بالنسبة لـ 250 مقالة إخبارية (FactRuEval-2016) ، متوسط PER ، LOC ، LOG F1 هو 0.64 ، لـ 1000 (مماثل للمجموعة 5) - 0.81 ، لمجموعة البيانات بأكملها - 0.91 ، جودة Slovnet BERT NER هي 0.92.
جودة Slovnet NER ، الاعتماد على عدد من أمثلة التدريب التركيبي. الخط الرمادي - جودة Slovnet BERT NER. لا ترى Slovnet NER أمثلة مصنفة يدويًا ، فهي تتدرب فقط على البيانات التركيبية.
نموذج الطالب البدائي أسوأ بنقطة مئوية واحدة من نموذج المعلم الصعب. هذه نتيجة رائعة. وصفة عالمية تقترح نفسها:
نقوم بترميز بعض البيانات يدويًا. نقوم بتدريب محول ثقيل. نحن ننتج الكثير من البيانات التركيبية. نقوم بتدريب نموذج بسيط على عينة كبيرة. نحصل على جودة المحولات وحجم وأداء نموذج بسيط.
يوجد في مكتبة Slovnet نموذجان آخران تم تدريبهما وفقًا لهذه الوصفة: Slovnet Morph - العلامات الصرفية ، Slovnet Syntax - المحلل اللغوي. Slovnet Morph يتخلف عن نموذج المعلم الثقيل بنقطتين مئويتين ، Slovnet Syntax - بمقدار 5 . يتمتع كلا النموذجين بجودة وأداء أفضل من الحلول الروسية الحالية للمقالات الإخبارية.
توضيح
يبلغ حجم Slovnet NER 289 ميجابايت. 287 ميجا بايت مشغولة بطاولة بها زينة. يستخدم النموذج مفردات كبيرة من 250.000 سطر تغطي 98٪ من الكلمات في نصوص الأخبار. باستخدام التكميم ، استبدل متجهات العائمة ذات 300 بعد بمتجهات 100-bit 8-bit. سيتم تقليل حجم النموذج 10 مرات (27 ميجابايت) ، ولن تتغير الجودة. تعد مكتبة Navec جزءًا من مشروع Natasha ، وهو عبارة عن مجموعة من حفلات الزفاف المدربة مسبقًا. تستغرق الأوزان المدربة على الروايات 50 ميجا بايت ، متجاوزة جميع نماذج RusVectores الثابتة وفقًا للتقديرات التركيبية .
الإستنباط
يستخدم Slovnet NER PyTorch للتدريب. تزن حزمة PyTorch 700 ميجابايت ، ولا أريد سحبها إلى الإنتاج للاستدلال. لا يعمل PyTorch أيضًا مع مترجم PyPy . يتم استخدام Slovnet جنبًا إلى جنب مع محلل Yargy ، وهو نظير لمحلل Yandex Tomita . مع PyPy ، يعمل Yargy أسرع 2-10 مرات ، اعتمادًا على مدى تعقيد القواعد النحوية. لا أريد أن أفقد السرعة بسبب الاعتماد على PyTorch.
الحل القياسي هو استخدام TorchScript أو تحويل النموذج إلى ONNX ، والاستنتاج في ONNXRuntime . يستخدم Slovnet NER الكتل غير القياسية: الزخارف الكمية ، وحدة فك تشفير CRF. لا يدعم TorchScript و ONNXRuntime PyPy.
Slovnet NER هو نموذج بسيط ،نفذ يدويًا جميع الكتل في NumPy ، استخدم الأوزان المحسوبة بواسطة PyTorch. دعنا نطبق القليل من سحر NumPy ، وننفذ بعناية كتلة CNN ، وحدة فك تشفير CRF ، وتفريغ التضمين الكمي يستغرق 5 أسطر . سرعة الاستدلال على وحدة المعالجة المركزية هي نفسها مع ONNXRuntime و PyTorch ، 25 مقالة إخبارية في الثانية على Core i5.
تعمل التقنية على نماذج أكثر تعقيدًا: يتم تطبيق Slovnet Morph و Slovnet Syntax أيضًا في NumPy. تشترك Slovnet NER و Morph و Syntax في جدول تضمين مشترك. دعنا نخرج الأوزان في ملف منفصل ، الجدول لا يتكرر في الذاكرة وعلى القرص:
>>> navec = Navec.load('navec_news_v1_1B.tar') # 25MB
>>> morph = Morph.load('slovnet_morph_news_v1.tar') # 2MB
>>> syntax = Syntax.load('slovnet_syntax_news_v1.tar') # 3MB
>>> ner = NER.load('slovnet_ner_news_v1.tar') # 2MB
# 25 + 2 + 3 + 2 25+2 + 25+3 + 25+2
>>> morph.navec(navec)
>>> syntax.navec(navec)
>>> ner.navec(navec)
محددات
تستخرج ناتاشا الكيانات القياسية: الأسماء وأسماء الأسماء الجغرافية والمنظمات. يظهر الحل نوعية جيدة في الأخبار. كيف تعمل مع الكيانات وأنواع النصوص الأخرى؟ نحن بحاجة إلى تدريب نموذج جديد. هذا ليس من السهل القيام به. نحن ندفع ثمن الحجم الصغير وسرعة العمل من خلال تعقيد إعداد النموذج. سكريبت كمبيوتر محمول لإعداد نموذج معلم ثقيل ، كمبيوتر محمول نصي لطالب نموذج ، تعليمات لإعداد حفلات الزفاف الكمية .
Navec - حفلات الزفاف المدمجة للغة الروسية
النماذج المدمجة ملائمة للعمل معها. يبدأون بسرعة ، ويستخدمون القليل من الذاكرة ، والمزيد من العمليات المتوازية المناسبة في حالة واحدة.
في البرمجة اللغوية العصبية ، 80-90٪ من أوزان النموذج موجودة في جدول التضمين. تعد مكتبة Navec جزءًا من مشروع Natasha ، وهو عبارة عن مجموعة من حفلات الزفاف المدربة مسبقًا للغة الروسية. من حيث مقاييس الجودة الجوهرية ، فهي أقل بقليل من الحلول العليا لـ RusVectores ، لكن حجم الأرشيف ذي الأوزان أصغر من 5 إلى 6 مرات (51 ميجابايت) ، والقاموس أكبر 2-3 مرات (500 ألف كلمة).
| الجودة * | حجم النموذج ، ميغابايت | حجم القاموس ، × 10 3 | |
| نافيك | 0.719 | 50.6 | 500 |
| روس فيكتورس | 0.638-0.726 | 220.6 - 290.7 | 189-249 |
سنتحدث عن جيدة التضمينات كلمة بكلمة القديمة التي أحدثت ثورة NLP في عام 2013. التكنولوجيا لا تزال ذات صلة اليوم. في المشروع ناتاشا، ونماذج لل تحليل التشكل ، لغوي، و استخراج الكيانات المذكورة تعمل على كلمة بكلمة التضمينات Navec، و تظهر جودة أعلى حلول أخرى مفتوحة .
روس فيكتورس
بالنسبة للغة الروسية ، من المعتاد استخدام حفلات الزفاف المدربة مسبقًا من RusVectores ، فهي تتميز بميزة غير سارة: لا يحتوي الجدول على كلمات ، بل يحتوي على أزواج من "word_POS-tag". الفكرة جيدة ، بالنسبة للزوج "oven_VERB" نتوقع متجهًا مشابهًا لـ "cook_VERB" و "cook_VERB" و "oven_NOUN" - "hut_NOUN" و "furnace_NOUN".
في الممارسة العملية ، من غير الملائم استخدام مثل هذه الزفاف. لا يكفي تقسيم النص إلى رموز ، فكل منها تحتاج إلى تحديد علامة POS بطريقة أو بأخرى. يتضخم جدول التضمين. بدلاً من كلمة واحدة "تصبح" ، نقوم بتخزين 6: 2 المعقولة "تصبح_VERB" و "تصبح_نون" و 4 غريب "تصبح_ADV" و "تصبح_PROPN" و "تصبح_NUM" و "تصبح_ADJ". يوجد 195000 كلمة فريدة في جدول به 250.000 إدخال.
جودة
دعونا نقدر جودة حفلات الزفاف في مسألة القرب الدلالي. لنأخذ كلمتين ، سنجد لكل منهما متجه تضمين ، ونحسب تشابه جيب التمام. Navec للكلمات المتشابهة "كأس" و "إبريق" سيعود 0.49 ، لكلمة "فاكهة" و "فرن" - -0.0047. دعنا نجمع العديد من الأزواج ذات العلامات المرجعية للتشابه ، ونحسب علاقة سبيرمان بإجاباتنا.
واضعو RusVectores تستخدم صغير، التحقق بعناية ومراجعة قائمة اختبار SimLex965 أزواج . دعونا تضيف ياندكس جديدة LRWC ومجموعات البيانات من المشروع RUSSE : HJ ، RT ، AE ، AE2 :
| متوسط الجودة في 6 مجموعات بيانات | وقت التحميل ، بالثواني | حجم النموذج ، ميغابايت | حجم القاموس ، × 10 3 | ||
| نافيك | hudlit_12B_500K_300d_100q |
0.719 | 1.0 | 50.6 | 500 |
news_1B_250K_300d_100q |
0.653 | 0.5 | 25.4 | 250 | |
| روس فيكتورس | ruscorpora_upos_cbow_300_20_2019 |
0.692 | 3.3 | 220.6 | 189 |
ruwikiruscorpora_upos_skipgram_300_2_2019 |
0.691 | 5.0 | 290.0 | 248 | |
tayga_upos_skipgram_300_2_2019 |
0.726 | 5.2 | 290.7 | 249 | |
tayga_none_fasttextcbow_300_10_2019 |
0.638 | 8.0 | 2741.9 | 192 | |
araneum_none_fasttextcbow_300_5_2018 |
0.664 | 16.4 | 2752.1 | 195 |
الجودة
hudlit_12B_500K_300d_100qقابلة للمقارنة أو أفضل من حلول RusVectores ، القاموس أكبر من 2-3 مرات ، وحجم النموذج أصغر 5-6 مرات. كيف حصلت على هذه الجودة والحجم؟
مبدأ التشغيل
hudlit_12B_500K_300d_100q- حفلات الزفاف GloVe مدربة على 145 جيجا من الخيال . سنأخذ الأرشيف مع النصوص من مشروع RUSSE . دعونا استخدام تنفيذ القفازات الأصلي في C والتفاف عليه في واجهة بيثون مريحة .
لماذا لا Word2vec؟ التجارب على مجموعة بيانات كبيرة تكون أسرع مع GloVe. بمجرد أن نحسب مصفوفة التجميع ، استخدمها لإعداد حفلات الزفاف بأبعاد مختلفة ، اختر الخيار الأفضل.
لماذا لا FastText؟ في مشروع ناتاشا ، نعمل مع النصوص الإخبارية. هناك عدد قليل من الأخطاء المطبعية فيها ، يتم حل مشكلة الرموز المميزة OOV بواسطة قاموس كبير. 250.000 صف في الجدول
news_1B_250K_300d_100qتغطي 98٪ من الكلمات في المقالات الإخبارية.
حجم القاموس
hudlit_12B_500K_300d_100q- 500000 مدخل تغطي 98٪ من الكلمات في نصوص خيالية. البعد الأمثل للمتجهات هو 300. يأخذ جدول 500000 × 300 من الأرقام العائمة 578 ميغا بايت ، وحجم الأرشيف مع الأوزان hudlit_12B_500K_300d_100qأصغر 12 مرة ( 48 ميغا بايت ). يتعلق الأمر بالتكميم.
توضيح
استبدل الأرقام العائمة 32 بت برموز 8 بت: [، −0.86) - الكود 0، [0.86، -0.79) - الكود 1، [-0.79، -0.74) - 2، ...، [0.86، ∞) - 255. تم تصغير حجم الجدول 4 مرات (143 ميغا بايت).
:
-0.220 -0.071 0.320 -0.279 0.376 0.409 0.340 -0.329 0.400
0.046 0.870 -0.163 0.075 0.198 -0.357 -0.279 0.267 0.239
0.111 0.057 0.746 -0.240 -0.254 0.504 0.202 0.212 0.570
0.529 0.088 0.444 -0.005 -0.003 -0.350 -0.001 0.472 0.635
────── ──────
-0.170 0.677 0.212 0.202 -0.030 0.279 0.229 -0.475 -0.031
────── ──────
:
63 105 215 49 225 230 219 39 228
143 255 78 152 187 34 49 204 198
163 146 253 58 55 240 188 191 246
243 155 234 127 127 35 128 237 249
─── ───
76 251 191 188 118 207 195 18 118
─── ───
البيانات تقريبية ، والقيم المختلفة -0.005 و -0.003 تستبدل رمزًا واحدًا 127 ، -0.030 و -0.031 - 118 لنستبدل
الكود ليس رقمًا واحدًا ، ولكن 3 أرقام. نقوم بتجميع كل ثلاثة توائم من الأرقام من جدول التضمين باستخدام خوارزمية الوسائل k في 256 مجموعة ، بدلاً من كل ثلاثة توائم سنخزن رمزًا من 0 إلى 255. سينخفض الجدول بمقدار 3 مرات (48 ميجابايت). تستخدم Navec مكتبة وسائل PQk ، فهي تقسم المصفوفة إلى 100 عمود ، كل مجموعة كل واحدة على حدة ، وستنخفض الجودة في الاختبارات التركيبية بنسبة 1 نقطة مئوية. من الواضح حول التكميم في مقالة Product Quantizers لـ k-NN .
حفلات الزفاف الكمية أبطأ من المعتاد. يجب تفريغ الناقل المضغوط قبل الاستخدام. ننفذ الإجراء بعناية ، ونطبق سحر Numpy، في PyTorch نستخدم torch.gather . في Slovnet NER ، يستغرق الوصول إلى جدول التضمين 0.1٪ من إجمالي وقت الحساب. تدمج
وحدة
NavecEmbeddingمن مكتبة Slovnet Navec في نماذج PyTorch:
>>> import torch
>>> from navec import Navec
>>> from slovnet.model.emb import NavecEmbedding
>>> path = 'hudlit_12B_500K_300d_100q.tar' # 51MB
>>> navec = Navec.load(path) # ~1 sec, ~100MB RAM
>>> words = ['', '<unk>', '<pad>']
>>> ids = [navec.vocab[_] for _ in words]
>>> emb = NavecEmbedding(navec)
>>> input = torch.tensor(ids)
>>> emb(input) # 3 x 300
tensor([[ 4.2000e-01, 3.6666e-01, 1.7728e-01,
[ 1.6954e-01, -4.6063e-01, 5.4519e-01,
[ 0.0000e+00, 0.0000e+00, 0.0000e+00,
...
Nerus عبارة عن مجموعة بيانات تركيبية كبيرة مع ترميز مورفولوجيا وبناء الجملة والكيانات المسماة
في مشروع ناتاشا ، تم إجراء تحليل التشكل وبناء الجملة واستخراج الكيانات المسماة بواسطة 3 نماذج مدمجة: Slovnet NER و Slovnet Morph و Slovnet Syntax . جودة الحلول أسوأ بنسبة 1-5 نقاط مئوية من نظيراتها الثقيلة مع بنية BERT ، والحجم أصغر 50-75 مرة ، والسرعة على وحدة المعالجة المركزية أعلى مرتين. يتم تدريب النماذج على مجموعة بيانات Nerus الاصطناعية الضخمة ، في أرشيف يضم 700000 مقالة إخبارية مع ترميز CoNLL-U للصرف ، وبناء الجملة والكيانات المسماة:
# newdoc id = 0
# sent_id = 0_0
# text = - , ...
1 - _ NOUN _ Animacy=Anim|C... 7 nsubj _ Tag=O
2 _ ADP _ _ 4 case _ Tag=O
3 _ ADJ _ Case=Dat|Degre... 4 amod _ Tag=O
4 _ NOUN _ Animacy=Inan|C... 1 nmod _ Tag=O
5 _ PROPN _ Animacy=Anim|C... 1 appos _ Tag=B-PER
6 _ PROPN _ Animacy=Anim|C... 5 flat:name _ Tag=I-PER
7 _ VERB _ Aspect=Perf|Ge... 0 root _ Tag=O
8 , _ PUNCT _ _ 13 punct _ Tag=O
9 _ ADP _ _ 11 case _ Tag=O
10 _ DET _ Case=Loc|Numbe... 11 det _ Tag=O
11 _ NOUN _ Animacy=Inan|C... 13 obl _ Tag=O
12 _ PROPN _ Animacy=Inan|C... 11 nmod _ Tag=B-LOC
13 _ VERB _ Aspect=Perf|Ge... 7 ccomp _ Tag=O
14 _ ADV _ Degree=Pos 15 advmod _ Tag=O
15 _ ADJ _ Case=Nom|Degre... 16 amod _ Tag=O
16 _ NOUN _ Animacy=Inan|C... 13 nsubj _ Tag=O
17 _ ADP _ _ 18 case _ Tag=O
18 _ NOUN _ Animacy=Inan|C... 16 nmod _ Tag=O
19 , _ PUNCT _ _ 20 punct _ Tag=O
20 _ VERB _ Aspect=Imp|Moo... 0 root _ Tag=O
21 _ PROPN _ Animacy=Inan|C... 20 nsubj _ Tag=B-ORG
22 _ PROPN _ Animacy=Inan|C... 21 appos _ Tag=I-ORG
23 . _ PUNCT _ _ 20 punct _ Tag=O
# sent_id = 0_1
# text = , , , ...
1 _ ADP _ _ 2 case _ Tag=O
2 _ NOUN _ Animacy=Inan|C... 9 parataxis _ Tag=O
...
Slovnet NER ، Morph ، النحو - النماذج البدائية. عندما يكون هناك 1000 مثال في مجموعة التدريب ، يتخلف Slovnet NER عن نظير BERT الثقيل بنسبة 11 نقطة مئوية ، عندما يكون 10000 مثال - بمقدار 3 نقاط ، عند 500000 - بمقدار 1.
Nerus هو نتيجة العمل ، نماذج ثقيلة مع هندسة BERT: Slovnet BERT NER ، Slovnet BERT Morph ، Slovnet BERT Syntax . تستغرق معالجة 700000 مقالة إخبارية 20 ساعة على Tesla V100. نوفر وقت الباحثين الآخرين ، ونضع الأرشيف النهائي في وصول مفتوح. في SpaCy-Ru ، قم بالتدريس في نموذج Nerus النوعي لـ SpaCy الناطق باللغة الروسية ، وقم بإعداد رقعة في المستودع الرسمي.
تتميز العلامات التركيبية بجودة عالية: دقة تحديد العلامات المورفولوجية هي 98٪ ، الروابط التركيبية - 96٪. بالنسبة لـ NER ، تقديرات F1 من خلال الرموز المميزة: PER - 99٪ ، LOC - 98٪ ، ORG - 97٪. لتقييم الجودة ، نقوم بترميز SynTagRus و Collection5 وشريحة الأخبار GramEval2020 ، ومقارنة الترميز المرجعي بعلاماتنا ، لمزيد من التفاصيل راجع مستودع Nerus . نظرًا لوجود أخطاء في ترميز البنية ، توجد حلقات وجذور متعددة ، لا تتوافق علامات POS أحيانًا مع الحواف النحوية. من المفيد استخدام المدقق من التبعيات العالمية ، وتخطى مثل هذه الأمثلة.
تنظم حزمة Python Nerus واجهة ملائمة لتحميل وتقديم الترميز:
>>> from nerus import load_nerus
>>> docs = load_nerus('nerus_lenta.conllu.gz')
>>> doc = next(docs)
>>> doc
NerusDoc(
id='0',
sents=[NerusSent(
id='0_0',
text='- , ...',
tokens=[NerusToken(
id='1',
text='-',
pos='NOUN',
feats={'Animacy': 'Anim',
'Case': 'Nom',
'Gender': 'Masc',
'Number': 'Sing'},
head_id='7',
rel='nsubj',
tag='O'
),
NerusToken(
id='2',
text='',
pos='ADP',
...
>>> doc.ner.print()
- ,
PER───────────── LOC───
, . ,
ORG──────── PER──────
...
>>> sent = doc.sents[0]
>>> sent.morph.print()
- NOUN|Animacy=Anim|Case=Nom|Gender=Masc|Number=Sing
ADP
ADJ|Case=Dat|Degree=Pos|Number=Plur
NOUN|Animacy=Inan|Case=Dat|Gender=Masc|Number=Plur
PROPN|Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing
PROPN|Animacy=Anim|Case=Nom|Gender=Fem|Number=Sing
VERB|Aspect=Perf|Gender=Fem|Mood=Ind|Number=Sing
...
>>> sent.syntax.print()
┌►┌─┌───── - nsubj
│ │ │ ┌──► case
│ │ │ │ ┌► amod
│ │ └►└─└─ nmod
│ └────►┌─ appos
│ └► flat:name
┌─└─────────
│ ┌──────► , punct
│ │ ┌──► case
│ │ │ ┌► det
│ │ ┌►└─└─ obl
│ │ │ └──► nmod
└──►└─└───── ccomp
│ ┌► advmod
│ ┌►└─ amod
└►┌─└─── nsubj:pass
│ ┌► case
└──►└─ nmod
┌► , punct
┌─┌─└─
│ └►┌─ nsubj
│ └► appos
└────► . punct
تعليمات التثبيت، أمثلة على استخدام ، تقييم الجودة في مستودع Nerus.
Corus - مجموعة من الروابط لمجموعات البيانات العامة باللغة الروسية + وظائف للتنزيل
تعد مكتبة Corus جزءًا من مشروع Natasha ، وهو عبارة عن مجموعة من الروابط لمجموعات بيانات NLP العامة باللغة الروسية + حزمة Python مع وظائف أداة التحميل. قائمة روابط لمصادر ، تعليمات التثبيت و أمثلة على استخدام في مستودع كورس.
>>> from corus import load_lenta
# Corus Lenta.ru, :
# wget https://github.com/yutkin/Lenta.Ru-News-Dataset/...
>>> path = 'lenta-ru-news.csv.gz'
>>> records = load_lenta(path) # 2, 750 000
>>> next(records)
LentaRecord(
url='https://lenta.ru/news/2018/12/14/cancer/',
title=' \xa0 ...',
text='- ...',
topic='',
tags=''
)
مجموعات البيانات المفتوحة المفيدة للغة الروسية مخفية جيدًا لدرجة أن قلة من الناس يعرفون عنها.
أمثلة على
مجموعة من المقالات الإخبارية
نريد تدريب نموذج اللغة على المقالات الإخبارية ، نحتاج إلى الكثير من النصوص. أول ما يتبادر إلى الذهن هو شريحة أخبار من مجموعة بيانات Taiga (~ 1 جيجابايت). يعرف الكثير عن تفريغ Lenta.ru (2 جيجابايت). من الصعب العثور على مصادر أخرى. في عام 2019 ، استضافت Dialogue مسابقة لتصدر عناوين الأخبار ؛ أعد المنظمون ملف تفريغ لـ RIA Novosti لمدة 4 سنوات (3.7 جيجابايت). في عام 2018 ، نشر يوري بابوروف تحميلًا من 40 مصدرًا إخباريًا باللغة الروسية (7.5 جيجابايت). متطوعون من ODS يشاركون الأرشيفات (7 جيجابايت) التي تم جمعها للمشروع حول تحليل جدول الأعمال الإخباري .
في التسجيل Corusروابط لمجموعات البيانات الموسومة بـ «أخبار» ، لجميع المصادر لها وظيفة تحميل:
load_taiga_*، load_lenta، load_ria، load_buriy_*، ، load_ods_*.
NER
نريد تعليم NER للغة الروسية ، نحتاج إلى نصوص مشروحة. بادئ ذي بدء ، نذكر بيانات مسابقة factRuEval-2016 . للعلامات عيوب: تنسيقها المعقد ، امتدادات الكيانات متداخلة ، هناك فئات "LocOrg" غامضة. لا يعرف الجميع عن مجموعة Named Entities 5 ، التي خلفت الأشخاص -1000 . تخطيط في شكل قياسي ، امتدادات لا تتقاطع ، جمال! المصادر الثلاثة الأخرى معروفة فقط لعشاق NER الناطقين بالروسية. سنكتب إلى رينات غاريف عن طريق البريد الإلكتروني ، ونرفق رابطًا لمقاله لعام 2013 ، وفي المقابل سنتلقى 250 مقالة إخبارية بأسماء ومؤسسات ذات علامات. BSNLP-2019 مسابقة و الذي عقد في 2019حول NER للغات السلافية ، سنكتب إلى المنظمين ، وسوف نحصل على 450 نصًا آخر مميزًا. جاء مشروع WiNER بفكرة إنشاء ترميز NER شبه تلقائي من مقالب Wikipedia ، يتوفر تنزيل كبير للغة الروسية على Github .
الروابط والوظائف لتحميل السجل Corus:
load_factru، load_ne5، load_gareev، load_bsnlp، load_wikiner.
مجموعة من الروابط
قبل الحصول على محمل الإقلاع والدخول إلى السجل ، تتراكم الروابط إلى المصادر في قسم التذاكر . جمع 30 مجموعات البيانات: نسخة جديدة من التايغا ، نص 568GB الروسية من الزحف على المشترك ، استعراض ج Banki.ru و Auto.ru . ندعوك لمشاركة نتائجك وإنشاء تذاكر مع الروابط.
وظائف اللودر
من السهل كتابة رمز مجموعة بيانات بسيطة بنفسك. تفريغ Lenta.ru منظم جيدًا ، والتنفيذ بسيط . يتكون Taiga من حوالي 15 مليون ملف مضغوط CoNLL-U . لكي يعمل التنزيل بسرعة ، لا يستخدم الكثير من الذاكرة ولا يفسد نظام الملفات ، يجب أن تشعر بالارتباك ، وتنفذ بعناية العمل مع الملفات المضغوطة بمستوى منخفض .
بالنسبة لـ 35 مصدرًا ، تحتوي حزمة Corus Python على وظائف محمل. واجهة الوصول إلى Taiga ليست أكثر تعقيدًا من تفريغ Lenta.ru:
>>> from corus import load_taiga_proza_metas, load_taiga_proza
>>> path = 'taiga/proza_ru.zip'
>>> metas = load_taiga_proza_metas(path)
>>> records = load_taiga_proza(path, metas)
>>> next(records)
TaigaRecord(
id='20151231005',
meta=Meta(
id='20151231005',
timestamp=datetime.datetime(2015, 12, 31, 23, 40),
genre=' ',
topic='',
author=Author(
name='',
readers=7973,
texts=92681,
url='http://www.proza.ru/avtor/sadshoot'
),
title=' !',
url='http://www.proza.ru/2015/12/31/1875'
),
text='... ...\n... ..\n...
)
ندعو المستخدمين إلى تقديم طلبات سحب وإرسال وظائف أداة التحميل وإرشادات قصيرة في مستودع Corus.
نيفال - مقارنة كمية لأنظمة البرمجة اللغوية العصبية الناطقة بالروسية
ناتاشا ليس مشروعًا علميًا ، وليس هناك هدف للتغلب على SOTA ، لكن من المهم التحقق من الجودة في المعايير العامة ، لمحاولة احتلال مكانة عالية دون خسارة الكثير في الأداء. كما يفعلون في الأكاديمية: قم بقياس الجودة ، والحصول على رقم ، والحصول على أجهزة لوحية من مقالات أخرى ، ومقارنة هذه الأرقام بأرقامهم. هذا المخطط له مشكلتان:
- نسيان الأداء. لا يقارنون حجم النموذج وسرعة العمل. التركيز على الجودة فقط.
- لا تنشر الكود. عادة ما يكون هناك مليون فروق دقيقة في حساب مقياس الجودة. كيف تحسب بالضبط في المقالات الأخرى؟ مجهول.
Naeval جزء من مشروع Natasha ، وهو عبارة عن مجموعة من النصوص لتقييم جودة وسرعة الأدوات مفتوحة المصدر لمعالجة اللغة الروسية الطبيعية:
| مهمة | مجموعات البيانات | حلول |
| الترميز | SynTagRus, OpenCorpora, GICRYA, RNC
|
SpaCy, NLTK, MyStem, Moses, SegTok, SpaCy Russian Tokenizer, RuTokenizer, Razdel
|
| SynTagRus, OpenCorpora, GICRYA, RNC
|
SegTok, Moses, NLTK, RuSentTokenizer, Razdel
|
|
| SimLex965, HJ, LRWC, RT, AE, AE2
|
RusVectores, Navec
|
|
| GramRuEval2020 (SynTagRus, GSD, Lenta.ru, Taiga)
|
DeepPavlov Morph, DeepPavlov BERT Morph, RuPosTagger, RNNMorph, Maru, UDPipe, SpaCy, Stanza, Slovnet Morph, Slovnet BERT Morph
|
|
| GramRuEval2020 (SynTagRus, GSD, Lenta.ru, Taiga)
|
DeepPavlov BERT Syntax, UDPipe, SpaCy, Stanza, Slovnet Syntax, Slovnet BERT Syntax
|
|
| NER | factRuEval-2016, Collection5, Gareev, BSNLP-2019, WiNER
|
DeepPavlov NER ، DeepPavlov بيرت NER ، DeepPavlov السلافية بيرت NER ، PullEnti ، سبسي ، مقطع ، Texterra ، توميتا ، MITIE ، Slovnet NER ، Slovnet بيرت NER
|
دعنا نلقي نظرة فاحصة على مشكلة NER أدناه.
مجموعات البيانات
هناك 5 معايير عامة لـ NER الناطق بالروسية: factRuEval-2016 ، Collection5 ، Gareev ، BSNLP-2019 ، WiNER . يتم جمع روابط المصدر في سجل Corus . تتكون جميع مجموعات البيانات من مقالات إخبارية ، وسلاسل فرعية مع الأسماء ، وأسماء المنظمات وأسماء الأماكن موضحة في النصوص. ماذا يمكن أن يكون أسهل؟
جميع المصادر لها تنسيق ترميز مختلف. Collection5 يستخدم شكل مأزق من شقي ، Gareev وينر المرافق - لهجات مختلفة من BIO العلامات ، BSNLP-2019 لديها شكل خاص بها ، factRuEval-2016 أيضا لديها مواصفات غير تافهة الخاصة... يحول Naeval جميع المصادر إلى تنسيق مشترك. يتكون الترميز من مسافات. سبان - ثلاثة: نوع الكيان ، بداية ونهاية السلسلة الفرعية.
أنواع الكيانات. تشير factRuEval-2016 و Collection5 بشكل منفصل إلى أنصاف أسماء المنظمات شبه: "الكرملين" و "الاتحاد الأوروبي" و "الاتحاد السوفياتي". تسلط كل من BSNLP-2019 و WiNER الضوء على أسماء الأحداث: "بطولة روسيا" ، "بريكست". تقوم Naeval بتكييف وإزالة بعض العلامات ، وتترك العلامات المرجعية PER و LOC و ORG: أسماء الأشخاص وأسماء الأسماء الجغرافية والمنظمات.
امتدادات متداخلة. في الواقع ، في RealRuEval-2016 ، تتداخل الامتدادات. يبسط نيفال الترميز:
:
, 5 Retail Group,
org_name───────
Org────────────
"", "" "",
org_descr───── org_name─ org_name─── org_name
Org──────────────────────
org_descr─────
Org─────────────────────────────────────
org_descr─────
Org──────────────────────────────────────────────────
, .
:
, 5 Retail Group,
ORG────────────
"", "" "",
ORG────── ORG──────── ORG─────
, .
عارضات ازياء
يقارن نيفال 12 حلاً مفتوحًا لمشكلة NER الروسية. يتم تغليف جميع الأدوات في حاويات Docker بواجهة ويب:
$ docker run -p 8080:8080 natasha/tomita-algfio
2020-07-02 11:09:19 BIN: 'tomita-linux64', CONFIG: 'algfio'
2020-07-02 11:09:19 Listening http://0.0.0.0:8080
$ curl -X POST http://localhost:8080 --data \
' \
\
'
<document url="" di="5" bi="-1" date="2020-07-02">
<facts>
<Person pos="18" len="16" sn="0" fw="2" lw="3">
<Name_Surname val="" />
<Name_FirstName val="" />
<Name_SurnameIsDictionary val="1" />
</Person>
<Person pos="67" len="14" sn="0" fw="8" lw="9">
<Name_Surname val="" />
<Name_FirstName val="" />
<Name_SurnameIsDictionary val="1" />
</Person>
</facts>
</document>
يصعب إطلاق بعض الحلول وتكوينها بحيث لا يستخدمها سوى عدد قليل من الأشخاص. احتل PullEnti ، وهو نظام متطور قائم على القواعد ، المركز الأول في مسابقة FactRuEval في عام 2016. يتم توزيع الأداة على أنها SDK لـ C #. نتج عن العمل في Naeval مشروع منفصل مع مجموعة من الأغلفة لـ PullEnti: PullentiServer هو خادم ويب C # ، عميل pullenti هو عميل Python لـ PullentiServer:
$ docker run -p 8080:8080 pullenti/pullenti-server
2020-07-02 11:42:02 [INFO] Init Pullenti v3.21 ...
2020-07-02 11:42:02 [INFO] Load lang: ru, en
2020-07-02 11:42:03 [INFO] Load analyzer: geo, org, person
2020-07-02 11:42:05 [INFO] Listen prefix: http://*:8080/
>>> from pullenti_client import Client
>>> client = Client('localhost', 8080)
>>> text = ' ' \
... ' ' \
... ' '
>>> result = client(text)
>>> result.graph
يختلف تنسيق العلامات لجميع الأدوات قليلاً. تقوم Naeval بتحميل النتائج وتكييف أنواع الكيانات وتبسيط هيكل الامتدادات:
(PullEnti):
, 19
ORGANIZATION──────────
GEO─────────
PERSON────────────────
PERSONPROPERTY───────
──────────────── PERSON───────────────────────
PERSONPROPERTY──────────────
ORGANIZATION───
.
────────────────
:
, 19
ORG────── LOC─────────
PER───────────── ORG────────────
.
PER─────────────
نتيجة عمل PullEnti أكثر صعوبة في التكيف من ترميز FactRuEval-2016. تقوم الخوارزمية بإزالة علامة PERSONPROPERTY ، وتقسيم PERSON و ORGANIZATION و GEO إلى غير متداخلة PER و LOC و ORG.
مقارنة
لكل زوج من "نموذج ، مجموعة بيانات" ، يحسب Naeval مقياس F1 عن طريق الرموز المميزة ، وينشر جدولًا بنقاط الجودة .
ناتاشا ليس مشروعًا علميًا ، التطبيق العملي للحل مهم بالنسبة لنا. يقيس Naeval وقت البدء وسرعة التشغيل وحجم الطراز واستهلاك ذاكرة الوصول العشوائي. جدول مع النتائج في المستودع .
ونحن على استعداد مجموعات البيانات، ملفوفة 20 أنظمة في حاويات عامل الميناء والمقاييس يحسب لمدة 5 مهام أخرى من NLP الروسية اللغة، والنتائج في مستودع وحمي: tokenization ، تجزئة في الجمل ، التضمينات ، مورفولوجيا و تركيب تحليل .
Yargy- —
Yargy محلل هو التماثلية للياندكس محلل توميتا لبيثون. تعليمات التثبيت ، مثال للاستخدام ، الوثائق في مستودع Yargy. يتم وصف قواعد استخراج الكيانات باستخدام قواعد النحو والقواميس الخالية من السياق . قبل عامين كتبت في Habr مقالًا عن Yargy ومكتبة Natasha ، تحدثت فيه عن حل مشكلة NER للغة الروسية. تم استقبال المشروع بشكل جيد. حل Yargy-parser محل Tomita في مشاريع كبيرة داخل Sberbank و Interfax و RIA Novosti. ظهرت الكثير من المواد التعليمية. فيديو كبير من ورشة عمل في Yandex ساعة ونصف حول عملية تطوير القواعد مع أمثلة:
تم تحديث وثائق، وأنا بتمشيط القسم التمهيدي و مرجعية الكتاب . الأهم من ذلك ، ظهر كتاب الطبخ - قسم يحتوي على ممارسات مفيدة. يحتوي على إجابات للأسئلة الأكثر شيوعًا من t.me/natural_language_processing :
محلل Yargy هو أداة معقدة. يصف كتاب الطبخ النقاط غير الواضحة التي تظهر عند العمل بمجموعات كبيرة من القواعد:
لدينا العديد من الخدمات الكبيرة التي تعمل في معمل Yargy. أعدت قراءة الكود والأنماط التي تم جمعها في كتاب الطبخ والتي لم يتم وصفها للجمهور:
- جيل من القواعد .
- حقيقة الوراثة (مفيدة بشكل خاص ، لا يوجد حل عمليًا يمكنه الاستغناء عن هذه التقنية).
بعد قراءة الوثائق ، من المفيد إلقاء نظرة على المستودع بأمثلة :
يحتوي مشروع ناتاشا أيضًا على مستودع لاستخدام ناتاشا . هذا هو المكان الذي ينتقل إليه كود مستخدمي Yargy parser المنشور على Github. 80٪ من الروابط هي مشاريع تعليمية ، ولكن هناك أيضًا أمثلة مفيدة:
- تحليل موجز لأعمال المترو في سانت بطرسبرغ ؛
- تحليل الإعلانات الخاصة بتوصيل المساكن في الشبكات الاجتماعية ؛
- استخراج سمات من أسماء إطارات السيارات ؛
- تحليل الوظائف الشاغرة من قناة الوظائف في دردشة ODS ؛
بالطبع ، لم يتم نشر الحالات الأكثر إثارة للاهتمام لاستخدام المحلل اللغوي Yargy علنًا على Github. اكتب إلى PM إذا كانت الشركة تستخدم Yargy ، وإذا كنت لا تمانع ، فأضف شعارك إلى natasha.github.io .
Ipymarkup - تصور ترميز الكيانات المسماة والعلاقات النحوية
Ipymarkup هي مكتبة بدائية ضرورية لتسليط الضوء على السلاسل الفرعية في النص ، تصور NER. تعليمات التثبيت ، مثال للاستخدام في مستودع Ipymarkup. المكتبة مشابهة لـ DisplaCy و DisplaCy ENT ، لا تقدر بثمن لتصحيح الأخطاء النحوية لمحلل Yargy.
>>> from yargy import Parser
>>> from ipymarkup import show_span_box_markup as show_markup
>>> parser = Parser(...)
>>> text = '...'
>>> matches = parser.findall(text)
>>> spans = [_.span for _ in matches]
>>> show_markup(text, spans)
مشروع ناتاشا لديه حل لمشكلة الاعراب . كان من الضروري ليس فقط إبراز الكلمات في النص ، ولكن أيضًا رسم الأسهم بينها. هناك الكثير من الحلول الجاهزة ، حتى أن هناك مقالة علمية حول هذا الموضوع .
بالطبع ، لم يكن أي من العناصر الموجودة مناسبًا ، وذات يوم شعرت بالارتباك حقًا ، وطبقت كل السحر الشهير لـ CSS و HTML ، وأضفت تصورًا جديدًا إلى Ipymarkup. تعليمات للاستخدام في قفص الاتهام.
>>> from ipymarkup import show_dep_markup
>>> words = ['', '', '', '', '', '', '-', '', '', '', '', '', '', '', '.']
>>> deps = [(2, 0, 'case'), (2, 1, 'amod'), (10, 2, 'obl'), (2, 3, 'nmod'), (10, 4, 'obj'), (7, 5, 'compound'), (5, 6, 'punct'), (4, 7, 'nmod'), (9, 8, 'case'), (4, 9, 'nmod'), (13, 11, 'case'), (13, 12, 'nummod'), (10, 13, 'nsubj'), (10, 14, 'punct')]
>>> show_dep_markup(words, deps)
الآن في Natasha و Nerus من الملائم رؤية نتائج الإعراب .
