سلاسل ماركوف وبايثون - فهم النظرية وتجميع مولد النص

نحن نفهم ونخلق



الخبر السار قبل المقال: مهارات الرياضيات العالية ليست مطلوبة للقراءة و (نأمل) الفهم.



إخلاء المسؤولية: جزء الكود من هذه المقالة ، مثل الجزء السابق ، هو ترجمة مكيّفة ومكمّلة ومختبرة. أنا ممتن للمؤلف ، لأن هذه واحدة من تجاربي الأولى في الكود ، وبعد ذلك غمرت أكثر. آمل أن يعمل تكيفي بنفس الطريقة بالنسبة لك!



إذا هيا بنا!



الهيكل مثل هذا:



  • ما هي سلسلة ماركوف؟
  • مثال على كيفية عمل السلسلة
  • مصفوفة الانتقال
  • نموذج سلسلة ماركوف مع بايثون - إنشاء نص يعتمد على البيانات


ما هي سلسلة ماركوف؟



سلسلة ماركوف هي أداة من نظرية العمليات العشوائية ، وتتألف من سلسلة من عدد n من الحالات. في هذه الحالة ، يتم إنشاء الاتصالات بين العقد (قيم) السلسلة فقط إذا كانت الدول متجاورة تمامًا .



مع الأخذ في الاعتبار الكلمة ذات النوع الدهني فقط ، دعونا نستنتج خاصية سلسلة ماركوف: إن



احتمال وجود حالة جديدة معينة في السلسلة يعتمد فقط على الحالة الحالية ولا يأخذ في الاعتبار رياضيًا تجربة الحالات السابقة => سلسلة ماركوف هي سلسلة بدون ذاكرة.



بمعنى آخر ، يرقص المعنى الجديد دائمًا عن المعنى الذي يمسكه مباشرة بالمقبض.



مثال على كيفية عمل السلسلة



مثل مؤلف المقال الذي تم استعارة تطبيق الكود منه ، فلنأخذ سلسلة عشوائية من الكلمات.



ابدأ - صناعي - معطف فرو - صناعي - طعام - صناعي - مكرونة - صناعي - معطف فرو - صناعي - نهاية



دعنا نتخيل أن هذا هو في الواقع بيت عظيم ومهمتنا هي نسخ أسلوب المؤلف. (لكن القيام بذلك بالطبع غير أخلاقي)



كيف تقرر؟



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



ابدأ == 1

اصطناعي == 5

معطف فرو == 2

باستا == 1

طعام == 1

نهاية == 1



مع الأخذ في الاعتبار أن لدينا سلسلة ماركوف ، يمكننا رسم توزيع الكلمات الجديدة اعتمادًا على الكلمات السابقة بيانياً:







شفهيًا:



  • حالة معطف الفرو والطعام والمعكرونة 100٪ تستلزم حالة p = 1 الاصطناعية
  • يمكن أن تؤدي الحالة "الاصطناعية" إلى 4 حالات ذات احتمالية متساوية ، واحتمال الوصول إلى حالة معطف الفرو الاصطناعي أعلى من الحالات الثلاث الأخرى
  • لا تؤدي الحالة النهائية إلى أي مكان
  • الحالة "البداية" 100٪ تستلزم الحالة "المصطنعة"


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







ماذا يعني باللغة الروسية "مجموع سلسلة الاحتمالات لحدث ما ك ، اعتمادًا على i == مجموع جميع قيم احتمالات الحدث k ، اعتمادًا على حدوث الحالة i ، حيث الحدث k == m + 1 ، والحدث i == m (أي أن الحدث k يختلف دائمًا بواحد عن i) ”.



لكن أولاً ، دعنا نفهم ما هي المصفوفة.



مصفوفة الانتقال



عند العمل مع سلاسل ماركوف ، فإننا نتعامل مع مصفوفة انتقال عشوائية - مجموعة من المتجهات ، حيث تعكس القيم قيم الاحتمالات بين التدرجات.



نعم ، نعم ، يبدو أنه يبدو.



