Pergunta

Quero construir um bot que faça algumas perguntas simples a alguém e ramifique com base na resposta.Sei que analisar o significado das respostas humanas será um desafio, mas como configurar o programa para lidar com o “estado” da conversa?

Será uma conversa individual entre um humano e o bot.

Foi útil?

Solução

Você provavelmente quer investigar Cadeias de Markov como o básico para a IA do bot.Eu escrevi algo há muito tempo (o código do qual não tenho orgulho nenhum e precisa de alguns mods para rodar em Python> 1.5) que pode ser um ponto de partida útil para você: http://sourceforge.net/projects/benzo/

EDITAR:Aqui está um exemplo mínimo em Python de uma cadeia de Markov que aceita entrada de stdin e gera texto com base nas probabilidades de palavras se sucederem na entrada.Ele é otimizado para logs de bate-papo no estilo IRC, mas a execução de qualquer texto de tamanho decente nele deve demonstrar os conceitos:

import random, sys

NONWORD = "\n"
STARTKEY = NONWORD, NONWORD
MAXGEN=1000

class MarkovChainer(object):
    def __init__(self):
        self.state = dict()

    def input(self, input):
        word1, word2 = STARTKEY
        for word3 in input.split():
            self.state.setdefault((word1, word2), list()).append(word3)
            word1, word2 = word2, word3 
        self.state.setdefault((word1, word2), list()).append(NONWORD)

    def output(self):
        output = list()
        word1, word2 = STARTKEY
        for i in range(MAXGEN):
            word3 = random.choice(self.state[(word1,word2)])
            if word3 == NONWORD: break
            output.append(word3)
            word1, word2 = word2, word3
        return " ".join(output)

if __name__ == "__main__":
    c = MarkovChainer()
    c.input(sys.stdin.read())
    print c.output()

A partir daqui é muito fácil conectar a persistência e uma biblioteca de IRC e ter a base do tipo de bot do qual você está falando.

Outras dicas

As pessoas já mencionaram que a monitoração de estado não é um grande componente dos chatbots típicos:

  • uma implementação pura de Markov pode expressar um tipo de estado muito vago se estiver aumentando seu léxico e sua tabela em tempo real - as declarações anteriores do interlocutor humano podem ser regurgitadas por acaso mais tarde na conversa - mas o modelo de Markov não tem qualquer inerente mecanismo para selecionar ou produzir tais respostas.

  • um bot baseado em análise (por exemplo,ELIZA) geralmente tenta responder a (parte do) conteúdo semântico da entrada mais recente do usuário sem considerar significativamente as trocas anteriores.

Dito isto, você certamente pode adicione alguma quantidade de estado a um chatbot, independentemente do modelo de análise de entrada e síntese de instruções que você está usando.Como fazer isso depende muito do que você deseja realizar com sua declaração de estado, e isso não está muito claro na sua pergunta.Algumas idéias gerais, no entanto:

  • Crie uma pilha de palavras-chave.À medida que seu humano oferece informações, analise as palavras-chave de suas afirmações/perguntas e jogue essas palavras-chave em algum tipo de pilha.Quando o seu chatbot não consegue encontrar algo atraente para responder na entrada mais recente - ou, talvez, apenas aleatoriamente, para misturar as coisas - volte para a sua pilha, pegue uma palavra-chave anterior e use-a para semear o seu próximo síntese.Para ganhar pontos extras, faça com que o bot reconheça explicitamente que está voltando a um assunto anterior, por exemplo.“Espere, HUMANO, antes você mencionou foo.[Frase semeada por foo]".

  • Construa uma lógica de diálogo semelhante a RPG no bot.Ao analisar a entrada humana, alterne sinalizadores para prompts de conversa específicos ou conteúdo do usuário e altere condicionalmente o que o chatbot pode falar ou como ele se comunica.Por exemplo, um chatbot irritado (ou repreendendo, ou rindo) com linguagem chula é bastante comum;um chatbot que será ativado e condicionalmente permanecer assim até pedir desculpas a, seria uma variação interessante com estado disso.Mude a saída para MAIÚSCULAS, acrescente retórica de confronto, exigências ou soluços, etc.

Você pode esclarecer um pouco o que deseja que o estado o ajude a realizar?

Imagine uma rede neural com recursos de análise em cada nó ou neurônio.Dependendo das regras e dos resultados da análise, os neurônios disparam.Se certos neurônios dispararem, você terá uma boa ideia sobre o tópico e a semântica da questão e, portanto, poderá dar uma boa resposta.

A memória é feita guardando os assuntos abordados em uma sessão, somando-se ao disparo para a próxima pergunta e, portanto, orientando o processo de seleção de possíveis respostas ao final.

Mantenha suas regras e padrões em uma base de conhecimento, mas compile-os na memória no momento do início, com um neurônio por regra.Você pode projetar sinapses usando algo como ouvintes ou funções de evento.

Eu acho que você pode olhar o código para Excêntrico, e IIRC também usa cadeias de Markov.

Confira também o citações excêntricas, eles foram apresentados no Coding Horror há pouco tempo e alguns são hilários.

Acho que para iniciar esse projeto seria bom ter um banco de dados com questões (organizado em forma de árvore.Em cada nó, uma ou mais perguntas).Estas questões deverão ser respondidas com “sim” ou “não”.

