برمجة شات بوت بأستعمال لغة بايثون و aiml للذكاء الأصطناعي


(Mohamed Hisham) #1

السلام عليكم و رحمة الله تعالى و بركاته

سأشرح في هذه الدورة لغة AIML وهي أختصار لــ Artificle Intelligence Markup Language وهي لغة مبنيه على XML و تستعمل تقنيات الذكاء الاصطناعي لبرمجة الشات بوت.

في هذه الدوره سأتدرج بشرح أساسيات AIML ثم بعد ذلك ساقوم بعمل بوت باستخدام لغة AIML و مكتبة بايثون معده للتعامل مع اللغة.

اولاً سنقوم بتحميل مكتبة البايثون المطلوبه للتعامل مع AIML

قم بتحميل الملف التالي Py3kaiml

بعد التحميل قم بفك الضغط عن الملف بأستعمال الأمر

unzip pyaiml3-master.zip 

بعد ذلك قم بالأنتقال الى المجلد الذي نتج

cd pyaiml3-master

ثم قم بتثبيت المكتبه

sudo python3 setup.py install

أو

python3 setup.py install --user

الان قم بكتابة

python3

ثم بعد ذلك

import aiml

اذا لم ينتج اي خطأ اذا فقد تم تثبيت المكتبه بنجاح.

الأن سننتقل الى شرح أساسيات AIML .

أساسيات لغة AIML

قم بأنشاء ملف نصي ثم قم بتسميته main.aiml سنقوم بكتابة كود aiml في هذا الملف.

لغة aiml من tags كتلك التي في xml و html وفي أي ملف aiml لابد من توفر تاغات أساسيه وهي :

  • aiml tag
  • category tag
  • pattern tag
  • template tag

اولا aiml
و هو يمثل الجذر و يستخدم لتحديد بداية ملف aiml و نهايته
كالصيغة التاليه.

<aiml>
 .....................
 .....................
 ..................... 
</aiml>

ثانيا category

و هو تاغ يمثل الوحده المعرفيه بمعنى انه يحتوى على نمط يمثل أدخال المستخدم و الأستجابه في حالة تم مطابقة هذا النمط. حيث يتم كتابه النمط الذي يمثل أدخال المستخد في < pattern> و الجواب الذي يمثل الأستجابه في < template >.

فمثلا إذا أردنا عمل برنامج يقوم بالرد على المستخدم بـــ hello user متى ما قام المستخد بأدخال hello bot فسيكون كالتالي:


<aiml>

<category>

<pattern> HELLO BOT</pattern>

<template> hello user </template>

</category>

</aiml>

لأحظ أن نمط الأدخال مكتوب بالحروف الكتابه و بنمط أقصد ان المستخدم اذا ادخل مثلاً Hello Bot أو hello Bot أو HELLO bot فسيتم المطابقة في كل حاله من الاحوال سوى أكانت حروف كبيره او صغير.ثم سيخرج للمستخدم على الشاشه hello user .

ملاحظه: اللغه تدعم العربيه

الأن للتشغيل البرنامج السابق سنقوم بكتابة كود بايثون.


import aiml  

kernel = aiml.Kernel()      #عمل كائن يمثل نواة البوت

kernel.learn("main.aiml")     #تعليم ملف aiml الى البوت 

user_input = input("talk to me >> ")    #أدخال المستخدم

bot_output = kernel.respond(user_input)    #داله تستقبل أدخال المستخدم ثم تقوم بمعالجته كم موجود في ملف و تُرجع الأستجابه في شكل سلسله نصيه.

print(bot_output)     #طباعة استجابة البوت

عند تشغيل الاسكربت السابق فأن المخرج كالاتي:


Loading main.aiml... done (0.08 seconds)
talk to me >> hello bot
hello user

الأن و قد انتهينا من أساسيات كتابة aiml و تشغيلها مع البايثون سننتقل الى أستخدامات التاغات الاخرى

سنطلع عن طريقه الحصول على بعص البيانات من المستخدم حيث أن aiml تدعم بعض wildcard مثل _ و * . فمثلا اذا أردنا الحصول على أسم المستخدم فسيتم عن طريق التالي:


<aiml>

<category>

<pattern> MY NAME IS *</pattern>

<template> hello <star/>, nice to meet you </template>

</category>

</aiml>

