Einführung
Elon Musk ist in den letzten Jahren zu einer Internet-Sensation geworden, mit ihrem Blick in die Zukunft, seine lustige Persönlichkeit und seine Leidenschaft für Technik. Inzwischen kennt ihn jeder, Entweder wie diese Art von Elektroauto oder wie der Typ, der Flammenwerfer baut. Er ist hauptsächlich auf seinem Twitter aktiv, wo du alles teilst, Sogar Meme!
Er inspiriert viele junge Leute in der IT-Branche, und ich wollte ein lustiges kleines projekt machen, wo Sie eine KI erstellen würden, die Text basierend auf Ihren vorherigen Posts auf Twitter generiert. Ich wollte ihren Stil zusammenfassen und sehen, welche seltsamen Ergebnisse sie erzielen würde.
Vorbereitung
Die Daten, die ich verwende, stammen direkt von Elon Musks Twitter, sowohl aus deinen Beiträgen als auch aus deinen Antworten. Den Datensatz können Sie hier herunterladen Verknüpfung.
Importieren der Bibliotheken:
importieren Tensorfluss wie tf
von tensorflow.keras.preprocessing.sequence importieren pad_sequenzen
von tensorflow.keras.layers importieren Einbettung, LSTM, Dicht
von tensorflow.keras.preprocessing.text importieren Tokenisierer
von tensorflow.keras.models importieren Sequentiell
von tensorflow.keras.optimizers importieren Adam
importieren numpy wie z.B
importieren Pandas wie pd
importieren betreffend
Jetzt werde ich die Funktion erstellen, die alle Links entfernt, die Hashtags, die Etiketten und all die Dinge, die das Modell verwirren, so dass wir einen sauberen Text haben.
#Importieren Sie die Daten
data_path="C:/Benutzer/Dejan/Downloads/elonmusk.csv"
data = pd.read_csv(Datenweg)
#Funktion zum Bereinigen des Textes
def clean_text(Text):
'''Text in Kleinbuchstaben schreiben, Text in eckigen Klammern entfernen,Links entfernen,Satzzeichen entfernen
und entfernen Sie Wörter, die Zahlen enthalten.'''
text = text.lower()
#text = text.ersetzen('%','')
text = re.sub('[.*?]', '', Text)
text = re.sub('https?://S+|www.S+', '', Text)
text = re.sub('<.*?>+', '', Text)
#text = re.sub('[%S]' % wieder entkommen(Zeichenfolge.Interpunktion), '', Text)
text = re.sub('n', '', Text)
text = re.sub('w*dw*', '', Text)
Text = " ".beitreten(Filter(Lambda x:x[0]!="@", text.split()))
Rückkehr Text
#Übernehmen Sie die Funktion
Daten['Text'] = Daten['Text'].anwenden(Lambda x: clean_text(x))
Daten = Daten['Text']
Lassen Sie uns einen Tokenizer definieren und auf den Text anwenden. Auf diese Weise bilden wir alle Wörter in ihre numerischen Darstellungen ab. Wir tun das, weil neuronale Netze keine Strings akzeptieren können. Wenn du neu dabei bist, es gibt eine tolle Serie auf Youtube von Lawrence Moroney, Ich schlage vor, Sie überprüfen unten:
Tokenisierer = Tokenisierer() tokenizer.fit_on_texts(Daten) total_words = len(tokenizer.word_index) + 1 drucken(total_words) #5952input_sequences = [] zum Leitung In Daten: token_list = tokenizer.texts_to_sequences([Leitung])[0] zum ich In Bereich(1, len(token_list)): n_gram_sequence = token_list[:ich+1] input_sequences.append(n_gram_sequence)
Jetzt müssen wir max_length definieren (alle Daten müssen auf eine feste Länge aufgefüllt werden, wie bei Convolutions), und wir müssen auch input_sequences in ein numpy-Array konvertieren.
max_sequence_length = max([len(x) zum x In Eingabesequenzen])
input_sequences = np.array(pad_sequenzen(Eingabesequenzen, maxlen=max_sequence_length, padding='pre'))
Wir werden Datensequenzen erstellen, wobei wir alle Elemente außer dem letzten als unser X verwenden werden, und das letzte Element als das y, unserer Daten. Was ist mehr, unsere und ist eine einzigartige Darstellung von total_words, was manchmal eine große Datenmenge sein kann (wenn total_words ist 5952, das bedeutet, dass jedes und die Form hat (5952,))
# Prädiktoren und Label erstellen
xs, label = input_sequences[:,:-1],Eingabesequenzen[:,-1]
ys = tf.keras.utils.to_categorical(Etiketten, num_classes=total_words)
Modell
Unten ist die Konfiguration unseres Modells.
Modell = Sequentiell() model.add(Einbettung(total_words, 80, input_length=max_sequence_length-1)) model.add(LSTM(100, return_sequences=Wahr)) model.add(LSTM(50)) model.add(tf.keras.layers.Dropout(0.1)) model.add(Dicht(total_words/20)) model.add(Dicht(total_words, Aktivierung='Softmax')) Modell.Zusammenfassung()Modell: "sequentiell_1" ________________________________________________________________________________ Schicht (Typ) Parameter der Ausgabeform # ================================================ =============== Einbettung_1 (Einbettung) (Keiner, 56, 80) 476160 ________________________________________________________________________________ lstm_2 (LSTM) (Keiner, 56, 100) 72400 ________________________________________________________________________________ lstm_3 (LSTM) (Keiner, 50) 30200 ________________________________________________________________________________ dropout_1 (Aussteigen) (Keiner, 50) 0 ________________________________________________________________________________ dicht_2 (Dicht) (Keiner, 297) 15147 ________________________________________________________________________________ dicht_3 (Dicht) (Keiner, 5952) 1773696 ================================================ =============== Gesamtparameter: 2,367,603 Trainierbare Parameter: 2,367,603 Nicht trainierbare Parameter: 0
Habe ein paar Optimierer ausprobiert und festgestellt, dass Adam für dieses Beispiel am besten funktioniert. Lassen Sie uns das Modell erstellen und ausführen:
model.compile(Verlust="kategoriale_Kreuzentropie",
Optimierer="Adam",
Metriken=['Richtigkeit'])
Geschichte = model.fit(xs, y, Epochen=200, ausführlich=1)
#Ausgabe
Epoche 196/200
1026/1026 [==============================] - 12S 12ms/Schritt - Verlust: 0.7377 - Richtigkeit: 0.8031
Epoche 197/200
1026/1026 [==============================] - 12S 12ms/Schritt - Verlust: 0.7363 - Richtigkeit: 0.8025
Epoche 198/200
1026/1026 [==============================] - 12S 12ms/Schritt - Verlust: 0.7236 - Richtigkeit: 0.8073
Epoche 199/200
1026/1026 [==============================] - 19S 18ms/Schritt - Verlust: 0.7147 - Richtigkeit: 0.8083
Epoche 200/200
1026/1026 [==============================] - 12S 12ms/Schritt - Verlust: 0.7177 - Richtigkeit: 0.8070
Lassen Sie uns eine 'for-Schleife' erstellen, wodurch neuer Text generiert wird, basierend auf Seed_text und der Anzahl der Wörter, die wir definieren werden. Dieser Teil des Codes kann ein wenig einschüchternd wirken, aber wenn du jede Zeile sorgfältig gelesen hast, ihr werdet sehen, dass wir ähnliches schon mal gemacht haben.
zum _ In Bereich(next_words):
token_list = tokenizer.texts_to_sequences([same_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_length - 1, padding='pre')
vorhergesagt = np.argmax(model.predict(token_list), Achse=-1)
output_word = ""
zum Wort, Index In tokenizer.word_index.items():
Wenn Index == vorhergesagt:
Ausgabe_Wort = Wort
brechen
Seed_text += " " + Ausgabe_Wort
Jetzt ist es an der Zeit mit unserem Modell zu spielen. Beeindruckend!
same_text = "Platz ist groß"
next_words = 20
Der Weltraum ist eine große Verschmelzung von Katzen, die viel Zivilisation von spacex macht, ein paar Monate Drachen sind intensiv wie wir
same_text = "Ich denke an Blumen"
next_words = 30
Ich denke an Blumen, die in Zukunft begrenzt sind, da man sie mit Tankern in eine niedrige Erdumlaufbahn zwingen könnte, die wahrscheinlich schneller ist als die Flüssigkeitstemperatur im Jahr, die wir haben können
same_text = "Ich möchte Jupiter kolonisieren"
next_words = 40
ich will jupiter kolonisieren sein worte sind nur um die unmittelbare zukunft auf null zu setzen noch können wir selbst genau vorhersagen, auf welche probleme wir kurzfristig auf feinkörniger ebene mit ihm im haus mit einem menschlichen teil von uns stoßen werden
Zusammenfassung
Der Weltraum ist eine großartige Kombination von Katzen !? Wer hätte das gedacht! Wie du siehst, Die Ergebnisse, die das Modell liefert, sind albern und machen nicht viel Sinn. Wie bei allen Deep-Learning-Modellen, Es gibt viele Dinge, die geändert werden könnten, um bessere Ergebnisse zu erzielen. ich überlasse es dir.