Filósofo de bot para vk.com

Basado en muchos artículos dedicados al botovodam ...

Recientemente desarrollé un proyecto interesante "llave en mano" dedicado a la red social vk.com. La tarea es simple: crear un bot que se pueda agregar a la conversación y que proporcione citas aleatorias. Pero parecía demasiado simple, así que tuve que revivir al gran filósofo Friedrich Nietzsche, quien haría un bot de un bot - overbot ...

imagen

No vi nada complicado en esto, por lo que rápidamente se escribió un guión de este tipo:
Autorización -> leer mensajes -> analizar y generar una respuesta -> respuesta
Todo esto se hizo usando Callback API VK v.5.80 ( nada nuevo )
El punto más difícil fue la "formación de análisis y respuesta". De hecho, esto es lo más importante.
Pero el hecho es que quería crear un "bot más o menos inteligente" que simplemente emitiría una frase aleatoria del diccionario.

"¿Cómo lo hice y funcionó?" - por favor lea ...

Entonces, ¡comencemos!

En principio, el bot tiene una funcionalidad bastante simple, pero es simple solo superficialmente. Si profundiza, entonces todo es mucho más complicado, porque escribiremos en PHP ( )

Repito que no necesito solo un generador de cotizaciones, así que decidí preguntarle al bot algo de lógica. Sin embargo, tampoco necesito una red neuronal, porque aprender es una tarea desalentadora.

Resolví el problema con creatividad cuando intenté revivir al gran filósofo del siglo XIX: Friedrich Nietzsche.

Sí, es Nietzsche quien estará en el papel del bot, y por lo tanto, incluso las citas aleatorias parecerán más inteligentes.
Pero de alguna manera quería unir al interlocutor y al bot, crear una conexión entre ellos ...

Entonces, la frase del interlocutor se tomó como base, que se transformó mediante filtros en palabras clave, en las que se encontraron oraciones de una base de datos preparada previamente.

Así, como si se formara la respuesta a la pregunta del interlocutor.

Recibí un nuevo mensaje del usuario como este:

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

Y luego trajo el mensaje en una forma adecuada para resaltar las palabras clave y alimentarlas en una búsqueda en la base de datos.

En primer lugar, me deshice completamente de las terminaciones " a, y, s, am, yami, ah, oh ... " y así sucesivamente ... eliminé los signos de puntuación y otros caracteres.

En segundo lugar, no tuve en cuenta las preposiciones. Primero, limité las palabras a su longitud: hasta 3 letras. Pero esto estaba mal, porque las filosofías de Nietzsche se caracterizaban por palabras como: " dios, mundo, roca, siglo, etc. ". Además, después de filtrar palabras de cuatro letras, había palabras de tres letras, porque se descartaron las terminaciones. Luego limité mi búsqueda a palabras como: " sobre, qué, sobre, cómo, dónde, etc. ".

En tercer lugar, Nietzsche escribió más en sus propios libros, por lo tanto, reemplazó las palabras entrantes como " tuyo, tuyo, amor, puedes" con "mío, mío, amo, puedo " , respectivamente.

Por lo tanto, se obtiene una especie de diálogo.

Además, era necesario hacer una base, un diccionario de frases / citas / declaraciones de extractos de los libros de Nietzsche.

Descargué los libros de Nietzsche en formato txt de litros. Los reunió y luego los filtró:

1 cita = 1 oración ( usó el delimitador como ".", "! ',"? " )

Resultó que la base es de este tipo:

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


Bueno, hay una base de datos y un mensaje filtrado del usuario.

: ", ?"
: " "


Queda por fijar el sistema de búsqueda. Fue difícil con esto, porque diferentes configuraciones dieron diferentes resultados. Y si un código daba la respuesta correcta, la otra solicitud no daba lo que se necesitaba.

Se decidió no usar expresiones regulares, sino usarlas junto con funciones integradas como:

substr
stripos
substr_count


y otras características de texto ...

Con la ayuda de largas condiciones de comparación y ciclos infinitamente largos, logré aproximadamente el resultado deseado.

La lógica de búsqueda es algo como esto: revisa cada oración y encuentra las palabras del mensaje entrante que están presentes en esta oración.

Si se encuentra la palabra, entonces se agrega +1 como "peso de la variable".

Por lo tanto, cuantas más palabras se encuentran en la oración, mayor es el "peso de la variable".

Esto sugiere que si se encontraron las palabras "moralidad y vida" en alguna oración de la base de datos, entonces esta será una respuesta del 100% que se emitirá.

Pero si las palabras fueron sobre el tema y produjeron una gran parte del 100% de los resultados, entonces el método aleatorio () fue emitido por el método rand ().

Además, estas no siempre fueron oraciones pequeñas, por lo que tuve que recortar la respuesta, más o menos por dichos clientes habituales:

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

Entonces todo es automático:
enviando mensaje

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

Específicamente no cargué todo el código, pero es relativamente pequeño. El objetivo era crear un motor de respuesta a pedido, en lugar de inteligencia artificialmente entrenada.

Puedes probar el bot en este enlace . Solo escríbele un mensaje. Es importante saber que al comienzo de la oración debe poner "Nietzsche", como si se refiriera a ella, solo entonces el bot responderá.

Esta es una versión de prueba y, por lo tanto, incompleta, por lo tanto, esteras, jerga juvenil, errores en las palabras, etc., el bot no tiene en cuenta y la base es de solo 10,000 frases.

Como ejemplos, puedo dar los diálogos:

imagen

imagen

imagen

imagen

imagen

imagen

Conclusión: Sí, el bot no tiene comunicación bidireccional con el usuario, no es inteligencia artificial. Pero en una conversación de un gran número de participantes, el bot se convertirá en un buen "interlocutor".

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


All Articles