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
ist Lass uns gehen! !! !!
Erfahren Sie Vorkenntnisse im vorherigen Artikel und fahren Sie fort Twitter schwört Abwehrmittel
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.
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) 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.
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.
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