بوت الفيلسوف ل vk.com

استنادا إلى العديد من المقالات التي كانت مكرسة ل botovodam ...

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

صورة

لم أر شيئًا معقدًا في هذا ، لذا تمت كتابة نص من هذا النوع بسرعة:
إذن -> قراءة الرسائل -> تحليل وتوليد استجابة -> استجابة
تم كل ذلك باستخدام Callback API VK v.5.80 ( لا شيء جديد )
وكانت أصعب نقطة هي "تحليل الاستجابة والاستجابة لها". في الواقع ، هذا هو الشيء الأكثر أهمية.
ولكن الحقيقة هي أنني أردت إنشاء "روبوت ذكي أكثر أو أقل" مما سيؤدي ببساطة إلى إصدار عبارة عشوائية من القاموس.

"كيف فعلت ذلك وفعلت ذلك؟" - يرجى قراءة ...

لذلك ، دعونا نبدأ!

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

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

لقد حلت مشكلة الإبداع عندما حاولت إحياء الفيلسوف العظيم في القرن التاسع عشر - فريدريش نيتشه.

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

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

هكذا ، كما لو أن إجابة سؤال السائل قد تشكلت.

تلقيت رسالة جديدة من المستخدم مثل هذا:

//  case 'message_new': //... id   $user_id = $data->object->peer_id; //   $body = $data->object->text; 

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

أولاً ، لقد تخلصت تمامًا من النهايات " a ، و ، s ، am ، yami ، ah ، oh ... " وهكذا ... أزلت علامات الترقيم وشخصيات أخرى.

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

ثالثًا ، كتب نيتشه أكثر من ذلك في كتبه بمفرده ، لذلك استبدل الكلمات الواردة مثل " كلماتك ، كلماتك ، أنت ، الحب ، يمكنك" بعبارة "لي ، أنا ، أنا أحب ، يمكنني ، " على التوالي.

وبالتالي ، يتم الحصول على نوع من الحوار.

علاوة على ذلك - كان من الضروري إنشاء قاعدة ، معجم للعبارات / اقتباسات / عبارات من مقتطفات من كتب نيتشه.

قمت بتنزيل كتب نيتشه بتنسيق txt من لتر. تجمعهم معًا ثم تمت تصفيتها:

1 اقتباس = جملة واحدة ( تستخدم المحدد كـ "." ، "!" ، "؟" )

اتضح أن القاعدة تدور حول هذا النوع:

- , , -
, , , ,
, , : ,
,


حسنًا ، هناك قاعدة بيانات ورسالة تمت تصفيتها من المستخدم.

: ", ?"
: " "


يبقى أن يربط نظام البحث. كان الأمر صعبًا ، لأن الإعدادات المختلفة أعطت نتائج مختلفة. وإذا أعطى رمز واحد الإجابة الصحيحة ، فإن الطلب الآخر لم يقدم ما هو مطلوب.

تقرر عدم استخدام تعبيرات عادية ، ولكن لاستخدامها مع وظائف مدمجة مثل:

substr
stripos
substr_count


وميزات النص الأخرى ...

بمساعدة ظروف المقارنة الطويلة والدورات الطويلة بشكل لا نهائي ، حققت النتيجة المرجوة تقريبًا.

منطق البحث هو شيء من هذا القبيل: انتقل من خلال كل جملة والعثور على الكلمات من الرسالة الواردة الموجودة في هذه الجملة.

إذا تم العثور على الكلمة ، فسيتم إضافة +1 كـ "وزن المتغير".

لذلك ، كلما تم العثور على مزيد من الكلمات في الجملة ، كلما زاد "وزن المتغير".

يشير هذا إلى أنه إذا تم العثور على الكلمات "الأخلاق والحياة" في بعض الجملة من قاعدة البيانات ، فهذا يمثل إجابة 100٪ سيتم إصدارها.

ولكن إذا كانت الكلمات حول الموضوع وأنتجت الكثير من النتائج بنسبة 100٪ ، فإن الطريقة العشوائية () تم إصدارها بواسطة طريقة rand ().

بالإضافة إلى ذلك ، لم تكن هذه جمل صغيرة دائمًا ، لذا اضطررت لتقليص الإجابة ، تقريبًا من قبل هؤلاء النظاميين:

  preg_match('/(?:^|\.\s+)([^\.]*?'.$wordpattern.'[^\.]*?\.+)\s+/i', $text , $matches); 

ثم كل شيء تلقائي:
ارسال رسالة

 $request_params = array( 'message' => $matches[1], #'message' => $find[0], 'peer_id' => $user_id, 'access_token' => $token, 'v' => '5.80' ); $get_params = http_build_query($request_params); file_get_contents('https://api.vk.com/method/messages.send?'. $get_params); header("HTTP/1.1 200 OK"); echo('ok'); 

على وجه التحديد لم أقم بتحميل جميع الشفرات ، لكنها صغيرة نسبيًا. كان الهدف هو إنشاء محرك استجابة عند الطلب ، بدلاً من الذكاء المدرَّب بشكل مصطنع.

يمكنك اختبار الروبوت في هذا الرابط . فقط اكتب له رسالة. من المهم أن تعرف أنه في بداية الجملة تحتاج إلى وضع عبارة "Nietzsche" ، كما لو كنت تشير إليها ، عندها فقط سوف يستجيب الروبوت.

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

كأمثلة ، يمكنني إعطاء مربعات الحوار:

صورة

صورة

صورة

صورة

صورة

صورة

الخلاصة: نعم ، ليس لدى الروبوت اتصال ثنائي الاتجاه مع المستخدم - إنه ليس ذكاءً اصطناعيًا. ولكن في محادثة من عدد كبير من المشاركين ، سيصبح الروبوت "محاوراً جيداً".

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


All Articles