Torchnlp هي مكتبة تعليمية عميقة لمهام NLP. بنيت على Pytorch و Torchtext ، إنها محاولة لتوفير مكونات قابلة لإعادة الاستخدام التي تعمل عبر المهام. حاليًا يمكن استخدامه في مهام التعرف على الكيان المسماة (NER) ومهام الضبط مع نموذج LSTM CRF ثنائي الاتجاه ونموذج شبكة المحولات. يمكن أن تدعم أي مجموعة بيانات تستخدم تنسيق CONLL 2003. سيتم إضافة المزيد من المهام قريبًا
Model وتنفيذ طرق forward() والخسارة loss() لإرجاع التنبؤات والخسارة على التواليHParams لتحديد مكافآت النموذج بسهولةEvaluator Trainer لاستخدام النموذج وتكرارات مجموعة البيانات والمقاييس. تحقق من ner.py للحصول على التفاصيلModel : يتعامل مع التحميل وتوفير النماذج بالإضافةHParams : فئة عامة لتحديد فرط الأبرامير. يمكن أن يستمرTrainer : تدريب نموذج معين على مجموعة بيانات. يدعم ميزات مثل جداول تسوس معدل التعلم المحددة مسبقًا والتوقف المبكرEvaluator : يقيم النموذج على مجموعة بيانات ومقاييس متعددة محددة مسبقًا أو مخصصة.get_input_processor_words : استخدم أثناء الاستدلال لتحويل سلاسل الإدخال بسرعة إلى تنسيق يمكن معالجته بواسطة نموذج transformer.Encoder ، transformer.Decoder : تنفيذ شبكة transfomer من الانتباه هو كل ما تحتاجهCRF : طبقة الحقل العشوائي الشرطي والتي يمكن استخدامها كإخراج نهائيTransformerTagger : نموذج وضع العلامات التسلسلية يتم تنفيذها باستخدام شبكة المحولات و CRFBiLSTMTagger : نموذج وضع العلامات التسلسلية المنفذة باستخدام LSTMS ثنائية الاتجاه و CRF يتطلب Torchnlp الحد الأدنى من Python 3.5 و Pytorch 0.4.0 لتشغيله. تحقق من Pytorch لخطوات التثبيت. استنساخ هذا المستودع وتثبيت تبعيات أخرى مثل Torchtext:
pip install -r requirements.txt
انتقل إلى جذر المشروع وتحقق من النزاهة مع Pytest:
pytest
تثبيت هذا المشروع:
python setup.py
تم تصميم Torchnlp لاستخدامه داخل مترجم Python لتسهيل التجربة دون كتابة وسيطات سطر الأوامر المرهقة.
مهمة ner
يمكن تشغيل مهمة NER على أي مجموعة بيانات تؤكد لتنسيق CONLL 2003. لاستخدام مجموعة بيانات CONLL 2003 NER ضع ملفات مجموعة البيانات في بنية الدليل التالية ضمن جذر مساحة العمل الخاصة بك:
.data
|
|---conll2003
|
|---eng.train.txt
|---eng.testa.txt
|---eng.testb.txt
يتم استخدام eng.testa.txt مجموعة بيانات التحقق من الصحة ويتم استخدام eng.testb.txt كمجموعة بيانات الاختبار.
ابدأ وحدة NER في قذيفة Python التي تقوم بإعداد الواردات:
python -i -m torchnlp.ner
Task: Named Entity Recognition
Available models:
-------------------
TransformerTagger
Sequence tagger using the Transformer network (https://arxiv.org/pdf/1706.03762.pdf)
Specifically it uses the Encoder module. For character embeddings (per word) it uses
the same Encoder module above which an additive (Bahdanau) self-attention layer is added
BiLSTMTagger
Sequence tagger using bidirectional LSTM. For character embeddings per word
uses (unidirectional) LSTM
Available datasets:
-------------------
conll2003: Conll 2003 (Parser only. You must place the files)
>>>
تدريب نموذج المحولات على مجموعة بيانات Conll 2003:
>>> train('ner-conll2003', TransformerTagger, conll2003)
الوسيطة الأولى هي اسم المهمة. تحتاج إلى استخدام نفس اسم المهمة أثناء التقييم والاستدلال. بشكل افتراضي ، ستستخدم وظيفة القطار مقياس F1 مع نافذة من 5 عصر لأداء التوقف المبكر. لتغيير معايير التوقف المبكرة ، حدد المتغير العالمي PREFS على النحو التالي:
>>> PREFS.early_stopping='lowest_3_loss'
سيستخدم هذا الآن فقدان التحقق من الصحة باعتباره معايير التوقف مع نافذة من 3 عصر. يتم حفظ ملفات النماذج ضمن دليل اسم TaskName-ModelName . في هذه الحالة ، يكون NER-CONLL2003-TRANSFORMERTAGRAGT
تقييم النموذج المدرب على تقسيم مجموعة بيانات TestB :
>>> evaluate('ner-conll2003', TransformerTagger, conll2003, 'test')
ستعرض مقاييس مثل الدقة ، ودقة التسلسل ، و F1 إلخ
قم بتشغيل النموذج المدرب بشكل تفاعلي لمهمة NER:
>>> interactive('ner-conll2003', TransformerTagger)
...
Ctrl+C to quit
> Tom went to New York
I-PER O O I-LOC I-LOC
يمكنك بالمثل تدريب نموذج LSTM CRF ثنائي الاتجاه باستخدام فئة BiLSTMTagger . تخصيص أجهزة التمييز بشكل مستقيم إلى الأمام. دعونا نلقي نظرة على فرطاميرات لـ TransformerTagger :
>>> h2 = hparams_transformer_ner()
>>> h2
Hyperparameters:
filter_size=128
optimizer_adam_beta2=0.98
learning_rate=0.2
learning_rate_warmup_steps=500
input_dropout=0.2
embedding_size_char=16
dropout=0.2
hidden_size=128
optimizer_adam_beta1=0.9
embedding_size_word=300
max_length=256
attention_dropout=0.2
relu_dropout=0.2
batch_size=100
num_hidden_layers=1
attention_value_channels=0
attention_key_channels=0
use_crf=True
embedding_size_tags=100
learning_rate_decay=noam_step
embedding_size_char_per_word=100
num_heads=4
filter_size_char=64
الآن دعنا نتعطش طبقة CRF:
>>> h2.update(use_crf=False)
Hyperparameters:
filter_size=128
optimizer_adam_beta2=0.98
learning_rate=0.2
learning_rate_warmup_steps=500
input_dropout=0.2
embedding_size_char=16
dropout=0.2
hidden_size=128
optimizer_adam_beta1=0.9
embedding_size_word=300
max_length=256
attention_dropout=0.2
relu_dropout=0.2
batch_size=100
num_hidden_layers=1
attention_value_channels=0
attention_key_channels=0
use_crf=False
embedding_size_tags=100
learning_rate_decay=noam_step
embedding_size_char_per_word=100
num_heads=4
filter_size_char=64
استخدمه لإعادة تدريب النموذج:
>>> train('ner-conll2003-nocrf', TransformerTagger, conll2003, hparams=h2)
جنبا إلى جنب مع النموذج يتم حفظها أيضًا ، لذلك ليست هناك حاجة لتمرير كائن HParams أثناء التقييم. لاحظ أيضًا أنه بشكل افتراضي لن يكتب أي أدلة نموذجية موجودة (سيتم إعادة تسمية بدلاً من ذلك). لتغيير هذا السلوك ، قم بتعيين متغير prefs:
>>> PREFS.overwrite_model_dir = True
يتم استمرار متغير PREFS تلقائيًا في prefs.json
مهمة الصلابة
تتوفر مجموعة بيانات CONLL 2000 لمهمة التقطيع. يتم تنزيل مجموعة البيانات تلقائيًا من المستودع العام حتى لا تحتاج إلى تنزيله يدويًا.
ابدأ مهمة الضبط:
python -i -m torchnlp.chunk
تدريب نموذج المحولات:
>>> train('chunk-conll2000', TransformerTagger, conll2000)
لا يوجد قسم التحقق من الصحة المقدم في المستودع وبالتالي يتم استخدام 10 ٪ من مجموعة التدريب للتحقق من الصحة.
تقييم النموذج في مجموعة الاختبار:
>>> evaluate('chunk-conll2000', TransformerTagger, conll2000, 'test')
يمكن استيراد وحدات transformer.Encoder و transformer.Decoder و CRF بشكل مستقل لأنها تعتمد فقط على pytorch:
from torchnlp.modules.transformer import Encoder
from torchnlp.modules.transformer import Decoder
from torchnlp.modules.crf import CRF
يرجى الرجوع إلى التعليقات في الكود المصدر لمزيد من التفاصيل حول الاستخدام