مقدمة لتلخيص النصوص – Text Summarization

227

هذا المقال يعد مقدمة لتلخيص النصوص وسنتعرض لنظرة عامة للطرق المستخدمة.

سنقوم بمقارنة طريقتين أساسيتين للتلخيص: extractive و abstractive

لماذا نحتاج تلخيص النصوص؟

مع زيادة كمية المقالات والنصوص التي تصدر يومياً زادت الحاجة للتلخيص، لنتمكن من استيعاب هذا الكم من المعلومات وتقييم المهم وغير المهم لنا.

الطريقة الأولى للتلخيص هي الـ extractive وهي تعتمد على استخراج كلمات وجمل من النص الأصلي لبناء التلخيص.

أما الطريقة الثانية فهي الـ abstractive وتهدف لتعلم تمثيل للغة تستطيع منه توليد ملخص للنص وعادة يكون فيه إعادة صياغ النص الأصلي.

طريقة الـ extractive

لنعرض بعض مكتبات Python التي تدعم التلخيص:

  • Gensim
    يدعم خوارزمية TextRank وهي طريقة unsupervisedتعامل النصوص في صورة graphs، لقراءة المزيد عنها: https://rare-technologies.com/text-summarization-with-gensim/
    هي مبنية على خوارزمية PageRank التي تستخدمها جوجل لترتيب نتائج البحث، خطواتها:

    • معالجة النص وإزالة الكلمات الشائعة
    • تكوين graph بحيث تكون الجمل هي الرؤوس vertices
    • نقوم بتوصيل كل جملتين برابط قيمته هي مقدار تشابه الجملتين
    • نقوم بحساب PageRank على هذا الـ graph
    • نأخذ الجمل الأعلى قيمة في PageRank
  • PyTeaser
    تقوم بتطبيق مشروع TextTeaser في Python، وهي خوارزمية heuristic تعتمد على استخراج features وتعطي كل منها وزن لتحديد أي الجمل ستكون في الملخص. من هذه الـ features:

    • عدد الكلمات المشتركة بين العنوان والجملة
    • نسبة طول الجملة إلى طول مثالي تحدده TextTeaser بـ 20
    • ترتيب الجملة في النص
    • عدد ظهور الكلمات في النص لكل كلمة في الجملة، مثل الـ TF-IDF
  • PyTextRank
    وهو تطبيق آخر لخوارزمية TextRank، يستخدم lemmatization بدلاً من ال stemming، ويستخدم Part-of-Speech و Named-Entity-Resolution ليستخرج عبارات مهمة ويبني الملخص باستخدام هذه العبارات. ينقسم إلى أربع مراحل:

    • نقوم بالـ lemmatization والـ Part-of-Speech Tagging لكل جملة في النص
    • نستخرج العبارات المهمة وعدد تكرارها (نسبة مئوية)
    • نحسب وزن لكل جملة بدلالة تشابه الجملة لكل من العبارات المهمة
    • نلخص النص بناء على أهم الجمل
  • خوارزمية Luhn
    طورت في 1958، تستخرج الكلمات “المهمة”، التي تتكرر في النص، والمسافة الخطية بين هذه الكلمات بسبب الكلمات “غير المهمة”
  • LexRank
    هي خوارزمية تعتمد على الـ graphs مثل TextRank. تستخدم LexRank حساب الـ Inverse-Document-Frequency والـ Cosine Similarity لحساب التشابه بين الجمل. ثم تقوم بحساب PageRank. تضيف أيضاً معالجة أخيرة في اختيار الجمل في الملخص بحيث يقلل من التشابه بينها. لقراءة المزيد: https://en.wikipedia.org/wiki/Automatic_summarization#TextRank_and_LexRank
  • استخدام Latent Semantic Analysis (LSA) للتلخيص
    تعتمد فكرة الـ LSA على اسقاط الداتا لأبعاد أقل بدون خسارة الكثير من المعلومات. لقراءة شرح الـ LSA في مقالنا السابق هنا:

