تحليل التردد للنص الروسي وسحابة الكلمات في بايثون

يعد تحليل التردد إحدى الطرق البسيطة نسبيًا لمعالجة نصوص اللغة الطبيعية (NLP). والنتيجة هي قائمة بالكلمات الأكثر شيوعًا في النص. يوفر تحليل التردد أيضًا نظرة ثاقبة للموضوع والمفاهيم الأساسية للنص. من الملائم تصور نتائجه في شكل "سحابة كلمات". يحتوي هذا المخطط على كلمات يعكس حجم خطها شعبيتها في النص.



من المريح معالجة النص بلغة طبيعية باستخدام Python ، نظرًا لأنها أداة برمجة عالية المستوى إلى حد ما ، ولديها بنية تحتية متطورة ، وقد أثبتت نفسها في مجال تحليل البيانات والتعلم الآلي. تم تطوير العديد من المكتبات والأطر من قبل المجتمع لحل مشاكل البرمجة اللغوية العصبية في بايثون. في عملنا ، سوف نستخدم أداة ويب تفاعلية لتطوير نصوص Python Script Jupyter Notebook ، ومكتبة NLTK لتحليل النص ومكتبة wordcloud لبناء سحابة الكلمات.



تحتوي الشبكة على كمية كبيرة إلى حد ما من المواد حول موضوع تحليل النص ، لكن العديد من المقالات (بما في ذلك المقالات باللغة الروسية) تقترح تحليل النص باللغة الإنجليزية. يحتوي تحليل النص الروسي على بعض تفاصيل استخدام أدوات البرمجة اللغوية العصبية. كمثال ، لنأخذ في الاعتبار التحليل التكراري لنص قصة "عاصفة ثلجية" بقلم أ. بوشكين.



يمكن تقسيم تحليل التردد تقريبًا إلى عدة مراحل:



  1. تحميل وتصفح البيانات
  2. تنظيف النص والمعالجة المسبقة
  3. إزالة كلمات التوقف
  4. ترجمة الكلمات إلى شكل أساسي
  5. حساب إحصائيات تواجد الكلمات في النص
  6. التصور السحابي لشعبية الكلمة


البرنامج النصي متاح في github.com/Metafiz/nlp-course-20/blob/master/frequency-analisys-of-text.ipynb ، المصدر - github.com/Metafiz/nlp-course-20/blob/master/pushkin -metel.txt



تحميل البيانات



نفتح الملف باستخدام الوظيفة المدمجة المفتوحة ، ونحدد وضع القراءة والتشفير. نقرأ محتويات الملف بالكامل ، ونتيجة لذلك نحصل على نص السلسلة:



f = open('pushkin-metel.txt', "r", encoding="utf-8")
text = f.read()


يمكن الحصول على طول النص - عدد الأحرف - باستخدام وظيفة len القياسية:



len(text)


يمكن تمثيل سلسلة في Python كقائمة من الأحرف ، لذلك من الممكن أيضًا الوصول إلى الفهرس وعمليات التقطيع للعمل مع السلاسل. على سبيل المثال ، لعرض أول 300 حرف من النص ، ما عليك سوى تشغيل الأمر:



text[:300]


المعالجة المسبقة (المعالجة المسبقة) للنص



لإجراء تحليل التردد وتحديد موضوع النص ، يوصى بمسح النص من علامات الترقيم والأحرف والأرقام الزائدة. يمكنك القيام بذلك بعدة طرق - باستخدام وظائف السلسلة المضمنة أو استخدام التعبيرات العادية أو استخدام معالجة القائمة أو بطريقة أخرى.



أولاً ، لنحول الأحرف إلى حالة واحدة ، على سبيل المثال ، أقل:



text = text.lower()


نستخدم مجموعة أحرف الترقيم القياسية من وحدة السلسلة:



import string
print(string.punctuation)