حيث نقوم بأستعمال < /star> للحصول على مدخل المستخدم. كما يمكن أيضاً استعمالها مع index للحصول على عدة مدخلات فمثلا اذا كان هناك نجمتان و أردنا معرفه كليهما فسيتم كالتالي:


<category>

<pattern>A * IS A *</pattern>

<template> yes of course a <star index="1"/> is a <star index="2"/>  </template>

</category>

</aiml>

فكما لأحظنا للوصول للمحتوى إحدى النجمتين فأننا نستعمل الخصيصه index و نعطيها قمية تمثل ترتيب النجمه التي نريدها.

فأذا قمنا بتجربه البرنامج الأن فأن المخرج سيكون:

Loading main.aiml... done (0.08 seconds)
talk to me >> a car is a vehicle
yes of course a car is a vehicle

< set> و < get/>
تسخدم < set> و < get/> لحفظ البيانات و جلبها متغيرات و ذلك لحفظ بيانات المسخدم في حالة الحاجه اليها مره اخرى فمثلا اذا أردنا حفظ أسم المستخدم و الأجابه عنه في حالة سئل منه البوت مره اخرى. فسيتم كالتالي:

<aiml>

<category>

<pattern>MY NAME IS *</pattern>

<template>hello <set name="username"><star/></set></template>

</category>

<category>

<pattern>BYE</pattern>

<template>bye <get name="username" /></template>

</category>

</aiml>

و من ثم نقوم بتعديل كود البايثون حيث نحتاج الى أدخال مستمر

import aiml  

kernel = aiml.Kernel()     

kernel.learn("main.aiml")   

while True:
    print(kernel.respond(input("talk to me >> ")))

الأن المخرج سيكون كالتالي:

Loading main.aiml... done (0.08 seconds)
talk to me >> my name is mohamed
hello mohamed
talk to me >> bye
bye mohamed
talk to me >> 

Bot Tag
تستعمل البوت تاغ في ضبط بيانات خاصه بالبوت و ذلك عن طريق كود البايثون فمثلا إذا أرادنا ضبط اسم للبوت فسيكون كالتالي:

import aiml  

kernel = aiml.Kernel()     

kernel.learn("main.aiml")   

kernel.setBotPredicate("botname","alpha")

while True:
    print(kernel.respond(input("talk to me >> ")))

كود aiml

<aiml>

<category>

<pattern>YOU</pattern>

<template>my name is <bot name="botname"/></template>

</category>

</aiml>

فأن المخرج سيكون:

Loading main.aiml... done (0.08 seconds)
talk to me >> you
my name is alpha

Random Tag

تسخدم لأعطى المستخدم أجابه عشوائيه من بين أجابات أخرى
مثلا:

<aiml>

<category>

<pattern>HELLO</pattern>

<template>

<random>
<li>hello</li>
<li>hi</li>
<li>welcome</li>
</random>

</template>

</category>

</aiml>

srai tag تسخدم لأختصار الأنماط فمثلا اذا كان هناك اكثر من نمط لهم نفس الاجابة فيمكن الوصول لأستجابة نمط موجود كالتالي:

<aiml>

<category>

<pattern>HELLO</pattern>

<template>

<random>
<li>hello</li>
<li>hi</li>
<li>welcome</li>
</random>

</template>

</category>

<pattern>WELCOME</pattern>

<template><srai>HELLO</srai></template>

</category>

</aiml>

ايضا يوجد that tag
و هو تاغ يستخدم للأستجابه لرد محدد فمثلا اذا أرادنا سؤال المستخدم عما اذا كان يحب أفلام الأكشن وجأوب بنعم فسيرد البوت عليه.
مثال:

<aiml>

<category>

<pattern>MOVIES</pattern>

<template>
do you like action movies?
</template>

</category>

pattern>YES</pattern>
<that>do you like action movies?<that>
<template>nice, I like them too.</template>

</category>

</aiml>

و هكذا نكون قد أنتهينا من هذا الدرس :slight_smile: أمل أن يكون قد أعجبكم . و قبل أن أختم طبعا من الممتع كتابة اكواد aiml لكن هناك بالفعل أكواد جاهزه على الأنترنت تتكون من الاف الأسطر و تدعم أغلب الممحادثات التي يمكن أن تواجه البوت تجدونها في موقع البوت Alice و في روابط المصادر في الأسفل.