Collectez les tweets japonais qui n'incluent pas d'images, d'URL ou de réponses en Python

Contexte

Je voulais beaucoup de phrases japonaises pour l'apprentissage automatique, alors J'ai décidé de collecter beaucoup de tweets sur [Streaming API] de Twitter (https://dev.twitter.com/streaming/reference/get/statuses/sample).

Même si je ne le collectais pas moi-même, s'il y avait un fichier de quelqu'un faisant la même chose quelque part, je pensais que je l'utiliserais, mais après avoir cherché sur Google pendant quelques minutes, je n'ai pas trouvé le bon. Comme c'était le début de l'écriture en 2017, je l'ai écrit moi-même.

J'utilise une bibliothèque appelée Twython. (J'utilisais Tweepy, mais apparemment Twython est plus populaire ces jours-ci.)

Tweets que vous souhaitez exclure

--Tweets contenant des images --Tweets avec URL --Tweets contenant des balises de hachage --Retweeter

J'ai exclu ces tweets parce que je pensais qu'ils n'étaient pas adaptés à une utilisation en tant que matériel de corpus.

Format de fichier

--LF délimité par 1 ligne 1 tweet

C'est dans le format.

En faisant cela, vous pouvez laisser les informations de saut de ligne plus tard, et vous pouvez le rendre facile à gérer à partir du programme "1 ligne 1 tweet".

Comment utiliser

Si vous l'exécutez comme ceci, il sortira sur la sortie standard. Dans cet exemple, il se termine lorsque vous obtenez 10 tweets valides. (Vous pouvez spécifier ce nombre avec l'option -n.)

$ python tweetcorpus.py -n 10

application

Si vous shell comme ça, même s'il y a une erreur sur le chemin, vous pouvez continuer à le prendre presque indéfiniment. Vous pouvez voir la progression visuellement car vous recevez un TTY avec tee. Puisque gzip est diffusé, il est un peu sûr de collecter un grand nombre de tweets.

$ while true; do python -u tweetcorpus.py -n 500 | tee /dev/tty | gzip -cn >> tweet.gz ; sleep 1 ; done

(Pour la combinaison gzip utilisée dans ↑, voir Les fichiers texte compressés par Gzip peuvent être connectés avec cat) (Pour l'option Python -u utilisée dans ↑, voir Option pour désactiver le tampon stdout / stderr en Python)

Personnellement, je préfère le style de simplification du programme lui-même et de le connecter avec des tuyaux, plutôt que d'utiliser le module gzip pour chaque langage de programmation.

Variable d'environnement

Le jeton OAuth pour l'API Twitter est lu à partir des variables d'environnement ʻAPP_KEY, ʻAPP_SECRET, ʻOAUTH_TOKEN, ʻOAUTH_TOKEN_SECRET.

Créer une application sur Twitter Préparez le fichier suivant

.env


#!/bin/sh
export APP_KEY='XXXXXXXXXXXXX'
export APP_SECRET='XXXXXXXXXXXXXXXXXXXX'
export OAUTH_TOKEN='XXXXX-XXXXXXXXXX'
export OAUTH_TOKEN_SECRET='XXXXXXXXXX'
source ./.env

Lisons-le à l'avance.

Préparation

Si vous avez un environnement Python, installez Twython et vous êtes prêt à partir.

$ pip3 install twython==3.4.0

La source

tweetcorpus.py


import argparse
import html
import os
import sys

from twython import TwythonStreamer


class CorpusStreamer(TwythonStreamer):

    def __init__(self, *args,
                 max_corpus_tweets=100,
                 write_file=sys.stdout):
        super().__init__(*args)
        self.corpus_tweets = 0
        self.max_corpus_tweets = max_corpus_tweets
        self.write_file = write_file

    def exit_when_corpus_tweets_exceeded(self):
        if self.corpus_tweets >= self.max_corpus_tweets:
            self.disconnect()

    def write(self, text):
        corpus_text = text.replace('\n', '\r')
        self.write_file.write(corpus_text + '\n')
        self.corpus_tweets += 1

    def on_success(self, tweet):
        if 'text' not in tweet:
            #Exclure les informations autres que les tweets(Notification etc.)
            return
        if 'retweeted_status' in tweet:
            #Exclure les retweets
            return
        if any(tweet['entities'].values()):
            '''
            tweet.entities.url
            tweet.entities.media
            tweet.entities.symbol
Exclure les tweets contenant des informations qui ne peuvent pas être gérées uniquement par le traitement du langage naturel
            '''
            return
        text = html.unescape(tweet['text'])
        self.write(text)
        self.exit_when_corpus_tweets_exceeded()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-n', '--number-of-corpus-tweets',
                        type=int, default=100)
    parser.add_argument('-o', '--outfile',
                        type=argparse.FileType('w', encoding='UTF-8'),
                        default=sys.stdout)
    parser.add_argument('-l', '--language', type=str, default='ja')

    app_key = os.environ['APP_KEY']
    app_secret = os.environ['APP_SECRET']
    oauth_token = os.environ['OAUTH_TOKEN']
    oauth_token_secret = os.environ['OAUTH_TOKEN_SECRET']

    args = parser.parse_args()
    stream = CorpusStreamer(app_key, app_secret,
                            oauth_token, oauth_token_secret,
                            max_corpus_tweets=args.number_of_corpus_tweets,
                            write_file=args.outfile)
    stream.statuses.sample(language=args.language)


if __name__ == '__main__':
    main()

environnement

Je l'ai essayé avec la dernière version de Python 3.6, mais je pense que cela fonctionnera si twython peut être installé sur la série 3.

Recommended Posts

Collectez les tweets japonais qui n'incluent pas d'images, d'URL ou de réponses en Python
Comment collecter des images en Python
Un one-liner Python qui imprime json json. N'échappez pas au japonais.
Charger des images à partir d'une URL à l'aide de Pillow dans Python 3
Entrée clé qui n'attend pas l'entrée clé en Python
Sortie japonaise avec Python
Publication d'une bibliothèque qui masque les données de caractères dans les images Python
Collectez les tweets en utilisant tweepy en Python et enregistrez-les dans MongoDB
Un ensemble de fichiers de script qui font wordcloud avec Python3