التعبيرات العادية + البرمجة المنطقية. ما هي النتيجة؟

مرحبا ايها القراء.

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

لذلك ، تم تعيين المهام التالية :

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

تحليل الشجرة.


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

(_)->{_} 

إذا كان هناك أي عامل (* ، + ، وما إلى ذلك) بعد قوسين في التعبير الأصلي ، فإنه "يتحرك" خلف القوس الأيمن. على سبيل المثال:

 (\w+\s)->{A}+ 

لا شيء يمنع التسمية والأقواس ، على سبيل المثال:

 ((\w+)->{ID}\s)->{A}+ 

في المثال الأخير ، سينشئ التعبير العادي المعدل شجرة تحليل ذات جذر شرطي ، في المستوى التالي توجد حالات A (يمكن أن يكون هناك أكثر من واحد) ، وفي المستوى التالي توجد قيم معرف. من السهل الوصول إلى هذه الشجرة باستخدام XPath ، الذي قمت بتطبيقه ، على سبيل المثال ، مثل هذا الطلب ممكن:

 //A[2]/ID[text()!=""]/text() 

يتحقق Word من القواميس والجداول وشبكة عصبية بسيطة


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

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

ستكون الصيغة العامة هنا:

 (_)_=>{1,2,...} 

operation_symbol يعتمد على العملية: التحقق (؟) ، التجديد (+) ، الاستبعاد (-) ، الإنشاء / التدريب (*). بالنسبة للمسندات ، يشار إلى اسم المسند (قياسي أو خاص بك) وقائمة بمعلماته بين قوسين. يمكن أن تكون المعلمات ثوابت ، ومتغيرات الإدخال ، ومتغيرات الإخراج (مسبوقة بعلامة "$") ، وعلامة القيمة التعسفية "_" ، وإشارة إلى القيمة الحالية للجزء الخاص التعبير (حرف واحد "$"). يعتبر تحليل مثل هذا التعبير ناجحًا إذا نجحت جميع المسندات في السلسلة.

على سبيل المثال ، التعبير:

 ([--]+)->{V1}\s+([--]+)->{V2}()?=>{check(V1},check(V2),correlate(V1,V2)} 

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

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

 ()->{C1}()->{C2}([--]+)->{check($,$C1}\s+([--]+)->{V2}()?=>{check(V2,$C2),correlate(C1,C2,1)} 

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

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

الخلاصة


يتم تنفيذ جميع تعديلات التعبير العادي الموضحة في النموذج الأولي (تعديل regexpr.pas القياسي) على Free Pascal.

آمل أن تكون هذه الأفكار مفيدة لشخص ما.

الآن ، باستخدام هذه التعبيرات المنطقية المنتظمة + البرمجة على Prolog النقي ، كان من الممكن ، أولاً ، كتابة إضافة إلى نظام إنشاء البرنامج الذي يستعيد نموذج البرنامج الأصلي من التعليمات البرمجية التي تم إنشاؤها من قبل ، وثانيًا ، لإنشاء عناصر اللغة الطبيعية لهذا النظام واجهة (يتم اعتماد بيان المشكلة بلغة روسية مبسطة للغاية ويتم صياغة نموذج للمشكلة عليها ، وفقًا لذلك تم إنشاء البرنامج بالفعل).

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


All Articles