مرحبا يا هبر.
في الجزء الأخير من 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)))]
هناك حاجة إلى وظيفة 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):
في الإخراج لدينا قاموس للكلمات وعدد من الحوادث. نشتق الـ 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 سنة - بعد الوقت المحدد ستكون هناك فرصة لتحديث المقال مرة أخرى ؛)