[PYTHON] Tweet vos propres phrases en utilisant la chaîne de Markov

motivation

J'aime Twitter, alors j'ai pensé que si le programme générait automatiquement mes tweets, il le ferait pour moi même lorsque j'étais occupé.

[Evangelion] Essayez de générer automatiquement des lignes de type Asuka avec Deep Learning Quand je lis, il semble que la chaîne de Markov génère des phrases qui ressemblent plus à cela que le Deep Learning, alors j'ai créé un programme basé sur cette politique. ... ou plutôt, c'est la même chose que de le faire complètement ...

Shumai-kun (@shuumai) et le journal compressé (@asshuku) semblent également être des chaînes de Markov, alors peut-être que cette politique devrait convenir. ..

Prétraitement

Tous vos tweets précédents peuvent être téléchargés depuis le site officiel sous forme de fichier zip contenant json et csv. Téléchargez tout l'historique de vos tweets

Cette fois, nous utiliserons le tweets.csv obtenu à partir de cela. Étant donné que certains tweets incluent des réponses et des URL, il est nécessaire de les exclure afin de ne pas sauter involontairement des réponses ou de tweeter des URL inexistantes. Il est intéressant que des réponses involontaires soient envoyées, mais pour le moment.

Il semble que les pandas soient plus rapides pour lire les fichiers CSV, alors utilisez read_csv de pandas. Faites correspondre approximativement la réponse et la chaîne de caractères de l'URL et excluez-la.

preprocessing.py


import pandas as pd
import re

df = pd.read_csv('tweets.csv')

tweets = df['text']

replypattern = '@[\w]+'
urlpattern = 'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+'

processedtweets = []

for tweet in tweets:
    i = re.sub(replypattern, '', tweet)
    i = re.sub(urlpattern, '', i)
    if isinstance(i, str) and not i.split():
        pass
    else:
        processedtweets.append(i)

processedtweetsDataFrame = pd.Series(processedtweets)
newDF = pd.DataFrame({'text': processedtweetsDataFrame})

newDF.to_csv('processedtweets.csv')

Je voulais aussi exclure les tweets d'une application particulière (comme un outil de diagnostic), j'ai donc supprimé le `df ['source'] correspondant séparément.

Création d'une base de données de chaînes de Markov

J'avais déjà un package pour Python pour la génération de phrases par chaîne Markov, donc je l'ai utilisé. https://github.com/o-tomox/TextGenerator

Cependant, comme le package ci-dessus est écrit en série Python 2, je l'ai modifié en série 3 selon le cas.

Voici le code pour stocker les données du triplet du fichier CSV du tweet généré par le prétraitement dans la base de données.

storeTweetstoDB.py


from PrepareChain import *
import pandas as pd
from tqdm import tqdm

def storeTweetstoDB():
    
    if len(sys.argv) > 2:
        df = pd.read_csv(sys.argv[1])
    else:
        csvfilepath = input('tweets.csv filepath : ')
        df = pd.read_csv(csvfilepath)


    tweets = df['text']

    print(len(tweets))

    chain = PrepareChain(tweets[0])
    triplet_freqs = chain.make_triplet_freqs()
    chain.save(triplet_freqs, True)

    for i in tqdm(tweets[1:]):
        chain = PrepareChain(i)
        triplet_freqs = chain.make_triplet_freqs()
        chain.save(triplet_freqs, False)



if __name__ == '__main__':
    storeTweetstoDB()

Vous êtes maintenant prêt à générer automatiquement vos propres tweets. Lançons-le.

Générer un tweet

Tweettons en utilisant la base de données complète et l'API Twitter.

markovbot.py


import json
from requests_oauthlib import OAuth1Session
from GenerateText import GenerateText

def markovbot():
    keysfile = open('keys.json')
    keys = json.load(keysfile)
    oath = create_oath_session(keys)

    generator = GenerateText(1)

    tweetmarkovstring(oath, generator)

def create_oath_session(oath_key_dict):
    oath = OAuth1Session(
    oath_key_dict['consumer_key'],
    oath_key_dict['consumer_secret'],
    oath_key_dict['access_token'],
    oath_key_dict['access_token_secret']
    )
    return oath

def tweetmarkovstring(oath, generator):
    url = 'https://api.twitter.com/1.1/statuses/update.json'
    markovstring = generator.generate()
    params = {'status': markovstring+'[Est un faux]'}
    req = oath.post(url, params)

    if req.status_code == 200:
        print('tweet succeed!')
    else:
        print('tweet failed')


if __name__ == '__main__':
    markovbot()

Cette fois, des tweets ont été générés automatiquement en fonction de mon compte (@ hitsumabushi845). Voici les résultats. スクリーンショット 2017-08-21 12.31.31.png

Cela semble être toute une phrase ... Ou plutôt, c'était une phrase qui était dangereuse sans ajouter une sorte d'identifiant, donc dans le programme ci-dessus, «[faux]» est ajouté à la fin.

Après cela, si vous l'exécutez régulièrement avec un serveur ou un cron, vous pourrez créer Twitter pour toujours.

References

Recommended Posts

Tweet vos propres phrases en utilisant la chaîne de Markov
[Python] Implémentez votre propre classe de type liste à l'aide de collections.UserList
Appelez votre propre bibliothèque de langage C avec Go en utilisant cgo
Créez votre propre exception