لكن لا يبدو الأمر مخيفًا:







P هي رمز المصفوفة. تعكس القيم عند تقاطع الأعمدة والصفوف هنا احتمالات التحولات بين الحالات.



بالنسبة لمثالنا ، سيبدو كالتالي:







لاحظ أن مجموع القيم في الصف == 1. وهذا يعني أننا بنينا كل شيء بشكل صحيح ، لأن مجموع القيم في صف المصفوفة العشوائية يجب أن يساوي واحدًا.



مثال مكشوف بدون معاطف ومعاجين من الفرو الصناعي:







مثال عارٍ هو مصفوفة الهوية لـ:



  • الحالة التي يكون فيها من المستحيل العودة من أ إلى ب ، ومن ب - رجوعًا إلى أ [1]
  • الحالة التي يكون فيها الانتقال من A إلى B ممكنًا [2]






الاحترام. مع الانتهاء من النظرية.

نحن نستخدم بايثون.



نموذج يعتمد على سلسلة ماركوف باستخدام لغة بايثون - إنشاء نص بناءً على البيانات





الخطوة 1



استيراد الحزمة ذات الصلة للعمل والحصول على البيانات.



import numpy as np
data = open('/Users/sad__sabrina/Desktop/1.txt', encoding='utf8').read()

print(data)

     ,   ,        ,    ,     (   « memorylessness »).  ,     ,        ,          ,        ,   ,    ; ..,     ,       .


لا تركز على بنية النص ، ولكن انتبه إلى ترميز utf8. هذا مهم لقراءة البيانات.



الخطوة 2



قسّم البيانات إلى كلمات.



ind_words = data.split()
print(ind_words)

['\ufeff', '', '', '', '', ',', '', '', ',', '', '', '', '', '', '', '', ',', '', '', '', ',', '', '', '', '', '(', '', '', '«', 'memorylessness', '»).', '', ',', '', '', '', '', ',', '', '', '', '', '', '', '', ',', '', '', '', '', '', '', '', '', '', ',', '', '', '', '', '', '', '', ',', '', '', ',', '', '', '', ';', '..,', '', '', '', '', ',', '', '', '', '', '', '', '.']


الخطوة 3



لنقم بإنشاء وظيفة لربط أزواج من الكلمات.



def make_pairs(ind_words):
    for i in range(len(ind_words) - 1):
        yield (ind_words[i], ind_words[i + 1])
pair = make_pairs(ind_words)


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



قد ينشأ سوء فهم هنا ، لأن كلمة واحدة يمكن أن تتحول إلى كلمات مختلفة. سنحل هذا من خلال إنشاء قاموس لوظيفتنا.



الخطوة 4



word_dict = {}
for word_1, word_2 in pair:
    if word_1 in word_dict.keys():
        word_dict[word_1].append(word_2)
    else:
        word_dict[word_1] = [word_2]


هنا:



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


الخطوة 5



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

في هذه الحالة ، سنضبط عدد الكلمات على 20.



first_word = np.random.choice(ind_words)
 
while first_word.islower():
    chain = [first_word]
    n_words = 20
    first_word = np.random.choice(ind_words)
    
    for i in range(n_words):
        chain.append(np.random.choice(word_dict[chain[-1]]))


الخطوة 6



لنبدأ عملنا العشوائي!



print(' '.join(chain))
   ; ..,     ,     ,      (




وظيفة الانضمام () هي وظيفة للعمل مع السلاسل. بين قوسين ، حددنا فاصلًا للقيم في السطر (مسافة).



والنص ... حسنًا ، يبدو وكأنه آلة ومنطقية تقريبًا.



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



إذا تبين أن ممارسة الشفرة الخاصة بي غير مفهومة بالنسبة لك ، فأنا أرفق المقالة الأصلية . تأكد من تطبيق الكود عمليًا - فالشعور عند "تشغيله وتكوينه" يتم تحصيله!



أنا في انتظار آرائكم وسأكون سعيدًا بتعليقاتكم البناءة على المقال!



All Articles