المضايقة: بناء سحابة من الكلمات الناطقة باللغة الروسية على سبيل المثال من رؤوس هبرا

مرحبا يا هبر.

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

دعونا معرفة كيفية بناء مثل هذه الصورة:



كما سنرى سحابة من مقالات هبر لجميع السنوات.

من يهتم بما حدث ، من فضلك ، تحت القط.

تحليل


مجموعة البيانات الأولية ، كما في الحالة السابقة ، هي ملف بتنسيق csv مع عناوين مقالات هبر من 2006 إلى 2019. إذا كان أي شخص مهتمًا بتجربته بنفسك ، يمكنك تنزيله من هنا .

للبدء ، قم بتحميل البيانات في Pandas Dataframe وحدد الرؤوس للسنة المطلوبة.

df = pd.read_csv(log_path, sep=',', encoding='utf-8', error_bad_lines=True, quotechar='"', comment='#') if year != 0: dates = pd.to_datetime(df['datetime'], format='%Y-%m-%dT%H:%MZ') df['datetime'] = dates df = df[(df['datetime'] >= pd.Timestamp(datetime.date(year, 1, 1))) & ( df['datetime'] < pd.Timestamp(datetime.date(year + 1, 1, 1)))] # Remove some unicode symbols def unicode2str(s): try: return s.replace(u'\u2014', u'-').replace(u'\u2013', u'-').replace(u'\u2026', u'...').replace(u'\xab', u"'").replace(u'\xbb', u"'") except: return s titles = df["title"].map(unicode2str, na_action=None) 

هناك حاجة إلى وظيفة unicode2str من أجل إزالة مختلف أحرف unicode الخادعة من إخراج وحدة التحكم ، مثل علامات الاقتباس غير القياسية - ضمن OSX ، هذا يعمل أيضًا ، وعند الإخراج إلى Windows Powershell ، تم إصدار الخطأ "UnicodeEncodeError: 'برنامج الترميز' charmap 'لا يمكن ترميز الحرف' '. كان التعامل مع إعدادات Powershell كسولًا جدًا ، لذلك تبين أن هذه الطريقة هي الأسهل.

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

 def to_ascii(s): try: s = s.replace("'", '').replace("-", '').replace("|", '') return s.decode('utf-8').encode("ascii", errors="ignore").decode() except: return '' def is_asciiword(s): ascii_word = to_ascii(s) return len(ascii_word) > 2 

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

 def normal_eng(s): for sym in ("'s", '{', '}', "'", '"', '}', ';', '.', ',', '[', ']', '(', ')', '-', '/', '\\'): s = s.replace(sym, ' ') return s.lower().strip() 

الآن الشيء الأكثر أهمية ، من أجل كل شيء بدأ بالفعل ، هو تحليل الكلمات الروسية. كما نصحت في التعليقات على الجزء السابق ، لبايثون يمكن القيام بذلك باستخدام مكتبة pymorphy2. دعونا نرى كيف يعمل.

 import pymorphy2 morph = pymorphy2.MorphAnalyzer() res = morph.parse(u"") for r in res: print r.normal_form, r.tag.case 

على سبيل المثال ، لدينا النتائج التالية:

  NOUN,inan,masc sing,datv datv  NOUN,inan,masc sing,loc2 loc2  NOUN,inan,neut sing,datv datv  NOUN,inan,masc sing,gen2 gen2 

بالنسبة لكلمة "العالم" ، عرّف MorphAnalyzer "الشكل العادي" على أنه "العالم" (أو "العالم") ، ومع ذلك ، لا أعرف ما هو عليه) أو الحالات الفردية أو المحتملة مثل الحالات "dativ" أو "genitiv" أو "locative".

يعد استخدام تحليل MorphAnalyzer بسيطًا للغاية - تأكد من أن الكلمة اسم ، واشتقاق شكلها الطبيعي.

 morph = pymorphy2.MorphAnalyzer() def normal_rus(w): res = morph.parse(w) for r in res: if 'NOUN' in r.tag: return r.normal_form return None 

يبقى لجمع كل شيء معا ومعرفة ما حدث. يشبه الرمز شيء من هذا القبيل (تمت إزالة الأجزاء غير الملائمة):

 from collections import Counter c_dict = Counter() for s in titles.values: for w in s.split(): if is_asciiword(w): # English word or digit n = normal_eng(w) c_dict[n] += 1 else: # Russian word n = normal_rus(w) if n is not None: c_dict[n] += 1 