كيف نقيم جودة التلخيص؟

  • مقياس ROUGE-N
    تدعم مكتبة Sumy كلاً من LexRank، Luhn وLSA. نقوم بالمقارنة بينها بـ ROUGE-1
    فكرة الـ ROUGE-N هي مقارنة مجموعة الكلمات المتتالية N-grams بين نتيجة النموذج model output والتلخيص البشري ground truth.
    تحديداً هو النسبة بين عدد الـ N-grams الموجودة في النموذج المطابقة للتلخيص البشري إلى عدد كل الـ N-grams في التلخيص البشري
    بطريقة أخرى هو مثل حساب ال recall لل N-grams التي استطاع النموذج استرجاعها
    عادة يستخدم فقط ROUGE-1 و ROUGE-2 (أحياناً ROUGE-3 إذا كان الملخص طويلاً). الفكرة أنه كلما زاد الـ N، نزيد طول العبارات التي تحتاج أن تتطابق.
    كمثال: “موز تفاح” و “تفاح موز”، إذا استخدمنا ROUGE-1 سيجد كل لكل كلمة مقابل فتعد صحيحة، أما إذا استخدمنا ROUGE-2 سنجد أن كل كلمتين مختلفتين فتعتبر خطأ وتؤدي إلى نتيجة أقل.
  • مقياس BLEU مع دقة الـ N-gram المعدلة
    الفكرة وراء دقة الـ N-gram أنه العبارة/الكلمة ننتهي منها بمجرد وجودها في الملخص الناتج من النموذج. أي أنه تحسب الكلمة مرة واحدة، وهذا يحل مشكلة التوليد المفرط للكلمات في الملخص.
    دقة الـ N-gram المعدلة تحسب بإيجاد أقصى عدد تظهر فيه كلمة/عبارة في أي مرجع واحد. هذا العدد يصبح العدد الأقصى لهذه الكلمة/العبارة. ثم نقوم بقطع أعداد الكلمات/العبارات الخارجة من النموذج عند الأعداد القصوى التي حسبناها، ثم تجمع الأعداد المقصوصة ونقسمها على العدد الكلي للكلمات/العبارات الخارجة من النموذج.

الخلاصة: كلما زادت قيمة مقياس BLEU أو مقياس ROUGE كلما كانت جودة الملخص أفضل.

الداتا

نقوم بالمقارنة باستخدام Opinosis Dataset التي تحتوي على 51 مقال. كل مقال عن خاصية في منتج مثل بطارية التليفون، وهي مجموعة من المراجعات من زبائن اشتروا هذا المنتج. لكل مقال 5 ملخصات مكتوبة يدوياً نعتبرها الـ ground truth. عادة تختلف ال 5 ملخصات لكن يمكن أن تكون متطابقة في بعض الأحيان.

http://kavita-ganesan.com/opinosis-opinion-dataset

معاملات النماذج

لنموذج Gensim TextRank، عدد الكلمات في الملخص word_count، نعده بـ 75

لنماذج Sumy-LSA و Sumy-Lex_Rank عدد الجمل في الملخص sentence_count، نعده بـ 2

النتائج

المتوسط والانحراف المعياري لـ ROUGE-1 و BLEU في الجدول التالي

مقياس ROUGE هو أقصى قيمة للـ 5 ملخصات مع الـ ground truth

لمقياس BLEU نستخدم bleu_score من مكتبة NLTK التي تجمع الـ unigram،  bigramو trigram بأوزان 0.4، 0.3 و 0.2

تقييم نوعي

تعد LexRank هي الفائزة لحصولها على أعلى قيم ROUGE و BLEU.

لكن ملخصاتها أقل في قيمة المعلومات مقارنة بـ TextRank و Luhn.

إضافة إلى ذلك فـ LexRank لا تتفوق دائما على TextRank في الـ ROUGE. تؤدي TextRank أحسن بكثير من LexRank في DUC 2002 Dataset. لذا الخيار بينهما يعتمد على الداتا، فجرب الإثنين.

http://ltrc.iiit.ac.in/icon/2013/proceedings/File49-paper108.PDF

ملحوظة أخرى أن TextRank من مكتبة Gensim يؤدي أفضل من PyTextRAnk بسبب استخدام دالة BM25 بدلا من Cosine IDF.

ملحوظة أخيرة في الجدول أن Luhn تحظى بأقل BLEU. هذا لأنها تستخرج ملخصات أطول وبالتالي تغطي المزيد من المراجعات للمنتج. للأسف لم نستطع جعلها تصدر ملخصات أقصر لأن مكتبة Sumy لا تدعم معامل لتحديد عدد الكلمات.

طريقة الـ abstractive – طريقة باستخدام neural networks