string.punctuation هو سلسلة نصية. يمكن توسيع مجموعة الأحرف الخاصة المراد إزالتها من النص. من الضروري تحليل النص المصدر وتحديد الأحرف التي يجب إزالتها. دعنا نضيف فواصل الأسطر وعلامات التبويب والرموز الأخرى الموجودة في نص المصدر إلى علامات الترقيم (على سبيل المثال ، الحرف الذي يحتوي على الكود \ xa0):



spec_chars = string.punctuation + '\n\xa0«»\t—…' 


لإزالة الأحرف ، نستخدم معالجة السلسلة عنصرًا تلو الآخر - نقسم السلسلة النصية الأصلية إلى أحرف ، ونترك فقط الأحرف التي لم يتم تضمينها في مجموعة spec_chars ، ونقوم مرة أخرى بدمج قائمة الأحرف في سلسلة:



text = "".join([ch for ch in text if ch not in spec_chars])


يمكنك إعلان وظيفة بسيطة تزيل مجموعة الأحرف المحددة من النص المصدر:



def remove_chars_from_text(text, chars):
    return "".join([ch for ch in text if ch not in chars])


يمكن استخدامه لإزالة الأحرف الخاصة وإزالة الأرقام من النص الأصلي:



text = remove_chars_from_text(text, spec_chars)
text = remove_chars_from_text(text, string.digits)


نص رمزي



لمزيد من المعالجة ، يجب تقسيم النص الذي تم مسحه إلى الأجزاء المكونة له - الرموز المميزة. يستخدم تحليل نص اللغة الطبيعية تقسيمات الرموز والكلمات والجمل. تسمى عملية التقسيم الترميز. من أجل مهمتنا في تحليل التردد ، من الضروري تقسيم النص إلى كلمات. للقيام بذلك ، يمكنك استخدام الطريقة الجاهزة لمكتبة NLTK:



from nltk import word_tokenize
text_tokens = word_tokenize(text)


المتغير text_tokens هو قائمة من الكلمات (الرموز). لحساب عدد الكلمات في النص المعالج مسبقًا ، يمكنك الحصول على طول قائمة الرموز المميزة:

len(text_tokens)


لعرض الكلمات العشر الأولى ، دعنا نستخدم عملية الشريحة:



text_tokens[:10]


لاستخدام أدوات تحليل التردد الخاصة بمكتبة NLTK ، تحتاج إلى تحويل قائمة الرموز المميزة إلى فئة النص المضمنة في هذه المكتبة:



import nltk
text = nltk.Text(text_tokens)


لنستنتج نوع نص المتغير:



print(type(text))


تنطبق عمليات الشرائح أيضًا على متغير من هذا النوع. على سبيل المثال ، سيؤدي هذا الإجراء إلى إخراج أول 10 رموز مميزة من النص:



text[:10]


حساب إحصائيات تواجد الكلمات في النص



تُستخدم فئة FreqDist (توزيعات التردد) لحساب إحصائيات توزيع تردد الكلمات في النص:



from nltk.probability import FreqDist
fdist = FreqDist(text)


ستعرض محاولة عرض متغير fdist قاموسًا يحتوي على الرموز وتردداتها - عدد المرات التي تظهر فيها هذه الكلمات في النص:



FreqDist({'': 146, '': 101, '': 69, '': 54, '': 44, '': 42, '': 39, '': 39, '': 31, '': 27, ...})


يمكنك أيضًا استخدام الطريقة الأكثر شيوعًا للحصول على قائمة المجموعات ذات الرموز المميزة الأكثر شيوعًا:



fdist.most_common(5)

[('', 146), ('', 101), ('', 69), ('', 54), ('', 44)]


