Jujubot: Implementando um twitter bot da Vovó Juju

Introdução

O quê?

História e tipos

Bot: software robot

Bot: software robot

Bot: software robot

Bot: software robot

Design e arquitetura de bots

Chatbot

Chatbot: arquitetura

Chatbot: técnicas de design

Modelagem da Vovó

Personagem como um caso

Vovo Juju

Cadeias de Markov

Matriz de transição

Matriz de transição


      Az      Vm      Vd      Az      1/3      1/3      1/3      Vm      1/3      1/3      1/3      Vd      1/3      1/3      1/3     

Um algoritmo de cadeia de Markov

Gerando a cadeia

Gerando sentença


COLOQUE como chave inicial ( w 1 ,  w 2 )
IMPRIMA ( w 1 ,  w 2 )
ENQUANTO {PALAVRA DE PARADA} não estiver na chave:

    ESCOLHA ALEATOREAMENTE  w 3 , dentre palavras sucessoras de ( w 1 ,  w 2 )
    IMPRIMA  w 3 
    COLOQUE ( w 2 ,  w 3 ) como a proxima chave

FIM ENQUANTO

    
def generate_text(seed=None, print_chain=False, chain_length=2):
    statements = get_statements('juju.json')
    chains = get_chains(statements,
                        chain_length=chain_length)

    if not seed:
        index = random.randint(0, len(chains))
        seed = list(chains.keys())[index]

    if print_chain:
        pprint(chains)

    return generate_statement(seed, chains)
    
    

    
def generate_statement(seed, chains):
    words = list(seed)
    words[0] = words[0].title()
    key = seed
    while '\x02' not in key:
        next_word = random.choice(chains[key])
        words = words + [next_word]
        key = key[-(len(key) - 1):] + (next_word, )

        return ' '.join(words)
    
    

    

# mapeamento de contexto
if part_of_speech['pronoun'] == 'você' and part_of_speech['verb'] == 'gosta':
    seed = ('eu', 'gosto')

elif part_of_speech['pronoun'] == 'eu' and part_of_speech['noun'] == 'fome':
    article = random.choice(['um', 'uma'])
    seed = ('come', article)

elif part_of_speech['pronoun'] == 'eu' and part_of_speech['noun'] == 'ninja'
    and part_of_speech['verb'] == 'quero':
    seed = ('ninja', 'so')
# ...

return generate_statement(seed, chains)

    
    

Twitter

    

consumer_key = os.environ.get('JUJU_CONSUMER_KEY', '')
consumer_secret = os.environ.get('JUJU_CONSUMER_SECRET', '')
access_token = os.environ.get('JUJU_TOKEN', '')
access_token_secret = os.environ.get('JUJU_TOKEN_SECRET', '')

consumer = (consumer_key, consumer_secret)
access = (access_token, access_token_secret)


consumer, access = get_credentials()
auth = tweepy.OAuthHandler(*consumer)
auth.set_access_token(*access)

api = tweepy.API(auth)

    
    

    
def post_random_tweet():
    """ Post a tweet in Juju's timeline"""
    logger.info('Posting tweet...')
    output = generate_text()

    try:
        logger.info('Sending to API')
        status = api.update_status(output)
        logger.info('Created tweet with id = %s' % str(status.id))
        return status.id
    except TweepError as e:
        logger.info('An error occurred')
        logger.debug(e.reason)
        logger.error(e)
    
    

Referências

Questionamentos