[PYTHON] Twitter schwört Abstoßungsmaschine (stärkste Version)

Ich habe mich gefragt, weil der Artikel "Twitter Spoofing Injury Repellent Machine", den ich früher an Qiita geschrieben habe, gut war, aber LGTM war träge. Ich habe mir die Kraft des tiefen Lernens geliehen, weil ich dachte, es wäre mühsam, die verleumderischen Wörter einzeln in das Array aufzunehmen. Der Zweck dieses Artikels ist der gleiche wie beim letzten Mal

Retten Sie SNS-Verleumdungen mit der Kraft der Technologie

ist Lass uns gehen! !! !!

Vorherige Kenntniss

Erfahren Sie Vorkenntnisse im vorherigen Artikel und fahren Sie fort Twitter schwört Abwehrmittel

Lassen Sie uns eine Verleumdungsidentifikations-KI machen

Erstellen Sie ein Modell mit word2vec, RNN (LSTM). Die Daten verwenden den Datensatz "umich-sentiment-train.txt", der häufig für die Reputationsanalyse verwendet wird.

word2vec Modell

Erstellen Sie mit Keras. word2vec ist ein Algorithmus, der menschliche Wörter in einen Vektor (eine Zahl) in einem Wort einfügt.

    word2vec_model = Sequential()
    word2vec_model.add(Embedding(input_dim=vocab_size, output_dim=EMBEDDING_SIZE,
                                 embeddings_initializer='glorot_uniform',
                                 input_length=WINDOW_SIZE * 2))
    word2vec_model.add(Lambda(lambda x: K.mean(x, axis=1), output_shape=(EMBEDDING_SIZE,)))
    word2vec_model.add(Dense(vocab_size, kernel_initializer='glorot_uniform', activation='softmax'))

    word2vec_model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=["accuracy"])
    word2vec_model.fit(Xtrain, ytrain, batch_size=BATCH_SIZE, epochs=NUM_EPOCHS, validation_data=(Xtest, ytest))
    # evaluate
    word2vec_score, word2vec_acc = word2vec_model.evaluate(Xtest, ytest, batch_size=BATCH_SIZE)
    print("word2vec Test score: {:.3f}, accuracy: {:.3f}".format(word2vec_score, word2vec_acc))
    # get embedding_weights
    embedding_weights = word2vec_model.layers[0].get_weights()[0]

RNN (LSTM) Modell

RNN (LSTM) ist ein AI-Modell, das auf die Verarbeitung von Zeitreihendaten spezialisiert ist. Es wird auch auf Aktienkursvorhersagen und maschinelle Übersetzung angewendet.

    rnn_model = Sequential()
    rnn_model.add(Embedding(vocab_size, EMBEDDING_SIZE, input_length=MAX_SENTENCE_LENGTH,
                            weights=[embedding_weights], trainable=True))
    rnn_model.add(Dropout(0.5))
    rnn_model.add(LSTM(HIDDEN_LAYER_SIZE, dropout=0.5, recurrent_dropout=0.5))
    rnn_model.add(Dense(1))
    rnn_model.add(Activation("sigmoid"))

    rnn_model.compile(loss="binary_crossentropy", optimizer="adam",
                      metrics=["accuracy"])
    rnn_model.fit(Xtrain, ytrain, batch_size=BATCH_SIZE, epochs=NUM_EPOCHS, validation_data=(Xtest, ytest))
    # evaluate
    rnn_score, rnn_acc = rnn_model.evaluate(Xtest, ytest, batch_size=BATCH_SIZE)
    print("rnn Test score: {:.3f}, accuracy: {:.3f}".format(rnn_score, rnn_acc))
    # save model
    rnn_model.save(os.path.join(DATA_DIR, "sentence_analyzing_rnn.hdf5"))
rnn_model.add(Embedding(vocab_size, EMBEDDING_SIZE, input_length=MAX_SENTENCE_LENGTH,
                            weights=[embedding_weights], trainable=True))

Fahren Sie hier mit dem Lernen fort, indem Sie das zuvor mit word2vec erhaltene Gewicht verwenden und es als "satz_analyzing_rnn.hdf5" speichern.

"Twitter API + Fluchidentifikation AI" kombiniert

Kombinieren Sie diese mit der im vorherigen Artikel erwähnten Maschine zur Abwehr verleumderischer Verletzungen.

# coding=utf-8
import collections
import os
import json
import nltk
import codecs
from requests_oauthlib import OAuth1Session
from keras.models import Sequential, load_model
from keras.preprocessing import sequence

