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 ...

Como não vi nada de complicado nisso, um script desse tipo foi rapidamente escrito:
Autorização -> lendo mensagens -> analisando e gerando uma resposta -> respostaTudo 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:
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],
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:






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".