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()