#Authentifizierungsprozess
CK = 'YOUR OWN'
CS = 'YOUR OWN'
AT = 'YOUR OWN'
ATS = 'YOUR OWN'
twitter = OAuth1Session(CK, CS, AT, ATS)

#Tweet Suchendpunkt
url = 'https://api.twitter.com/1.1/search/tweets.json'
#Benutzerblock-Endpunkt
url2 = 'https://api.twitter.com/1.1/blocks/create.json'
# Setting parameter
DATA_DIR = "./data"
MAX_FEATURES = 2000
MAX_SENTENCE_LENGTH = 40

if os.path.exists(os.path.join(DATA_DIR, "sentence_analyzing_rnn.hdf5")):
    # Read training data and generate word2index
    maxlen = 0
    word_freqs = collections.Counter()
    with codecs.open(os.path.join(DATA_DIR, "umich-sentiment-train.txt"), "r", 'utf-8') as ftrain:
        for line in ftrain:
            label, sentence = line.strip().split("\t")
            try:
                words = nltk.word_tokenize(sentence.lower())
            except LookupError:
                print("Englisth tokenize does not downloaded. So download it.")
                nltk.download("punkt")
                words = nltk.word_tokenize(sentence.lower())
            maxlen = max(maxlen, len(words))
            for word in words:
                word_freqs[word] += 1

    vocab_size = min(MAX_FEATURES, len(word_freqs)) + 2
    word2index = {x[0]: i + 2 for i, x in enumerate(word_freqs.most_common(MAX_FEATURES))}
    word2index["PAD"] = 0
    word2index["UNK"] = 1
    # load model
    model = load_model(os.path.join(DATA_DIR, "sentence_analyzing_rnn.hdf5"))
    #Parameter, die an den Endpunkt übergeben werden sollen
    target_account = '@hoge '  #Beantworteter Account
    keyword = '@' + target_account + 'exclude:retweets'  #RT ausgeschlossen

    params = {
        'count': 50,  #Anzahl der zu erhaltenden Tweets
        'q': keyword,  #Suchbegriff
    }
    req = twitter.get(url, params=params)

    if req.status_code == 200:
        res = json.loads(req.text)
        for line in res['statuses']:
            target_text = line['text'].replace(target_account, "")
            test_words = nltk.word_tokenize(target_text.lower())
            test_seqs = []
            for test_word in test_words:
                if test_word in word2index:
                    test_seqs.append(word2index[test_word])
                else:
                    test_seqs.append(word2index["UNK"])

            Xsent = sequence.pad_sequences([test_seqs], maxlen=MAX_SENTENCE_LENGTH)
            ypred = model.predict(Xsent)[0][0]
            if ypred < 0.5:
                params2 = {'user_id': line['user']['id']}  #Benutzer zu blockieren
                req2 = twitter.post(url2, params=params2)

                if req2.status_code == 200:
                    print("Blocked !!")
                else:
                    print("Failed2: %d" % req2.status_code)
    else:
        print("Failed: %d" % req.status_code)
else:
    print ("AI model doesn't exist")

#Hinweis: Die Twitter-API kann keine Suchtreffer für Rips erzielen, die älter als eine Woche sind
#Hinweis: Offensichtliche aggressive Risse treffen überhaupt nicht

Zuerst müssen wir das Wort in die ID einfügen, um das Modell auszuführen. Erstellen Sie also einen word2index. Geben Sie das beantwortete Konto an, empfangen Sie die Nachricht und leiten Sie sie an AI weiter. Es ist so kategorisiert, dass es nahe 0 ist, wenn es ein schlechtes Wort ist, und 1, wenn es ein Kompliment ist. Und wenn der Schwellenwert unter 0,5 liegt, wird das Konto als schlechtes Wort gesperrt.

Zusammenfassung

Da es schwierig ist, Japanisch in Wort-IDs umzuwandeln und es keinen hochwertigen Datensatz gibt, ist dieses Programm nur in Englisch verfügbar. Ich hoffe aufrichtig, dass dieses Programm der Welt helfen wird.

Das ist übrigens mein Twitter-Dreck. Fühlen Sie sich frei, mir eine Nachricht zu senden! https://twitter.com/downtownakasiya

Recommended Posts

Twitter schwört Abstoßungsmaschine (stärkste Version)
Twitter schwört Abstoßungsmaschine