introduzione
Elon Musk è diventato una sensazione su Internet negli ultimi anni, con le loro opinioni sul futuro, la sua personalità divertente e la passione per la tecnologia. Ormai lo conoscono tutti, O come quel tipo di macchina elettrica o come quel tizio che costruisce lanciafiamme. È per lo più attivo sul suo Twitter, dove condividi tutto, anche meme!
Ispira molti giovani nel settore IT, e volevo fare un piccolo progetto divertente, dove creeresti un'intelligenza artificiale che genererebbe testo in base ai tuoi post precedenti su Twitter. Volevo riassumere il suo stile e vedere che tipo di strani risultati avrebbe ottenuto.
Preparazione
I dati che sto usando sono stati presi direttamente dal twitter di Elon Musk, sia dai tuoi post che dalle tue risposte. Puoi scaricare il set di dati in questo Collegamento.
Importazione delle librerie:
importare flusso tensoriale come tf
a partire dal tensorflow.keras.preprocessing.sequence importare pad_sequences
a partire dal tensorflow.keras.layers importare Incorporamento, LSTM, Denso
a partire dal tensorflow.keras.preprocessing.text importare Gettoniera
a partire dal tensorflow.keras.models importare Sequenziale
a partire dal tensorflow.keras.optimizers importare Adamo
importare insensibile come per esempio
importare panda come pd
importare Rif
Ora creerò la funzione che rimuoverà tutti i collegamenti, gli hashtag, le etichette e tutte le cose che confonderanno il modello in modo che ci rimanga un testo pulito.
#importare i dati
data_path="C:/Utenti/Dejan/Download/elonmusk.csv"
data = pd.read_csv(percorso dati)
#Funzione per pulire il testo
def testo_pulito(testo):
'''Rendi il testo minuscolo, rimuovi il testo tra parentesi quadre,rimuovere i collegamenti,rimuovi la punteggiatura
e rimuovere le parole contenenti numeri.'''
testo = testo.inferiore()
#testo = testo.sostituisci('%','')
testo = re.sub('[.*?]', '', testo)
testo = re.sub('https?://S+|www.S+', '', testo)
testo = re.sub('<.*?>+', '', testo)
#testo = re.sub('[%S]' % ri.scappare(stringa.punteggiatura), '', testo)
testo = re.sub('n', '', testo)
testo = re.sub('w * dw *', '', testo)
testo = " ".aderire(filtro(lambda X:X[0]!="@", text.split()))
Restituzione testo
#Applica la funzione
dati['testo'] = dati['testo'].applicare(lambda X: testo_pulito(X))
dati = dati['testo']
Definiamo un tokenizer e applichiamolo al testo. Ecco come stiamo mappando tutte le parole nelle loro rappresentazioni numeriche. Lo facciamo perché le reti neurali non possono accettare stringhe. Se sei nuovo ad esso, c'è una grande serie su Youtube di Lawrence Moroney, che ti consiglio di controllare qui sotto:
tokenizer = tokenizzatore() tokenizer.fit_on_texts(dati) parole_totali = len(tokenizer.word_index) + 1 Stampa(parole_totali) #5952input_sequences = [] per linea in dati: token_list = tokenizer.texts_to_sequences([linea])[0] per io in gamma(1, len(token_list)): n_gram_sequence = token_list[:io+1] input_sequences.append(n_gram_sequence)
Ora dovremo definire max_length (tutti i dati devono essere riempiti a una lunghezza fissa, come con Convolutions), e abbiamo anche bisogno di convertire input_sequences in array numpy.
max_sequence_length = max([len(X) per X in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre'))
Creeremo sequenze di dati, dove useremo tutti gli elementi tranne l'ultimo come nostra X, e l'ultimo elemento come y, dei nostri dati. Cosa c'è di più, il nostro ed è una rappresentazione unica di total_words, che a volte può essere una grande quantità di dati (se total_words è 5952, ciò significa che ognuno e ha la forma (5952,))
# crea predittori ed etichetta
xs, etichette = input_sequences[:,:-1],input_sequences[:,-1]
ys = tf.keras.utils.to_categorical(etichette, num_classes=parole_totale)
Modello
Di seguito la configurazione del nostro modello.
modello = Sequenziale() modello.aggiungi(Incorporamento(parole_totali, 80, input_length=max_sequence_length-1)) modello.aggiungi(LSTM(100, return_sequences=Vero)) modello.aggiungi(LSTM(50)) modello.aggiungi(tf.keras.layers.Dropout(0.1)) modello.aggiungi(Denso(parole_totale/20)) modello.aggiungi(Denso(parole_totali, attivazione='softmax')) modello.riepilogo()Modello: "sequenziale_1" _________________________________________________________________ Strato (genere) Parametro forma di output # ================================================== =============== incorporamento_1 (Incorporamento) (Nessuno, 56, 80) 476160 _________________________________________________________________ lstm_2 (LSTM) (Nessuno, 56, 100) 72400 _________________________________________________________________ lstm_3 (LSTM) (Nessuno, 50) 30200 _________________________________________________________________ dropout_1 (RitirarsiIl "ritirarsi" 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...) (Nessuno, 50) 0 _________________________________________________________________ densa_2 (Denso) (Nessuno, 297) 15147 _________________________________________________________________ densa_3 (Denso) (Nessuno, 5952) 1773696 ================================================== =============== Parametri totali: 2,367,603 Parametri addestrabili: 2,367,603 Parametri non addestrabili: 0
Ho provato un paio di ottimizzatori e ho scoperto che Adam funziona meglio per questo esempio. Costruiamo ed eseguiamo il modello:
modello.compila(perdita="categorical_crossentropy",
ottimizzatore="Adamo",
metriche=['precisione'])
storia = modello.fit(xs, sì, epoche=200, verboso=1)
#Produzione
EpocaEpoch 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/passo - perdita: 0.7377 - precisione: 0.8031
Epoca 197/200
1026/1026 [==============================] - 12S 12ms/passo - perdita: 0.7363 - precisione: 0.8025
Epoca 198/200
1026/1026 [==============================] - 12S 12ms/passo - perdita: 0.7236 - precisione: 0.8073
Epoca 199/200
1026/1026 [==============================] - 19S 18ms/passo - perdita: 0.7147 - precisione: 0.8083
Epoca 200/200
1026/1026 [==============================] - 12S 12ms/passo - perdita: 0.7177 - precisione: 0.8070
Creiamo un 'for loop', che genererà un nuovo testo, in base a seed_text e al numero di parole che definiremo. Questa parte del codice può sembrare un po' intimidatoria, ma una volta che hai letto attentamente ogni riga, vedrai che abbiamo già fatto qualcosa di simile prima.
per _ in gamma(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_length - 1, padding='pre')
predetto = np.argmax(model.predict(token_list), asse=-1)
output_word = ""
per parola, indice in tokenizer.word_index.items():
Se indice == previsto:
output_word = parola
rottura
seed_text += " " + output_word
Ora è il momento di giocare con il nostro modello. Oh!
seed_text = "Lo spazio è grande"
next_words = 20
Lo spazio è una grande fusione di gatti, un sacco di civiltà da parte di spacex sta facendo alcuni mesi di drago è intenso come noi
seed_text = "penso ai fiori"
next_words = 30
Penso ai fiori che in futuro sono limitati in quanto potresti forzarlo brutalmente con le petroliere in un'orbita terrestre bassa che è probabilmente più veloce della temperatura del liquido nell'anno che possiamo avere
seed_text = "voglio colonizzare Giove"
next_words = 40
voglio colonizzare giove essere parole solo essere ordine a zero futuro immediato né possiamo prevedere con precisione quali problemi incontreremo a breve termine a livello di grana fine con in casa con una parte umana di noi
Riepilogo
Lo spazio è un'ottima combinazione di gatti !? Chi lo avrebbe saputo! Come potete vedere, i risultati che dà il modello sono sciocchi e non hanno molto senso. Al igual que con todos los modelos de apprendimento profondoApprendimento profondo, Una sottodisciplina dell'intelligenza artificiale, si affida a reti neurali artificiali per analizzare ed elaborare grandi volumi di dati. Questa tecnica consente alle macchine di apprendere modelli ed eseguire compiti complessi, come il riconoscimento vocale e la visione artificiale. La sua capacità di migliorare continuamente man mano che vengono forniti più dati lo rende uno strumento chiave in vari settori, dalla salute..., ci sono molte cose che potrebbero essere modificate per generare risultati migliori. lo lascio a te.