Filósofo bot para vk.com

Com base em muitos artigos dedicados ao botovodame ...

Recentemente, desenvolvi o “turnkey”, um projeto interessante dedicado à rede social vk.com. A tarefa é simples - criar um bot que possa ser adicionado à conversa e que fornecerá aspas aleatórias. Mas parecia muito simples, então tive que reviver o grande filósofo Friedrich Nietzsche, que faria um bot de um bot - overbot ...

imagem

Como não vi nada de complicado nisso, um script desse tipo foi rapidamente escrito:
Autorização -> lendo mensagens -> analisando e gerando uma resposta -> resposta
Tudo isso foi feito usando a API de retorno de chamada VK v.5.80 ( nada de novo )
O ponto mais difícil foi "análise e formação de respostas". De fato, isso é a coisa mais importante.
Mas o fato é que eu queria criar um "bot mais ou menos inteligente" do que simplesmente emitir uma frase aleatória do dicionário.

“Como eu fiz e funcionou?” - leia por favor ...

Então, vamos começar!

Em princípio, o bot tem uma funcionalidade bastante simples, mas é simples apenas superficialmente. Se você for mais fundo, tudo será muito mais complicado, porque escreveremos em PHP ( )

Repito que não preciso apenas de um gerador de cotações, então decidi perguntar ao bot alguma lógica. No entanto, eu também não preciso de uma rede neural, porque o treinamento é uma tarefa assustadora.

Resolvi o problema com criatividade quando tentei reviver o grande filósofo do século XIX - Friedrich Nietzsche.

Sim, é Nietzsche quem estará no papel do bot e, portanto, até citações aleatórias parecerão mais inteligentes.
Mas eu queria de alguma forma unir o interlocutor e o bot, criar uma conexão entre eles ...

Assim, a frase do interlocutor foi tomada como base, transformada por filtros em palavras-chave, nas quais foram encontradas frases de uma base preparada anteriormente.

Assim, como se a resposta para a pergunta do questionador fosse formada.

Recebi uma nova mensagem do usuário assim:

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

E então ele trouxe a mensagem de forma adequada para destacar as palavras-chave e alimentá-las em uma pesquisa no banco de dados.

Primeiro, me livrei completamente dos finais " a, e, s, sou, yami, ah, oh ... " e assim por diante ... removi sinais de pontuação e outros personagens.

Em segundo lugar, não levei em consideração as preposições. Primeiro, limitei as palavras ao comprimento - até 3 letras. Mas isso estava errado, porque as filosofias de Nietzsche eram caracterizadas por palavras como: " deus, mundo, rock, século etc. ". Além disso, após filtrar palavras de quatro letras, havia palavras de três letras, porque os finais foram descartados. Depois, limitei minha pesquisa a palavras como: " mais, o que, sobre, como, onde, etc. ".

Em terceiro lugar, Nietzsche escreveu mais em seus livros por conta própria; portanto, substituiu palavras recebidas como " seu, seu, você, amor, você pode" por "meu, meu, eu amo, posso " , respectivamente.

Assim, é obtido um tipo de diálogo.

Além disso - era necessário criar uma base, um dicionário de frases / citações / declarações a partir de trechos dos livros de Nietzsche.

Baixei os livros de Nietzsche no formato txt de litros. Reuniu-os e depois filtrou:

1 citação = 1 frase ( usou o delimitador como ".", "! ',"? " )

Descobriu-se que a base é sobre esse tipo:

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


Bem, há um banco de dados e uma mensagem filtrada do usuário.

: ", ?"
: " "


Resta prender o sistema de busca. Foi difícil com isso, porque configurações diferentes deram resultados diferentes. E se um código deu a resposta correta, o outro pedido não forneceu o que era necessário.

Foi decidido não usar expressões regulares, mas usá-las em conjunto com funções internas como:

substr
stripos
substr_count


e outros recursos de texto ...

Com a ajuda de longas condições de comparação e ciclos infinitamente longos, consegui aproximadamente o resultado desejado.

A lógica de pesquisa é mais ou menos assim: percorra cada frase e encontre as palavras da mensagem que está presente nessa frase.

Se a palavra for encontrada, +1 será adicionado como o "peso da variável".

Portanto, quanto mais palavras são encontradas na frase, maior é o “peso da variável”.

Isso sugere que, se as palavras "moralidade e vida" foram encontradas em alguma frase do banco de dados, essa é uma resposta de 100% que será emitida.

Mas se as palavras estavam no tópico e produzissem muitos 100% dos resultados, o método random () era emitido pelo método rand ().

Além disso, essas nem sempre eram frases pequenas, então eu tive que aparar a resposta, mais ou menos com esses regulares:

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

Então tudo é automático:
enviando mensagem

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

Eu especificamente não carreguei todo o código, mas é relativamente pequeno. O objetivo era criar um mecanismo de resposta sob demanda, em vez de inteligência treinada artificialmente.

Você pode testar o bot neste link . Basta escrever uma mensagem para ele. É importante saber que no início da frase você precisa colocar "Nietzsche", como se estivesse se referindo a ela, somente então o bot responderá.

Esta é uma versão de teste e, portanto, incompleta, portanto, tapetes, gírias juvenis, erros de palavras etc. - o bot não leva em consideração e a base é de apenas 10.000 frases.

Como exemplos, posso dar os diálogos:

imagem

imagem

imagem

imagem

imagem

imagem

Conclusão: Sim, o bot não possui comunicação bidirecional com o usuário - não é inteligência artificial. Mas em uma conversa de um grande número de participantes, o bot se tornará um bom "interlocutor".

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


All Articles