NeuralCoref هو امتداد خط أنابيب لـ Spacy 2.1+ الذي يشرح ويحل مجموعات Coreference باستخدام شبكة عصبية. NeuralCoref جاهز للإنتاج ، ومدمج في خط أنابيب NLP من Spacy وقابل للتمديد لمجموعات بيانات التدريب الجديدة.
للحصول على مقدمة موجزة عن قرار Coreference و NeuralCoref ، يرجى الرجوع إلى منشور المدونة لدينا. NeuralCoref مكتوب في Python/Cython ويأتي مع نموذج إحصائي تدريب قبل التدريب للغة الإنجليزية فقط .
يرافق NeuralCoref عميل التصور NeuralCoref-Viz ، وهي واجهة ويب مدعومة بخادم REST يمكن تجربته عبر الإنترنت. يتم إصدار NeuralCoref تحت رخصة معهد ماساتشوستس للتكنولوجيا.
الإصدار 4.0 خارج الآن! متوفر على PIP ومتوافق مع Spacy 2.1+.
هذه هي أسهل طريقة لتثبيت NeuralCoref.
pip install neuralcorefspacy.strings.StringStore size changed إذا كان لديك خطأ يذكر spacy.strings.StringStore size changed, may indicate binary incompatibility عند تحميل NeuralCoref باستخدام import neuralcoref ، فهذا يعني أنه سيتعين عليك تثبيت NeuralCoref من مصادر التوزيع بدلاً من العجلات للوصول إلى NeuralCoref للبناء ضد أحدث إصدار من Spacy لنظامك.
في هذه الحالة ، ما عليك سوى إعادة تثبيت NeuralCoref على النحو التالي:
pip uninstall neuralcoref
pip install neuralcoref --no-binary neuralcorefلتكون قادرًا على استخدام NeuralCoref ، ستحتاج أيضًا إلى الحصول على نموذج باللغة الإنجليزية لـ Spacy.
يمكنك استخدام أي نموذج إنجليزي يعمل بشكل جيد لتطبيقك ولكن لاحظ أن أداء NeuralCoref يعتمد بشدة على أداء نموذج Spacy وخاصة على عروض Tagger Model و Marser و NER. وبالتالي فإن نموذج Spacy English أكبر سيؤدي إلى تحسين جودة دقة Coreference أيضًا (انظر بعض التفاصيل في قسم الداخلية والموديل أدناه).
فيما يلي مثال على كيفية تثبيت SPACY ونموذج إنجليزي (صغير) لـ Spacy ، يمكن العثور على مزيد من المعلومات على موقع Spacy:
pip install -U spacy
python -m spacy download enيمكنك أيضًا تثبيت NeuralCoref من المصادر. ستحتاج إلى تثبيت التبعيات أولاً والتي تتضمن Cython و Spacy.
ها هي العملية:
venv .env
source .env/bin/activate
git clone https://github.com/huggingface/neuralcoref.git
cd neuralcoref
pip install -r requirements.txt
pip install -e . NeuralCoref مصنوع من لوحتين فرعيتين:
في المرة الأولى التي تستورد فيها NeuralCoref في Python ، ستقوم بتنزيل أوزان نموذج الشبكة العصبية في مجلد ذاكرة التخزين المؤقت.
يتم تعيين مجلد ذاكرة التخزين المؤقت بشكل افتراضي على ~/.neuralcoref_cache (انظر file_utils.py) ولكن يمكن الإفراط في الإفراط في هذا السلوك عن طريق ضبط البيئة المتغير NEURALCOREF_CACHE للإشارة إلى موقع آخر.
يمكن حذف مجلد ذاكرة التخزين المؤقت بأمان في أي وقت وسيقوم الوحدة بتنزيل النموذج مرة أخرى في المرة التالية التي يتم فيها تحميله.
يمكنك الحصول على مزيد من المعلومات حول الموقع ، وتنزيل عملية التخزين المؤقت للنموذج الداخلي عن طريق تنشيط وحدة logging Python قبل تحميل NeuralCoref على النحو التالي:
import logging ;
logging . basicConfig ( level = logging . INFO )
import neuralcoref
> >> INFO : neuralcoref : Getting model from https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz or cache
> >> INFO : neuralcoref . file_utils : https : // s3 . amazonaws . com / models . huggingface . co / neuralcoref / neuralcoref . tar . gz not found in cache , downloading to / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
100 % | █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 40155833 / 40155833 [ 00 : 06 < 00 : 00 , 6679263.76 B / s ]
> >> INFO : neuralcoref . file_utils : copying / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m to cache at / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
> >> INFO : neuralcoref . file_utils : creating metadata file for / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633
>> > INFO : neuralcoref . file_utils : removing temp file / var / folders / yx / cw8n_njx3js5jksyw_qlp8p00000gn / T / tmp_8y5_52m
>> > INFO : neuralcoref : extracting archive file / Users / thomaswolf / . neuralcoref_cache / f46bc05a4bfba2ae0d11ffd41c4777683fa78ed357dc04a23c67137abf675e14 . 7 d6f9a6fecf5cf09e74b65f85c7d6896b21decadb2554d486474f63b95ec4633 to dir / Users / thomaswolf / . neuralcoref_cache / neuralcoref فيما يلي الطريقة الموصى بها لتثبيت NeuralCoref وإضافتها إلى خط أنابيب Spacy من التعليقات التوضيحية:
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# Add neural coref to SpaCy's pipe
import neuralcoref
neuralcoref . add_to_pipe ( nlp )
# You're done. You can now use NeuralCoref as you usually manipulate a SpaCy document annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clustersتتمثل طريقة مكافئة لإضافة NeuralCoref إلى أنبوب نموذج Spacy في إنشاء فئة NeuralCoref أولاً ثم إضافتها يدويًا إلى أنبوب نموذج اللغة Spacy.
# Load your usual SpaCy model (one of SpaCy English models)
import spacy
nlp = spacy . load ( 'en' )
# load NeuralCoref and add it to the pipe of SpaCy's model
import neuralcoref
coref = neuralcoref . NeuralCoref ( nlp . vocab )
nlp . add_pipe ( coref , name = 'neuralcoref' )
# You're done. You can now use NeuralCoref the same way you usually manipulate a SpaCy document and it's annotations.
doc = nlp ( u'My sister has a dog. She loves him.' )
doc . _ . has_coref
doc . _ . coref_clusters ستقوم NeuralCoref بحل Coreferences وتوضيحها كسمات تمديد في Doc Spacy ، Span والكائنات Token تحت ._. قاموس.
فيما يلي قائمة التعليقات التوضيحية:
| يصف | يكتب | وصف |
|---|---|---|
doc._.has_coref | منطقية | هل تم حل أي مؤتمر أساسي في المستند |
doc._.coref_clusters | قائمة Cluster | جميع مجموعات Corefering يذكر في المستند |
doc._.coref_resolved | يونيكود | تمثل تمثيل Unicode للمستند حيث يتم استبدال كل ذكر أساسي بالذكر الرئيسي في المجموعة المرتبطة. |
doc._.coref_scores | قول القولان | عشرات القرار الأساسي بين الإشارات. |
span._.is_coref | منطقية | ما إذا كان المدى لديه ذكر أساسي واحد على الأقل |
span._.coref_cluster | Cluster | مجموعة من الإشارات التي تشير إلى الفترة |
span._.coref_scores | التقليل | عشرات قرار Coreference of & span مع الإشارات الأخرى (إن أمكن). |
token._.in_coref | منطقية | ما إذا كان الرمز مميزًا داخل ذكر واحد على الأقل |
token._.coref_clusters | قائمة Cluster | جميع مجموعات الإشارات الأساسية التي تحتوي على الرمز المميز |
Cluster هي مجموعة من الإشارات الأساسية التي لها 3 سمات وبعض الطرق لتبسيط التنقل داخل الكتلة:
| السمة أو الطريقة | اكتب / نوع الإرجاع | وصف |
|---|---|---|
i | int | فهرس الكتلة في المستند |
main | Span | امتداد أكثر الذكر تمثيلا في الكتلة |
mentions | قائمة Span | قائمة بجميع الإشارات في الكتلة |
__getitem__ | Span العودة | الوصول إلى ذكر في المجموعة |
__iter__ | عائدات Span | تكرار أكثر من الإشارات في الكتلة |
__len__ | إرجاع int | عدد الإشارات في الكتلة |
يمكنك أيضًا التنقل بسهولة في سلاسل مجموعة Coreference وعرض المجموعات والإشارات.
فيما يلي بعض الأمثلة ، جربها لاختبارها بنفسك.
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'My sister has a dog. She loves him' )
doc . _ . coref_clusters
doc . _ . coref_clusters [ 1 ]. mentions
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]
doc . _ . coref_clusters [ 1 ]. mentions [ - 1 ]. _ . coref_cluster . main
token = doc [ - 1 ]
token . _ . in_coref
token . _ . coref_clusters
span = doc [ - 1 :]
span . _ . is_coref
span . _ . coref_cluster . main
span . _ . coref_cluster . main . _ . coref_cluster هام : الإشارات NeuralCoref هي كائنات Spacy Span ، مما يعني أنه يمكنك الوصول إلى جميع سمات Span المعتادة مثل span.start (فهرس الرمز المميز الأول للمتابعة في المستند) ، span.end (فهرس الرمز المميز الأول بعد الفترة في المستند) ، وما إلى ذلك ...
على سبيل المثال: doc._.coref_clusters[1].mentions[-1].start سوف يمنحك بدء التشغيل فهرس الرمز الأول للذكر الأخير لمجموعة Coreference الثانية في المستند.
يمكنك تمرير العديد من المعلمات الإضافية إلى neuralcoref.add_to_pipe أو NeuralCoref() للتحكم في سلوك NeuralCoref.
فيما يلي القائمة الكاملة لهذه المعلمات وأوصافها:
| المعلمة | يكتب | وصف |
|---|---|---|
greedyness | يطفو | عدد بين 0 و 1 يحدد مدى جشع النموذج حول اتخاذ قرارات المؤتمر الأساسي (يعني المزيد من الجشع روابط أكثر جوهريًا). القيمة الافتراضية هي 0.5. |
max_dist | int | كم عدد الإشارات مرة أخرى للبحث عند النظر في السوابق المحتملة للذكر الحالي. سيؤدي تقليل القيمة إلى تشغيل النظام بشكل أسرع ولكن أقل دقة. القيمة الافتراضية هي 50. |
max_dist_match | int | سوف يفكر النظام في ربط الذكر الحالي بأحد الأماكن السابقة من max_dist بعيدًا إذا شاركوا اسمًا أو اسمًا مناسبًا. في هذه الحالة ، يبدو max_dist_match بعيدًا بدلاً من ذلك. القيمة الافتراضية هي 500. |
blacklist | منطقية | إذا قام النظام بحل Coreferences للضمائر في القائمة التالية: ["i", "me", "my", "you", "your"] . القيمة الافتراضية صحيحة (تم حل Coreference). |
store_scores | منطقية | إذا قام النظام بتخزين الدرجات لـ Coreferences في التعليقات التوضيحية. القيمة الافتراضية صحيحة. |
conv_dict | DICT (STR ، LIST (STR)) | قاموس التحويل الذي يمكنك استخدامه لاستبدال تضمينات الكلمات النادرة (المفاتيح) بمتوسط تضمينات قائمة الكلمات الشائعة (القيم). على سبيل المثال: conv_dict={"Angela": ["woman", "girl"]} سوف يساعد في حل Coreferences لـ Angela باستخدام التضمين woman girl الأكثر شيوعًا بدلاً من تضمين Angela . هذا يعمل حاليًا فقط للكلمات الفردية (وليس للمجموعات الكلمات). |
import spacy
import neuralcoref
# Let's load a SpaCy model
nlp = spacy . load ( 'en' )
# First way we can control a parameter
neuralcoref . add_to_pipe ( nlp , greedyness = 0.75 )
# Another way we can control a parameter
nlp . remove_pipe ( "neuralcoref" ) # This remove the current neuralcoref instance from SpaCy pipe
coref = neuralcoref . NeuralCoref ( nlp . vocab , greedyness = 0.75 )
nlp . add_pipe ( coref , name = 'neuralcoref' ) فيما يلي مثال على كيفية استخدام المعلمة conv_dict للمساعدة في حل Coreferences لكلمة نادرة مثل الاسم:
import spacy
import neuralcoref
nlp = spacy . load ( 'en' )
# Let's try before using the conversion dictionary:
neuralcoref . add_to_pipe ( nlp )
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
doc . _ . coref_resolved
# >>> [Deepika: [Deepika, She, him, The movie star]]
# >>> 'Deepika has a dog. Deepika loves Deepika. Deepika has always been fond of animals'
# >>> Not very good...
# Here are three ways we can add the conversion dictionary
nlp . remove_pipe ( "neuralcoref" )
neuralcoref . add_to_pipe ( nlp , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
# or
nlp . remove_pipe ( "neuralcoref" )
coref = neuralcoref . NeuralCoref ( nlp . vocab , conv_dict = { 'Deepika' : [ 'woman' , 'actress' ]})
nlp . add_pipe ( coref , name = 'neuralcoref' )
# or after NeuralCoref is already in SpaCy's pipe, by modifying NeuralCoref in the pipeline
nlp . get_pipe ( 'neuralcoref' ). set_conv_dict ({ 'Deepika' : [ 'woman' , 'actress' ]})
# Let's try agin with the conversion dictionary:
doc = nlp ( u'Deepika has a dog. She loves him. The movie star has always been fond of animals' )
doc . _ . coref_clusters
# >>> [Deepika: [Deepika, She, The movie star], a dog: [a dog, him]]
# >>> 'Deepika has a dog. Deepika loves a dog. Deepika has always been fond of animals'
# >>> A lot better! يتم توفير مثال بسيط على البرنامج النصي الخادم لدمج NeuralCoref في API REST كمثال في examples/server.py .
لاستخدامه ، تحتاج إلى تثبيت Falcon أولاً:
pip install falconيمكنك بعد ذلك بدء الخادم على النحو التالي:
cd examples
python ./server.pyوالاستعلام عن الخادم مثل هذا:
curl --data-urlencode " text=My sister has a dog. She loves him. " -G localhost:8000هناك العديد من الطرق الأخرى التي يمكنك من خلالها إدارة ونشر NeuralCoref. يمكن العثور على بعض الأمثلة في Spacy Universe.
إذا كنت ترغب في إعادة تدريب النموذج أو تدريبه على لغة أخرى ، راجع تعليمات التدريب الخاصة بنا وكذلك منشور المدونة لدينا