Introducción
Elon Musk se ha convertido en una sensación de Internet en los últimos años, con sus puntos de vista sobre el futuro, su personalidad divertida y su pasión por la tecnología. A estas alturas todo el mundo lo conoce, ya sea como ese tipo de autos eléctricos o como ese tipo que construye lanzallamas. Él es mayormente activo en su Twitter, donde comparte todo, ¡incluso memes!
Él inspira a muchos jóvenes en la industria de TI, y yo quería hacer un pequeño proyecto divertido, donde crearía una IA que generaría texto basado en sus publicaciones anteriores en Twitter. Quería resumir su estilo y ver qué tipo de resultados extraños obtendría.
Preparación
Los datos que estoy usando fueron extraídos directamente del twitter de Elon Musk, tanto de sus publicaciones como de sus respuestas. Puede descargar el conjunto de datos en este Enlace.
Importando las bibliotecas:
import tensorflow as tf
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import numpy as np
import pandas as pd
import re
Ahora voy a crear la función que eliminará todos los enlaces, los hashtags, las etiquetas y todas las cosas que confundirán al modelo para que nos quedemos con texto limpio.
#import the data
data_path="C:/Users/Dejan/Downloads/elonmusk.csv"
data = pd.read_csv(data_path)
#Function to clean the text
def clean_text(text):
'''Make text lowercase, remove text in square brackets,remove links,remove punctuation
and remove words containing numbers.'''
text = text.lower()
#text = text.replace('%','')
text = re.sub('[.*?]', '', text)
text = re.sub('https?://S+|www.S+', '', text)
text = re.sub('<.*?>+', '', text)
#text = re.sub('[%s]' % re.escape(string.punctuation), '', text)
text = re.sub('n', '', text)
text = re.sub('w*dw*', '', text)
text = " ".join(filter(lambda x:x[0]!="@", text.split()))
return text
#Apply the function
data['text'] = data['text'].apply(lambda x: clean_text(x))
data = data['text']
Definamos un tokenizador y aplíquelo al texto. Así es como estamos mapeando todas las palabras en sus representaciones numéricas. Hacemos eso porque las redes neuronales no pueden aceptar cadenas. Si eres nuevo en eso, hay una gran serie en Youtube de Lawrence Moroney, que te sugiero que consultes a continuación:
tokenizer = Tokenizer() tokenizer.fit_on_texts(data) total_words = len(tokenizer.word_index) + 1 print(total_words) #5952input_sequences = [] for line in data: token_list = tokenizer.texts_to_sequences([line])[0] for i in range(1, len(token_list)): n_gram_sequence = token_list[:i+1] input_sequences.append(n_gram_sequence)
Ahora tendremos que definir max_length (todos los datos deben rellenarse a una longitud fija, al igual que con Convolutions), y también debemos convertir input_sequences en una matriz numpy.
max_sequence_length = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre'))
Vamos a crear secuencias de datos, donde usaremos todos los elementos excepto el último como nuestra X, y el último elemento como la y, de nuestros datos. Además, nuestra y es una representación única de total_words, que a veces puede ser una gran cantidad de datos (si total_words es 5952, eso significa que cada y tiene la forma (5952,))
# create predictors and label
xs, labels = input_sequences[:,:-1],input_sequences[:,-1]
ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)
Modelo
A continuación se muestra la configuración de nuestro modelo.
model = Sequential() model.add(Embedding(total_words, 80, input_length=max_sequence_length-1)) model.add(LSTM(100, return_sequences=True)) model.add(LSTM(50)) model.add(tf.keras.layers.Dropout(0.1)) model.add(Dense(total_words/20)) model.add(Dense(total_words, activation='softmax')) model.summary()Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_1 (Embedding) (None, 56, 80) 476160 _________________________________________________________________ lstm_2 (LSTM) (None, 56, 100) 72400 _________________________________________________________________ lstm_3 (LSTM) (None, 50) 30200 _________________________________________________________________ dropout_1 (DropoutEl "dropout" se refiere a la deserción escolar, un fenómeno que afecta a muchos estudiantes a nivel global. Este término describe la situación en la que un alumno abandona sus estudios antes de completar su educación formal. Las causas del dropout son diversas, incluyendo factores económicos, sociales y emocionales. La reducción de la tasa de deserción es un objetivo importante para los sistemas educativos, ya que un mayor nivel educativo...) (None, 50) 0 _________________________________________________________________ dense_2 (Dense) (None, 297) 15147 _________________________________________________________________ dense_3 (Dense) (None, 5952) 1773696 ================================================================= Total params: 2,367,603 Trainable params: 2,367,603 Non-trainable params: 0
Probé un par de optimizadores y descubrí que Adam funciona mejor para este ejemplo. Compilemos y ejecutemos el modelo:
model.compile(loss="categorical_crossentropy",
optimizer="adam",
metrics=['accuracy'])
history = model.fit(xs, ys, epochs=200, verbose=1)
#Output
EpochEpoch es una plataforma que ofrece herramientas para la creación y gestión de contenido digital. Su enfoque se centra en facilitar la producción de multimedia, permitiendo a los usuarios colaborar y compartir información de manera eficiente. Con una interfaz intuitiva, Epoch se ha convertido en una opción popular entre profesionales y empresas que buscan optimizar su flujo de trabajo en la era digital. Su versatilidad la hace adecuada para diversas... 196/200
1026/1026 [==============================] - 12s 12ms/step - loss: 0.7377 - accuracy: 0.8031
Epoch 197/200
1026/1026 [==============================] - 12s 12ms/step - loss: 0.7363 - accuracy: 0.8025
Epoch 198/200
1026/1026 [==============================] - 12s 12ms/step - loss: 0.7236 - accuracy: 0.8073
Epoch 199/200
1026/1026 [==============================] - 19s 18ms/step - loss: 0.7147 - accuracy: 0.8083
Epoch 200/200
1026/1026 [==============================] - 12s 12ms/step - loss: 0.7177 - accuracy: 0.8070
Creemos un ‘bucle for’, que generará texto nuevo, basado en seed_text y la cantidad de palabras que definiremos. Esta parte del código puede parecer un poco intimidante, pero una vez que lea atentamente cada línea, verá que ya hemos hecho algo similar antes.
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_length - 1, padding='pre')
predicted = np.argmax(model.predict(token_list), axis=-1)
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
seed_text += " " + output_word
Ahora es el momento de jugar con nuestro modelo. ¡Guau!
seed_text = "Space is big"
next_words = 20
Space is big conflation of cats a lot of civilization by spacex is making a few months of dragon is intense as we
seed_text = "i think about flowers"
next_words = 30
i think about flowers that on the future it are limited as you could brute force it with tankers to low earth orbit that’s probably faster than liquid temp in year we can have
seed_text = "i want to colonize jupiter"
next_words = 40
i want to colonize jupiter be words just be order to zero immediate future nor can we ourselves accurately predict what issues we will encounter on a short term fine grained level with in the house with it with a human part of the us
Resumen
¿¡El espacio es una gran combinación de gatos !? ¡Quién lo hubiera sabido! Como puede ver, los resultados que da el modelo son tontos y no tienen mucho sentido. Al igual que con todos los modelos de aprendizaje profundoEl aprendizaje profundo, una subdisciplina de la inteligencia artificial, se basa en redes neuronales artificiales para analizar y procesar grandes volúmenes de datos. Esta técnica permite a las máquinas aprender patrones y realizar tareas complejas, como el reconocimiento de voz y la visión por computadora. Su capacidad para mejorar continuamente a medida que se le proporcionan más datos la convierte en una herramienta clave en diversas industrias, desde la salud..., hay muchas cosas que podrían modificarse para generar mejores resultados. Te lo dejo a ti.