jokegenerator / app.py
Preeti Dave
.
65dda27
import gradio as gr
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# Example jokes data (for training purposes)
jokes = [
"Why don't scientists trust atoms? Because they make up everything!",
"What do you call a fish with no eyes? Fsh.",
"Why did the bicycle fall over? Because it was two tired!",
"What did the left eye say to the right eye? Between you and me, something smells!",
"Parallel lines have so much in common. It's a shame they'll never meet.",
"I used to hate facial hair, but then it grew on me.",
"Why did the scarecrow win an award? Because he was outstanding in his field!",
"What do you call a lazy kangaroo? Pouch potato!",
"I'm reading a book about anti-gravity. It's impossible to put down!",
"What do you call a bear with no teeth? A gummy bear!",
"Why did the coffee go to the police? It got mugged.",
"I'm friends with 25 letters of the alphabet. I don't know why.",
"Why did the golfer wear two pairs of pants? In case he got a hole in one.",
"I told my wife she was drawing her eyebrows too high. She seemed surprised."
]
# 1. Tokenize the jokes
tokenizer = Tokenizer()
tokenizer.fit_on_texts(jokes)
total_words = len(tokenizer.word_index) + 1
# 2. Create input sequences for training the model
input_sequences = []
for joke in jokes:
token_list = tokenizer.texts_to_sequences([joke])
for i in range(1, len(token_list[0])): # Corrected loop range (token_list[0] instead of token_list)
n_gram_sequence = token_list[0][:i+1] # Create n-gram sequence
input_sequences.append(n_gram_sequence)
# 3. Pad sequences and create predictors and labels
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
xs, labels = input_sequences[:,:-1], input_sequences[:,-1]
# 4. Convert labels to categorical
ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)
# 5. Build the model
model = tf.keras.Sequential([
tf.keras.layers.Embedding(total_words, 100, input_length=max_sequence_len-1),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(150)),
tf.keras.layers.Dense(total_words, activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 6. Train the model (this might take some time depending on your data and machine)
model.fit(xs, ys, epochs=100, verbose=1)
# 7. Function to generate jokes
def generate_joke(seed_text, next_words=10):
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])
token_list = pad_sequences(token_list, maxlen=max_sequence_len-1, padding='pre') # Pad the sequence
predicted = model.predict(token_list, verbose=0) # Predict the next word
predicted_index = tf.math.argmax(predicted, axis=1).numpy()[0] # Get the predicted word index
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted_index:
output_word = word
break
seed_text += " " + output_word
return seed_text
# 8. Gradio Interface (Frontend)
def gradio_interface(selected_category):
if selected_category == "Animal Jokes":
prompt = "Tell me a funny joke about animals."
elif selected_category == "Technology Jokes":
prompt = "Give me a funny technology joke."
elif selected_category == "Dad Jokes":
prompt = "Tell me a dad joke."
else:
prompt = "Give me a random joke."
# Generate the joke using the model
return generate_joke(prompt, next_words=10)
# 9. Gradio Interface
iface = gr.Interface(
fn=gradio_interface,
inputs=gr.Dropdown(choices=["Animal Jokes", "Technology Jokes", "Dad Jokes", "Random Jokes"], label="Select Joke Category"),
outputs="text",
title="AI-Powered Joke Generator",
description="Click the button to generate a funny joke from the selected category using AI!",
)
# Launch the Gradio app
iface.launch(share=True)