Sammeln Sie japanische Tweets, die keine Bilder, URLs oder Antworten in Python enthalten

Hintergrund

Ich wollte also viele japanische Sätze für maschinelles Lernen Ich habe beschlossen, viele Tweets auf der [Streaming API] von Twitter (https://dev.twitter.com/streaming/reference/get/statuses/sample) zu sammeln.

Selbst wenn ich es nicht selbst gesammelt hätte, wenn es eine Datei von jemandem gab, der irgendwo dasselbe tat, dachte ich, ich würde es verwenden, aber nachdem ich einige Minuten bei Google gesucht hatte, konnte ich nicht die richtige finden. Da es der Beginn des Schreibens im Jahr 2017 war, habe ich es selbst geschrieben.

Ich benutze eine Bibliothek namens Twython. (Früher habe ich Tweepy verwendet, aber anscheinend ist Twython heutzutage beliebter.)

Tweets, die Sie ausschließen möchten

Ich habe diese Tweets ausgeschlossen, weil ich dachte, sie wären nicht für die Verwendung als Korpusmaterial geeignet.

Datei Format

--LF begrenzt durch 1 Zeile 1 Tweet

Es ist im Format.

Auf diese Weise können Sie die Zeilenumbruchinformationen später belassen und die Handhabung über das Programm "1 Zeile 1 Tweet" vereinfachen.

Wie benutzt man

Wenn Sie es so ausführen, wird es in die Standardausgabe ausgegeben. In diesem Beispiel endet es, wenn Sie 10 gültige Tweets erhalten. (Sie können diese Nummer mit der Option -n angeben.)

$ python tweetcorpus.py -n 10

Anwendung

Wenn Sie so schälen, können Sie den Fehler fast unbegrenzt fortsetzen, auch wenn unterwegs ein Fehler vorliegt. Sie können den Fortschritt visuell sehen, da Sie TTY mit "Tee" erhalten. Da gzip geleitet wird, ist es ein wenig sicher, eine große Anzahl von Tweets zu sammeln.

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

(Informationen zur in ↑ verwendeten gzip-Kombination finden Sie unter Gzip-komprimierte Textdateien können mit cat verbunden werden) (Informationen zur in ↑ verwendeten Python-Option -u finden Sie unter Option zum Deaktivieren des stdout / stderr-Puffers in Python)

Persönlich bevorzuge ich den Stil, das Programm selbst zu vereinfachen und es mit Pipes zu verbinden, anstatt das gzip-Modul für jede Programmiersprache zu verwenden.

Umgebungsvariable

Das OAuth-Token für die Twitter-API wird aus den Umgebungsvariablen "APP_KEY", "APP_SECRET", "OAUTH_TOKEN", "OAUTH_TOKEN_SECRET" gelesen.

Erstellen Sie eine Anwendung auf Twitter Bereiten Sie die folgende Datei vor

.env


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

Lass es uns im Voraus lesen.

Vorbereitung

Wenn Sie eine Python-Umgebung haben, installieren Sie Twython und Sie können loslegen.

$ pip3 install twython==3.4.0

Quelle

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:
            #Andere als Tweet-Informationen ausschließen(Benachrichtigung etc.)
            return
        if 'retweeted_status' in tweet:
            #Retweets ausschließen
            return
        if any(tweet['entities'].values()):
            '''
            tweet.entities.url
            tweet.entities.media
            tweet.entities.symbol
Schließen Sie Tweets aus, die Informationen enthalten, die nicht allein durch die Verarbeitung natürlicher Sprache verarbeitet werden können
            '''
            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()

Umgebung

Ich habe es mit der neuesten Version von Python 3.6 versucht, aber ich denke, es wird funktionieren, wenn Twython auf 3 Serien installiert werden kann.

Recommended Posts

Sammeln Sie japanische Tweets, die keine Bilder, URLs oder Antworten in Python enthalten
So sammeln Sie Bilder in Python
Ein Python-Einzeiler, der Json hübsch druckt. Entkomme nicht Japanisch.
Laden Sie Bilder von der URL mit Pillow in Python 3
Schlüsseleingabe, die nicht auf Schlüsseleingabe in Python wartet
Japanische Ausgabe mit Python
Veröffentlichung einer Bibliothek, die Zeichendaten in Python-Bildern verbirgt
Sammeln Sie Tweets mit tweepy in Python und speichern Sie sie in MongoDB
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen