للتعرف على استخراج العلاقات (Relationship Extraction) فكر في المثال التالي :
تخيل أننا نعمل في شركة تستخرج أطنانًا من المقالات الإخبارية لإشتقاقها، على سبيل المثال ، للحصول على الرؤى مالية. لكي نتمكن من إجراء مثل هذا التحليل على آلاف النصوص الإخبارية كل يوم ، سنحتاج إلى قاعدة معرفية محدثة باستمرار تربط بين مختلف الأشخاص والمؤسسات والأحداث بناءً على محتوى الأخبار.
يمكن أن تكون حالة استخدام قاعدة المعرفة هذه هي تحليل أسواق الأسهم بناءً على المستندات الصادرة عن الشركات والمقالات الإخبارية المتعلقة بها. كيف سنبدأ في بناء مثل هذه الأداة؟ إن مهام إستخراج المعلومات التي رأيناها حتى الآن – استخراج العبارات الرئيسية (keyword or keyphrase extraction ) و التعرف على الكيانات المسماة (named entity recognition) و ربط الكيان المسمى (named entity linking) – كلها مفيدة إلى حد ما في المساعدة في تحديد الكيانات والأحداث والعبارات الرئيسية وما إلى ذلك. ولكن كيف ننتقل من هناك إلى الخطوة التالية “وصلهم” بعلاقة ما؟ ما هي العلاقات بالضبط؟ كيف سنستخرجها؟
لنعد إلى الشكل التالي ، الذي يعرض لقطة شاشة لمقالة نيويورك تايمز. إحدى العلاقات التي يمكن استخلاصها هي: (لوكا مايستري ، المدير المالي لشركة Apple). هنا ، نربط لوكا مايستري بشركة Apple بعلاقة المدير المالي.
استخراج العلاقات (Relationship Extraction) هو مهمة إستخراج المعلومات التي تتعامل مع استخراج الكيانات والعلاقات بينها من المستندات النصية. إنها خطوة مهمة في بناء قاعدة معرفية ، كما أنها مفيدة في تحسين البحث وتطوير أنظمة الإجابة عن الأسئلة. يوضح الشكل أدنها مثالاً على نظام إستخراح العلاقات بواسطة Rosette Text Analytics للمقتطف النصي التالي :
Satya Narayana Nadella is an Indian-American business executive. He currently serves as the Chief Executive Officer (CEO) of Microsoft, succeeding Steve Ballmer in 2014. Before becoming chief executive, he was Executive Vice President of Microsoft’s Cloud and Enterprise Group, responsible for building and running the company’s computing platforms.
يوضح هذا الإخراج أن Narayana Nadella هو شخص مرتبط بشركة Microsoft كموظف ، ومرتبط بالهند وأمريكا كمواطن ، وما إلى ذلك. كيف يمكن للمرء أن يستمر في استخراج مثل هذه العلاقات من جزء من النص؟ من الواضح أنها أكثر صعوبة من مهام إستخراج المعلومات الأخرى التي رأيناها في المقالات السابقة وتتطلب معرفة أعمق بمعالجة اللغة.
بصرف النظر عن تحديد الكيانات الموجودة وإزالة الغموض عنها ، نحتاج إلى نمذجة عملية استخراج العلاقات بينها من خلال النظر في الكلمات التي تربط الكيانات في جملة ، وشعورها بالاستخدام ، وما إلى ذلك. علاوة على ذلك ، فإن السؤال المهم الذي يحتاج إلى حل هو: ما الذي يشكل “العلاقة”؟ يمكن أن تكون العلاقات خاصة بمجال معين.
على سبيل المثال ، في المجال الطبي ، يمكن أن تشمل العلاقات نوع الإصابة ، وموقع الإصابة ، وسبب الإصابة ، وعلاج الإصابة ، وما إلى ذلك. في المجال المالي ، يمكن أن تعني العلاقات شيئًا مختلفًا تمامًا. بعض العلاقات العامة بين الأشخاص ، والمواقع ، والمنظمات هي: تقع في ، هي جزء من ، مؤسس ، ولي أمر ، وما إلى ذلك. كيف يمكننا استخراجها؟
التعامل مع إستخراج العلاقات
في معالجة اللغة الطبيعية ، يعد إستخرج العلاقات (Relationship Extraction) موضوعًا مدروسًا جيدًا – بدءًا من الأنماط المكتوبة بخط اليد إلى أشكال مختلفة من التعلم الخاضع للإشراف وشبه الإشراف وغير الخاضع للإشراف – تم استكشاف طرق مختلفة (ولا تزال قيد الاستخدام) لبناء أنظمة إستخراج العلاقات.
تتكون الأنماط المبنية يدويًا من التعبيرات العادية التي تهدف إلى التقاط علاقات محددة. على سبيل المثال ، يمكن لنمط مثل “PERPER, [something] of ORG ” أن يشير إلى نوع من العلاقة “جزء من” بين ذلك الشخص والمؤسسة. هذه الأنماط تتميز بالدقة العالية ، ولكنها غالبًا ما تكون أقل تغطية ، وقد يكون من الصعب إنشاء مثل هذه الأنماط لتغطية جميع العلاقات الممكنة داخل المجال.
ومن ثم ، غالبًا ما يتم التعامل مع إستخرج العلاقات على أنه مشكلة تصنيف خاضعة للإشراف. تحتوي مجموعات البيانات المستخدمة لتدريب أنظمة إستخرج العلاقات على مجموعة من العلاقات المحددة مسبقًا ، على غرار مجموعات بيانات التصنيف. يتم النمذجة هنا كمشكلة تصنيف من خطوتين:
- ما إذا كان هناك كيانان في النص مرتبطان (التصنيف الثنائي).
- إذا كانت مرتبطة ، ما هي العلاقة بينهما (تصنيف متعدد الطبقات)؟
يتم التعامل معها على أنها مشكلة تصنيف نص عادي ، باستخدام سمات مصنوعة يدويًا ، و سمات سياقية مثل التعرف على الكيانات المسماة (named entity recognition) (على سبيل المثال ، الكلمات حول كيان معين) ، والبنية النحوية (على سبيل المثال ، نمط مثل NP VP NP ، حيث NP هي عبارة اسمية و VP هي عبارة فعلية) ، وهكذا. عادةً ما تستخدم النماذج العصبية تمثيلات تضمين مختلف متبوعة ببنية مثل الشبكات العصبية المتكررة
عادةً ما تكون كل من المناهج الخاضعة للإشراف و المناهج المستندة إلى الأنماط خاصة بالمجال ، ويمكن أن يكون الحصول على كميات كبيرة من البيانات المشروحة في كل مرة نبدأ فيها في مجال جديد أمرًا صعبًا ومكلفًا. يمكن استخدام bootstrapping في مثل هذه السيناريوهات ، بدءًا من مجموعة صغيرة من أنماط البذور والتعميم من خلال تعلم أنماط جديدة بناءً على الجمل المستخرجة باستخدام أنماط البذور هذه.
يُطلق على امتداد نهج الإشراف الضعيف هذا الإشراف عن بُعد ( distant supervision). في هذا ، بدلاً من استخدام مجموعة صغيرة من أنماط البذور ، تُستخدم قواعد البيانات الكبيرة مثل Wikipedia و Freebase وما إلى ذلك أولاً لجمع آلاف الأمثلة للعديد من العلاقات (على سبيل المثال ، استخدام مربعات معلومات Wikipedia) ، وبالتالي إنشاء مجموعة بيانات كبيرة من العلاقات . يمكن بعد ذلك اتباع نهج استخراج العلاقة المنتظم تحت الإشراف.
لكن حتى هذا لا يعمل إلا عند وجود قواعد البيانات الكبيرة هذه. يوضح هذا المقال كيفية استخدام Snorkel ، لتعلم علاقات محددة في حالة عدم وجود أي بيانات تدريبية.
في السيناريوهات التي لا يمكننا فيها شراء بيانات التدريب للنهج الخاضعة للإشراف ، يمكننا اللجوء إلى الأساليب غير الخاضعة للإشراف. تهدف تعلم العلاقات غير الخاضعة للإشراف (المعروفة أيضًا باسم ” إستخراج المعلومات المفتوحة”) إلى استخراج العلاقات من الويب دون الاعتماد على أي بيانات تدريبية أو أي قائمة علاقات.
تكون العلاقات المستخرجة في شكل <فعل ، وسيطة 1 ، وسيطة 2> مجموعات. في بعض الأحيان ، قد يكون للفعل المزيد من الحجج. يوضح الشكل أدناه مثالاً لمخرجات مثل هذا النظام المفتوح لإستخراج المعلومات بواسطة AllenNLP .
في هذا المثال ، نرى العلاقة كفعل وحججها الثلاث <نشر ، ألبرت أينشتاين ، نظرية النسبية ، في عام 1915>. يمكننا أيضًا استخلاص مجموعات العلاقات <اشر ، ألبرت أينشتاين ، نظرية النسبية> ، <انشور ، ألبرت أينشتاين ، في عام 1915> ، و <نشر ، نظرية النسبية ، 1915>.
من الواضح ، في مثل هذا النظام ، أننا نرى على الأقل عددًا (عادةً ، أكثر) من هذه الصفوف / الرباعية مثل عدد الأفعال. في حين أن هذه ميزة بمعنى أنها يمكن أن تستخرج كل هذه العلاقات ،
فإن التحدي مع هذا النهج يكمن في تعيين النسخ المستخرجة لبعض مجموعة العلاقات الموحدة (على سبيل المثال ، fatherOf ، motherOf ، inventorOf، إلخ) من قاعدة بيانات. ثم لاستخراج علاقات محددة من هذه المعلومات (إذا احتجنا إلى ذلك) ، سيتعين علينا وضع إجراءاتنا الخاصة التي تجمع بين مخرجات NER / NEL ودقة المرجع وفتح إستخراج المعلومات.
إستخراج العلاقات مع Watson API
إستخراج العلاقات مشكلة صعبة ، وسيكون تطوير أنظمة استخراج العلاقات الخاصة بنا من الصفر أمرًا صعبًا ويستغرق وقتًا طويلاً. أحد الحلول الشائعة الاستخدام في مشاريع معالجة اللغة الطبيعية في الصناعة هو الاعتماد على خدمة فهم اللغة الطبيعية التي تقدمها شركة IBM Watson .
الحصول على مفتاح Watson API
أولا : من الصفحة الرئيسية للخدمات نختار إنشاء خدمة .
ثانيا: نقوم بالبحث عن خدمة فهم اللغة الطبيعية (Natural Language Understanding) و ننشى الخدمة
ثالثاً : من صفحة الخدمة نختار Service credantials و هناك نجد المفتاح و رابط الخدمة
يوضح مقتطف الكود التالي كيفية استخراج العلاقات بين الكيانات باستخدام IBM Watson باستخدام مقتطف نصي من صفحة Wikipedia :
# تنصيب واتسون #! pip install --upgrade "ibm-watson>=5.0.0" # https://cloud.ibm.com/apidocs/natural-language-understanding?code=python#relations # إسترداد الحزم المطلوبة import json from ibm_watson import NaturalLanguageUnderstandingV1 from ibm_watson.natural_language_understanding_v1 import Features, RelationsOptions from ibm_cloud_sdk_core.authenticators import IAMAuthenticator authenticator = IAMAuthenticator("KEY") natural_language_understanding = NaturalLanguageUnderstandingV1( version = '2020-08-01', authenticator=authenticator) natural_language_understanding.set_service_url("URL") mytext = "Saudi Arabia's Crown Prince Mohammed bin Salman, and Chairman of the Board of Directors of NEOM, announced the launch of ""THE LINE"" in the city of NEOM, a new model for the future of urban societies aimed at ensuring balance with nature." response = natural_language_understanding.analyze( text=mytext, features = Features(relations=RelationsOptions())).get_result() print(json.dumps(response, indent=2)) for item in response['relations']: print(item['type']) for subitem in item['arguments']: print(subitem['entities'])
يوضح الشكل أدناه ناتج هذا الكود من حيث العلاقات المستخرجة. يتم استخراج العلاقات باستخدام نموذج خاضع للإشراف وتحتوي على قائمة محددة مسبقًا من العلاقات . وبالتالي ، لن يتم استخراج أي شيء خارج قائمة العلاقات هذه.
awardedTo [{'type': 'EntertainmentAward', 'text': 'Crown Prince'}] [{'type': 'Person', 'text': 'Mohammed'}] employedBy [{'type': 'Person', 'text': 'Salman'}] [{'type': 'Organization', 'text': 'Board of Directors'}] agentOf [{'type': 'Person', 'text': 'Salman'}] [{'type': 'EventCommunication', 'text': 'announced'}] partOf [{'type': 'Organization', 'text': 'Board of Directors'}] [{'type': 'Organization', 'text': 'NEOM'}]
يمكن بعد ذلك استخدام معلومات الإخراج هذه ، التي توضح العلاقات بين الكيانات المختلفة ، لبناء قاعدة معرفية لبيانات المؤسسة. كما نرى ، فإن إستخراج العلاقات ليست كاملة تم حل المشكلة حتى الآن ، وأداء النهج يعتمد أيضًا على المجال. ما نجح في مقال في ويكيبيديا قد لا يصلح لمقالة إخبارية عامة أو ، على سبيل المثال ، نص على وسائل التواصل الاجتماعي. هذا المستودع يلخص أخر ما توصلت له الأبحاث في إستخراج العلاقات .
ختاماً
أتمنى أن يكون هذا قد قدم نظرة عامة على أين يكون إستخراج العلاقات مفيدة وكيفية التعامل مع المشكلة إذا واجهتها في مكان عملك.
إضافة تعليق