يمكن تصور تكرار توزيع الكلمات في النص باستخدام رسم بياني. تحتوي فئة FreqDist على طريقة مؤامرة مضمنة لتخطيط مثل هذه المؤامرة. من الضروري تحديد عدد الرموز التي سيتم عرض تردداتها على الرسم البياني. باستخدام المعلمة التراكمية = خطأ ، يوضح الرسم البياني قانون Zipf : إذا تم ترتيب جميع الكلمات في نص طويل بما يكفي بترتيب تنازلي لتكرار استخدامها ، فسيكون تكرار الكلمة n في هذه القائمة متناسبًا عكسياً مع الرقم الترتيبي n.



fdist.plot(30,cumulative=False)


صورة



يمكن ملاحظة أنه في الوقت الحالي ، تحتوي أعلى الترددات على اقتران وحروف جر وأجزاء خدمة أخرى من الكلام لا تحمل عبءًا دلاليًا ، ولكنها تعبر فقط عن العلاقات الدلالية النحوية بين الكلمات. لكي تعكس نتائج تحليل التردد موضوع النص ، من الضروري إزالة هذه الكلمات من النص.



إزالة كلمات التوقف



تتضمن كلمات التوقف (أو كلمات الضجيج) ، كقاعدة عامة ، حروف الجر ، والاقتران ، والمداخلات ، والجسيمات وأجزاء أخرى من الكلام التي غالبًا ما توجد في النص ، وهي كلمات خدمة ولا تحمل عبءًا دلاليًا - فهي زائدة عن الحاجة.



تحتوي مكتبة NLTK على قوائم كلمات توقف جاهزة للغات مختلفة. دعنا نحصل على قائمة مائة كلمة للغة الروسية:



from nltk.corpus import stopwords
russian_stopwords = stopwords.words("russian")


وتجدر الإشارة إلى أن كلمات التوقف حساسة للسياق - بالنسبة للنصوص ذات الموضوعات المختلفة ، قد تختلف كلمات التوقف. كما في حالة الأحرف الخاصة ، من الضروري تحليل النص المصدر وتحديد كلمات التوقف التي لم يتم تضمينها في المجموعة القياسية.



يمكن تمديد قائمة كلمات الإيقاف باستخدام طريقة التوسيع القياسية:



russian_stopwords.extend(['', ''])


بعد إزالة كلمات التوقف ، يكون تكرار توزيع الرموز المميزة في النص كما يلي:



fdist_sw.most_common(10)

[('', 23),
 ('', 20),
 ('', 17),
 ('', 9),
 ('', 9),
 ('', 8),
 ('', 7),
 ('', 6),
 ('', 6),
 ('', 6)]


كما ترى ، أصبحت نتائج تحليل التردد أكثر إفادة وتعكس بشكل أكثر دقة الموضوع الرئيسي للنص. ومع ذلك ، فإننا نرى في النتائج رموز مثل "فلاديمير" و "فلاديميرا" ، وهي في الواقع كلمة واحدة ، ولكن في أشكال مختلفة. لتصحيح هذا الموقف ، من الضروري إحضار كلمات النص المصدر إلى قواعدها أو شكلها الأصلي - لتنفيذ الاشتقاق أو اللماتة.



التصور السحابي لشعبية الكلمة



في نهاية عملنا ، نتخيل نتائج تحليل التردد للنص في شكل "سحابة كلمات".



لهذا نحتاج إلى مكتبات wordcloud و matplotlib:



from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline


لإنشاء سحابة كلمات ، يجب تمرير سلسلة إلى الطريقة كمدخل. لتحويل قائمة الرموز بعد المعالجة المسبقة وإزالة كلمات التوقف ، سنستخدم طريقة الانضمام ، مع تحديد مسافة كفاصل:



text_raw = " ".join(text)


دعنا نسمي طريقة إنشاء السحابة:



wordcloud = WordCloud().generate(text_raw)


نتيجة لذلك ، نحصل على "سحابة الكلمات" لنصنا:



صورة



بالنظر إليها ، يمكنك الحصول على فكرة عامة عن الموضوع والشخصيات الرئيسية للعمل.



All Articles