Bot philosophe pour vk.com

Basé sur de nombreux articles consacrés au botovodam ...

Récemment, j'ai développé «clé en main» un projet intéressant dédié au réseau social vk.com. La tâche est simple - créer un bot qui peut être ajouté à la conversation et qui donnera des citations aléatoires. Mais cela semblait trop simple, j'ai donc dû faire revivre le grand philosophe Friedrich Nietzsche, qui ferait un bot à partir d'un bot - overbot ...

image

Je n'ai rien vu de compliqué là-dedans, donc un script de ce genre a été rapidement écrit:
Autorisation -> lecture de messages -> analyse et génération d'une réponse -> réponse
Tout cela a été fait en utilisant l' API de rappel VK v.5.80 ( rien de nouveau )
Le point le plus difficile a été «l'analyse et la formation des réponses». En effet, c'est la chose la plus importante.
Mais le fait est que je voulais créer un «bot plus ou moins intelligent» qui émettrait simplement une phrase aléatoire du dictionnaire.

"Comment ai-je fait et comment cela a-t-il fonctionné?" - veuillez lire ...

Alors, commençons!

En principe, le bot a une fonctionnalité assez simple, mais il n'est simple que superficiellement. Si vous allez plus loin, alors tout est beaucoup plus compliqué, car nous allons écrire en PHP ( )

Je répète que je n'ai pas besoin d'un simple générateur de devis, j'ai donc décidé de demander au bot une certaine logique. Cependant, je n'ai pas non plus besoin d'un réseau de neurones, car l'apprentissage est une tâche intimidante.

J'ai résolu le problème de la créativité en essayant de faire revivre le grand philosophe du XIXe siècle - Friedrich Nietzsche.

Oui, c'est Nietzsche qui jouera le rôle du bot, et donc même des citations aléatoires sembleront plus intelligentes.
Mais je voulais en quelque sorte unir l'interlocuteur et le bot, créer une connexion entre eux ...

Ainsi, la phrase de l'interlocuteur a été prise comme base, qui a été transformée par des filtres en mots clés, sur lesquels des phrases d'une base préalablement préparée ont été trouvées.

Ainsi, comme si la réponse à la question du questionneur était formée.

J'ai reçu un nouveau message de l'utilisateur comme ceci:

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

Et puis il a apporté le message sous une forme appropriée pour mettre en évidence les mots clés et les alimenter dans une recherche dans la base de données.

Tout d'abord, je me suis complètement débarrassé des terminaisons " a, et, s, am, yami, ah, oh ... " et ainsi de suite ... J'ai supprimé les signes de ponctuation et autres caractères.

Deuxièmement, je n'ai pas pris en compte les prépositions. Tout d'abord, j'ai limité les mots à leur longueur - jusqu'à 3 lettres. Mais c'était faux, car les philosophies de Nietzsche étaient caractérisées par des mots tels que: « dieu, monde, roche, siècle, etc. ». De plus, après filtrage des mots de quatre lettres, il y a eu des mots de trois lettres, car les terminaisons ont été supprimées. Ensuite, j'ai simplement limité ma recherche à des mots tels que: « plus, quoi, à propos, comment, où, etc. ».

Troisièmement, Nietzsche a écrit plus dans ses livres par lui-même, alors il a remplacé les mots entrants comme "le vôtre, le vôtre, vous, l'amour, vous pouvez" par "le mien, le mien, j'aime, je peux ", respectivement.

Ainsi, une sorte de dialogue est obtenu.

En outre, il était nécessaire de créer une base, un dictionnaire de phrases / citations / déclarations à partir d’extraits des livres de Nietzsche.

J'ai téléchargé les livres de Nietzsche au format txt à partir de litres. Les a rassemblés puis filtrés:

1 citation = 1 phrase ( utilisé le délimiteur comme ".", "! ',"? " )

Il s'est avéré que la base concerne ce type:

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


Eh bien, il y a une base de données et un message filtré de l'utilisateur.

: ", ?"
: " "


Reste à fixer le système de recherche. Cela a été difficile, car différents paramètres ont donné des résultats différents. Et si un code donnait la bonne réponse, l'autre demande ne donnait pas ce qui était nécessaire.

Il a été décidé de ne pas utiliser d'expressions régulières, mais plutôt de les utiliser avec des fonctions intégrées comme:

substr
stripos
substr_count


et d'autres fonctionnalités de texte ...

Avec l'aide de longues conditions de comparaison et de cycles infiniment longs, j'ai atteint approximativement le résultat souhaité.

La logique de recherche est quelque chose comme ceci: parcourez chaque phrase et trouvez les mots du message entrant qui sont présents dans cette phrase.

Si le mot est trouvé, +1 est ajouté comme "poids de la variable".

Par conséquent, plus la phrase contient de mots, plus le «poids de la variable» est élevé.

Cela suggère que si les mots "moralité et vie" ont été trouvés dans une phrase de la base de données, alors c'est une réponse à 100% qui sera émise.

Mais si les mots étaient sur le sujet et produisaient beaucoup de 100% des résultats, alors la méthode random () était émise par la méthode rand ().

De plus, ce n'étaient pas toujours de petites phrases, j'ai donc dû couper la réponse, à peu près par ces habitués:

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

Alors tout est automatique:
envoi de message

 $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'); 

Plus précisément, je n'ai pas téléchargé tout le code, mais il est relativement petit. L'objectif était de créer un moteur de réponse à la demande, plutôt que des renseignements formés artificiellement.

Vous pouvez tester le bot sur ce lien . Écrivez-lui un message. Il est important de savoir qu'au début de la phrase, vous devez mettre "Nietzsche", comme si vous y faisiez référence, alors seulement le bot répondrait.

Il s'agit d'une version test, donc incomplète, donc, tapis, argot des jeunes, erreurs de mots, etc. - le bot ne prend pas en compte et la base n'est que de 10 000 phrases.

A titre d'exemples, je peux donner les dialogues:

image

image

image

image

image

image

Conclusion: Oui, le bot n'a pas de communication bidirectionnelle avec l'utilisateur - ce n'est pas de l'intelligence artificielle. Mais dans une conversation d'un grand nombre de participants, le bot deviendra un bon «interlocuteur».

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


All Articles