في الإخراج لدينا قاموس للكلمات وعدد من الحوادث. نشتق الـ 100 الأولى ونشكل منها سحابة شعبية من الكلمات:

 common = c_dict.most_common(100) wc = WordCloud(width=2600, height=2200, background_color="white", relative_scaling=1.0, collocations=False, min_font_size=10).generate_from_frequencies(dict(common)) plt.axis("off") plt.figure(figsize=(9, 6)) plt.imshow(wc, interpolation="bilinear") plt.title("%d" % year) plt.xticks([]) plt.yticks([]) plt.tight_layout() file_name = 'habr-words-%d.png' % year plt.show() 

لكن النتيجة كانت غريبة للغاية:



في شكل نصي ، بدا الأمر كما يلي:

   3958  3619  1828  840 2018 496  389  375  375 

الكلمات "أداء" ، "الثاني" و "القرن" كانت تقود بفارق كبير. وعلى الرغم من أنه من الممكن ، من حيث المبدأ ، (يمكنك تخيل عنوان مثل "البحث عن كلمات المرور بسرعة 1000 مرة في الثانية سيستغرق قرنًا") ، ولكن كان من المشكوك فيه وجود الكثير من هذه الكلمات. وليس عبثًا - كما هو موضح في تصحيح الأخطاء ، قام MorphAnalyzer بتعريف الكلمة "c" على أنها "الثانية" ، والكلمة "c" كـ "القرن". أي في العنوان "استخدام التكنولوجيا ..." أبرز MorphAnalyzer 3 كلمات - "الثانية" ، "المساعدة" ، "التكنولوجيا" ، والتي من الواضح أنها غير صحيحة. كانت الكلمات الغامضة التالية هي "متى" ("عند استخدام ...") و "بالفعل" ، والتي تم تعريفها على أنها الاسم "مباشر" و "بالفعل" ، على التوالي. كان الحل بسيطًا - عند التحليل ، فكر فقط في الكلمات التي يزيد طولها عن حرفين ، وأدخل قائمة كلمات استثناء اللغة الروسية التي سيتم استبعادها من التحليل. مرة أخرى ، ربما هذا ليس علميًا تمامًا (على سبيل المثال ، مقال حول "مراقبة تغيير تلوين من قبل بالفعل" كان سيُسقط من التحليل) ، ولكن لهذه المهمة بالفعل :) كافية.

النتيجة النهائية تشبه إلى حد ما الحقيقة (باستثناء Go والمقالات المحتملة عن الثعابين). يبقى حفظ كل هذا في صورة gif (رمز إنشاء gif في الجزء السابق ) ، ونحصل على نتيجة متحركة في شكل شعبية الكلمات الرئيسية في عناوين Habr's من 2006 إلى 2019.



الخاتمة


كما ترى ، فإن تحليل النص الروسي بمساعدة المكتبات الجاهزة أصبح بسيطًا للغاية. بالطبع ، مع بعض التحفظات ، اللغة المنطوقة هي نظام مرن مع العديد من الاستثناءات ووجود شعور السياق حسب السياق ، وربما يكون من المستحيل الحصول على يقين 100 ٪ هنا على الإطلاق. ولكن بالنسبة للمهمة التي في متناول اليد ، فإن الرمز أعلاه يكفي.

بالمناسبة ، لا يزال العمل مع النصوص السيريلية في بيثون نفسه بعيدًا عن الكمال - مشاكل بسيطة في إخراج الأحرف إلى وحدة التحكم ، وإخراج المصفوفات المقطوعة عن طريق الطباعة ، والحاجة إلى إلحاق u "" في سطور بيثون 2.7 ، وما إلى ذلك. إنه أمر غريب أنه في القرن الحادي والعشرين ، عندما يبدو أن جميع الأذيات مثل KOI8-R أو CP-1252 قد ماتت ، ولا تزال مشاكل ترميز السلسلة ذات صلة.

أخيرًا ، من المثير للاهتمام أن نلاحظ أن إضافة كلمات روسية إلى سحابة النص من الناحية العملية لا تؤدي إلى زيادة محتوى المعلومات في الصورة مقارنةً بالنسخة الإنجليزية - فكل مصطلحات تقنية المعلومات تقريبًا تتحدث الإنجليزية ، لذلك تغيرت قائمة الكلمات الروسية بدرجة أقل بكثير خلال 10 سنوات. ربما ، لمعرفة التغييرات في اللغة الروسية ، تحتاج إلى الانتظار 50-100 سنة - بعد الوقت المحدد ستكون هناك فرصة لتحديث المقال مرة أخرى ؛)

Source: https://habr.com/ru/post/ar442626/


All Articles