السلام عليكم و رحمة الله تعالى و بركاته
سأشرح في هذه الدورة لغة 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>
و هكذا نكون قد أنتهينا من هذا الدرس
أمل أن يكون قد أعجبكم . و قبل أن أختم طبعا من الممتع كتابة اكواد aiml لكن هناك بالفعل أكواد جاهزه على الأنترنت تتكون من الاف الأسطر و تدعم أغلب الممحادثات التي يمكن أن تواجه البوت تجدونها في موقع البوت Alice و في روابط المصادر في الأسفل.