تعد Textsum هي أحدث تطبيق للتلخيص الـ abstractive من جوجل. يمكنها إصدار عنوان للمقال من أول جملتين.

أظهرت نتائج جيدة بعد التعلم على 4 ملايين زوج من داتا Gigaword في صورة (أول جملتين، العنوان). أثناء التعلم تقوم بتحسين احتمالية الملخص بدلالة أول جملتين من المقال. كلا من الـ encoder والـ language model يقومان بالتعلم في نفس الوقت. لتوليد الملخص تبحث في مجال كل الملخصات الممكنة حتى تجد تسلسل الكلمات الأكثر احتمالية كملخص بدلالة المقال المعطى.

هذا مثال من الداتا والملخص الصادر من النموذج:

نلاحظ أن كلمة head لا تظهر في النص الأصلي. النموذج قام بتوليده، وهذا لا يحدث أبدا في طرق الـ extractive.

قمنا بتشغيل النموذج لضبك بعض معاملاته. للأسف لم نتمكن من تعليم النموذج أكثر من 10% من الوقت المطلوب وحصلنا على ملخصات سيئة جدا. لم نستطع استخدام BLEU أو ROUGE لأن الملخصات المولدة لم تكن لها أي معنى.

لنقارن التعديلات المختلفة اضطررنا لاستخدام قياس رياضي running average loss أثناء التعلم.

كم نحتاج حتى يتعلم النموذج بشكل كافي؟

ينصح المؤلفون للنموذج بالتعلم للأكثر من مليون خطوة لمحاكاة نتائجهم. هذا يعني أسابيع من التعلم على الـ GPU. جوجل أنفسهم استخدموا 10 أجهزة كل منها به 4 GPU لمدة أسبوع. هذا يعادل 7000 ساعة على GPU أو 30 ألف دولار لتشغيلها على AWS.

أيضاً استخدم المؤلفون داتا Gigaword التي تحتاج رخصة تكلفتها 3000 دولار. قمنا باستخدام داتا أصغر ولكن مجانية CNN و DailyMail. هذه ال 320 ألف مقال تم تحويلهم لشكل مناسب لـ Textsum.

مبدئيا حاولنا التعلم على GPU الـ NVIDIA GTX 950M في جهاز لابتوب لكن لم يبدو أنه يتعلم بعد 48 ساعة، فقمنا باستخدام AWS بـ GPU K520.

ملاحظات

بعض الأمثلة للملخصات السيئة جدا المولدة بالنموذج الذي لم يتعلم بما يكفي

بعض الكلمات تظهر في الملخصات بغض النظر عن وجود هذه الكلمات في المقالات أو ملخصاتها، مثل Manchester united و Manchester city تتكر كثيراً.

ملحوظة أخرى أن في البداية (global_steps < 50000) النموذج لم يكن يولد جمل صحيحة نحويا، لكن كلما زادت فترة التعلم بدأت الجمل تكون أكثر منطقية وصحيحة نحويا. لكن الملخصات ظلت لا علاقة لها بالمقال الأصلي أو الملخصات المكتوبة يدويا.

كان هناك تحسن ملحوظ في الـ loss وجودة الملخصات بعد فقط 50 ألف خطوة تعلم. بعد التعلم 100 ألف خطوة لمدة يوم، لاحظنا الجودة (باستخدام تقييمنا الشخصي للجودة) تتحسن قليلا. هذا شيء متوقع نظرا لقلة وقت التعلم. يدعي المؤلفون أنه يمكن تحسين النتائج كثيرا إذا أخذ النموذج الوقت والموارد المناسبة.

أن “نلخص”

لطرق الـ extractive، نرى من المقاييس أن LexRank قد تؤدي أحسن بقليل من TextRank ولكن ليس في كل الأحوال وقد تعطي TextRank ملخصات ذات جودة أعلى. نعتقد أن الأمر يختلف أيضا حسب الداتا. ممارسة جيدة أن نجرب النماذج المختلفة ونرى بأنفسنا أيها أفضل في هذه الحالة.

نظرا لقلة موارد الـ GPU وضخامة نموذج Textsum (الذي يعد بطريقة الـ abstractive) لم نستطع تحديد جودته مقارنة بالـ extractive.

المقال الأصلي:

https://rare-technologies.com/text-summarization-in-python-extractive-vs-abstractive-techniques-revisited/

 

 

تعليقات