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 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.
--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".
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
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.
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.
Si vous avez un environnement Python, installez Twython et vous êtes prêt à partir.
$ pip3 install twython==3.4.0
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()
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.
Python 3.6.0 (default, Dec 29 2016, 18:49:32) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
twython==3.4.0
Recommended Posts