[PYTHON] Machine de répulsion des jurons Twitter

Je me demandais parce que le LGTM était lent même si l'article «Twitter jurant de répulser la machine» que j'ai écrit à Qiita plus tôt était bon. J'ai emprunté le pouvoir du Deep Learning parce que je pensais que ce serait un problème de mettre les mots calomnieux dans le tableau un par un. Le but de cet article est le même que la dernière fois

Sauvez la calomnie SNS avec la puissance de la technologie

est Allons-y! !! !!

Connaissance préalable

Apprenez les connaissances préalables dans l'article précédent et continuez Machine répulsive des jurons Twitter

Faisons une IA d'identification de calomnie

Créez un modèle en utilisant word2vec, RNN (LSTM). Les données utilisent un ensemble de données populaire pour l'analyse de réputation appelé "umich-sentiment-train.txt".

modèle word2vec

Créez avec Keras. word2vec est un algorithme qui met des mots humains dans un vecteur (nombre) dans un mot.

    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]

Modèle RNN (LSTM)

RNN (LSTM) est un modèle d'IA spécialisé dans le traitement des données de séries chronologiques. Il est également appliqué à la prévision du cours des actions et à la traduction automatique.

    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))

Ici, procédez à l'apprentissage en utilisant le poids obtenu avec word2vec plus tôt et enregistrez-le sous "phrase_analyzing_rnn.hdf5".

"API Twitter + IA d'identification sous serment" combinées

Combinez-les avec la machine à repousser les blessures calomnieuses mentionnées dans l'article précédent.

# 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

#Processus d'authentification
CK = 'YOUR OWN'
CS = 'YOUR OWN'
AT = 'YOUR OWN'
ATS = 'YOUR OWN'
twitter = OAuth1Session(CK, CS, AT, ATS)

#Point de terminaison de recherche de Tweet
url = 'https://api.twitter.com/1.1/search/tweets.json'
#Point de terminaison du bloc utilisateur
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"))
    #Paramètres à transmettre au point final
    target_account = '@hoge '  #Compte répondu
    keyword = '@' + target_account + 'exclude:retweets'  #RT exclu

    params = {
        'count': 50,  #Nombre de tweets à obtenir
        'q': keyword,  #Mot-clé de recherche
    }
    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']}  #Utilisateurs à bloquer
                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")

#Remarque: l'API Twitter ne peut pas générer de résultats de recherche pour les déchirures datant de plus d'une semaine.
#Remarque: les déchirures agressives évidentes ne frappent pas en premier lieu

Tout d'abord, pour exécuter le modèle, il est nécessaire de mettre le mot dans l'ID, donc créez un word2index. Spécifiez le compte répondu, recevez le message et transmettez-le à AI. Les mauvais mots sont classés comme 0 et les compliments sont classés comme proches de 1. Et si le seuil est inférieur à 0,5, le compte sera bloqué comme un mauvais mot.

Résumé

Comme il est difficile de convertir le japonais en identifiants de mots et qu'il n'y a pas d'ensemble de données de haute qualité, ce programme n'est disponible qu'en anglais. J'espère sincèrement que ce programme sera d'une certaine aide pour le monde.

Au fait, c'est ma saleté Twitter. N'hésitez pas à m'envoyer un message! https://twitter.com/downtownakasiya

Recommended Posts

Machine de répulsion des jurons Twitter
Machine de répulsion de serment Twitter