Spaces:
Sleeping
Sleeping
import PyPDF2 | |
import nltk | |
import random | |
import streamlit as st | |
from openai import OpenAI | |
from dotenv import load_dotenv | |
import os | |
# Download NLTK data (if not already downloaded) | |
nltk.download('punkt') | |
# load the environment variables into the python script | |
load_dotenv() | |
# fetching the openai_api_key environment variable | |
openai_api_key = os.getenv('OPENAI_API_KEY') | |
def extract_text_from_pdf(pdf_file): | |
pdf_reader = PyPDF2.PdfReader(pdf_file) | |
text = "" | |
for page_num in range(len(pdf_reader.pages)): | |
text += pdf_reader.pages[page_num].extract_text() | |
return text | |
def generate_mcqs_on_topic(text, topic, num_mcqs=5): | |
# Tokenize the text into sentences | |
sentences = nltk.sent_tokenize(text) | |
# Randomly select sentences to create Questions | |
selected_sentences = random.sample(sentences, min(num_mcqs, len(sentences))) | |
mcqs = [] | |
for sentence in selected_sentences: | |
# Use ChatGPT for interactive question generation | |
chatgpt_question = generate_question_with_chatgpt(sentence, topic) | |
mcqs.append(chatgpt_question) | |
print(mcqs) | |
return mcqs | |
def extract_options_and_correct_answer(api_response): | |
if 'choices' in api_response: | |
choices = api_response['choices'] | |
if isinstance(choices, list) and choices: # Check if 'choices' is a non-empty list | |
message = choices[0].get('message', {}) | |
content = message.get('content', "Unable to generate a question..") | |
options = message.get('options', []) | |
correct_answer = message.get('correct_answer', "Unknown") | |
return content, options, correct_answer | |
return "Unexpected API response format.", [], "Unknown" | |
def generate_question_with_chatgpt(context, topic): | |
client = OpenAI() | |
# Initializing the default value | |
generated_question = { | |
'content': "Unable to generate a question..", | |
'options': [], # assuming options is a list | |
'correct_answer': "Unknown" | |
} | |
result = client.chat.completions.create( | |
model="gpt-3.5-turbo", | |
max_tokens=1024, | |
temperature=0.7, | |
messages=[ | |
{"role": "system", "content": "You are a helpful assistant."}, | |
{"role": "user", "content": f"What is the question on {topic} for the following? {context}"}, | |
] | |
) | |
print("API Response:", result) # Print the API response for debugging | |
# Modify the logic based on the actual structure of the 'result' | |
if 'choices' in result: | |
choices = result['choices'] | |
if isinstance(choices, list) and choices: | |
choice = choices[0] | |
if 'message' in choice and isinstance(choice['message'], dict): | |
message = choice['message'] | |
content = message.get('content') | |
if content: | |
options = message.get('options', []) | |
correct_answer = message.get('correct_answer', "Unknown") | |
generated_question['content'] = content | |
generated_question['options'] = options if isinstance(options, list) else [] | |
generated_question['correct_answer'] = correct_answer | |
return generated_question | |
def main(): | |
# Title of the Application | |
st.header("🤖CB Quiz Generator🧠", divider='rainbow') | |
st.subheader("☕CoffeeBeans☕") | |
# User input | |
pdf_file = st.file_uploader("Upload PDF Document:", type=["pdf"]) | |
num_mcqs = st.number_input("Enter Number of MCQs to Generate:", min_value=1, step=1, value=5) | |
topic = st.text_input("Enter the Topic in which the quiz has to be generated") | |
# Button to trigger QUIZ generation | |
if st.button("Generate Quiz"): | |
if pdf_file: | |
text = extract_text_from_pdf(pdf_file) | |
mcqs = generate_mcqs_on_topic(text, topic, num_mcqs) | |
# Display the generated Questions | |
st.success(f"Generated {num_mcqs} Questions:") | |
for i, generated_question in enumerate(mcqs, start=1): | |
st.write(f"\nQuestion {i}: {generated_question['content']}") | |
st.write(f"Options: {', '.join(generated_question['options'])}") | |
st.write(f"Correct Answer: {generated_question['correct_answer']}") | |
else: | |
st.error("Please upload a PDF document.") | |
if __name__ == "__main__": | |
main() | |