Se o bot começar a questionar, ele poderá começar com qualquer pergunta do seu banco de dados de perguntas marcadas como pergunta inicial.A resposta é o caminho para o próximo nó da árvore.

Editar:Aqui está um exemplo escrito em Ruby com o qual você pode começar: rubyBOT

programa de chatbot ingênuo.Sem análise, sem inteligência, apenas um arquivo de treinamento e uma saída.

Primeiro treina-se num texto e depois utiliza os dados desse treino para gerar respostas à entrada do interlocutor.O processo de treinamento cria um dicionário onde cada chave é uma palavra e o valor é uma lista de todas as palavras que seguem essa palavra sequencialmente em qualquer lugar do texto de treinamento.Se uma palavra aparecer mais de uma vez nesta lista, isso reflete e é mais provável que seja escolhida pelo bot, não há necessidade de coisas probabilísticas, apenas faça isso com uma lista.

O bot escolhe uma palavra aleatória de sua entrada e gera uma resposta escolhendo outra palavra aleatória que foi considerada sucessora de sua palavra retida.Em seguida, ele repete o processo, encontrando um sucessor para aquela palavra e continuando iterativamente até achar que foi dito o suficiente.Ele chega a essa conclusão parando em uma palavra anterior ao sinal de pontuação no texto de treinamento.Em seguida, ele retorna ao modo de entrada novamente para permitir que você responda e assim por diante.

Não é muito realista mas desafio qualquer um a fazer melhor em 71 linhas de código!!Este é um grande desafio para qualquer Pythonista iniciante, e eu só gostaria de poder abrir o desafio para um público mais amplo do que o pequeno número de visitantes que recebo neste blog.Para codificar um bot que é sempre garantido como gramatical deve certamente estar mais próximo de várias centenas de linhas. Simplifiquei enormemente apenas tentando pensar na regra mais simples para dar ao computador uma mera tentativa de ter algo a dizer.

Suas respostas são bastante impressionistas, para dizer o mínimo!Além disso, você deve colocar o que diz entre aspas simples.

Usei Guerra e Paz para meu “corpus”, que levou algumas horas para o treinamento, use um arquivo mais curto se estiver impaciente…

aqui está o treinador

#lukebot-trainer.py
import pickle
b=open('war&peace.txt')
text=[]
for line in b:
    for word in line.split():
        text.append (word)
b.close()
textset=list(set(text))
follow={}
for l in range(len(textset)):
    working=[]
    check=textset[l]
    for w in range(len(text)-1):
        if check==text[w] and text[w][-1] not in '(),.?!':
            working.append(str(text[w+1]))
    follow[check]=working
a=open('lexicon-luke','wb')
pickle.dump(follow,a,2)
a.close()

aqui está o robô

#lukebot.py
import pickle,random
a=open('lexicon-luke','rb')
successorlist=pickle.load(a)
a.close()
def nextword(a):
    if a in successorlist:
        return random.choice(successorlist[a])
    else:
        return 'the'
speech=''
while speech!='quit':
    speech=raw_input('>')
    s=random.choice(speech.split())
    response=''
    while True:
        neword=nextword(s)
        response+=' '+neword
        s=neword
        if neword[-1] in ',?!.':
            break
    print response

Você tende a ter uma sensação estranha quando diz algo que parece parcialmente fazer sentido.

Eu sugeriria olhar para as probabilidades bayesianas.Depois é só monitorar a sala de chat por um período de tempo para criar sua árvore de probabilidades.

Não tenho certeza se é isso que você está procurando, mas existe um programa antigo chamado ELIZA que poderia manter uma conversa pegando o que você disse e cuspindo de volta em você depois de realizar algumas transformações textuais simples.

Se bem me lembro, muitas pessoas estavam convencidas de que estavam “conversando” com uma pessoa real e tiveram conversas longas e elaboradas com ela.

Se você está apenas brincando, eu acredito Pidgin permite que você crie um script de comportamento no estilo de bate-papo.Parte da estrutura provavelmente aborda o estado de quem enviou a mensagem e quando, e você deseja manter um registro do estado interno do seu bot para cada uma das últimas N mensagens.As futuras decisões dos estados poderiam ser codificadas com base na inspeção dos estados anteriores e no conteúdo das mensagens mais recentes.Ou você poderia fazer algo como as cadeias de Markov discutidas e usá-las tanto para análise quanto para geração.

Se você não precisar de um bot de aprendizagem, use AIML (http://www.aiml.net/) provavelmente produzirá o resultado desejado, pelo menos no que diz respeito à entrada de análise do bot e às respostas com base nela.

Você reutilizaria ou criaria "cérebros" feitos de XML (no formato AIML) e os analisaria/executaria em um programa (analisador).Existem analisadores feitos em vários idiomas diferentes para você escolher e, até onde sei, o código parece ser de código aberto na maioria dos casos.

Você pode usar o "ChatterBot" e hospedá-lo localmente usando - 'flask-chatterbot-master"

Links:

  1. [Instalação do ChatBot]https://chatterbot.readthedocs.io/en/stable/setup.html
  2. [Hospedar localmente usando - flask-chatterbot-master]: https://github.com/chamkank/flask-chatterbot

Saúde,

Ratnakar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top