Spaces:
Sleeping
Sleeping
| import random | |
| import nltk | |
| from nltk.corpus import stopwords | |
| from nltk.tokenize import sent_tokenize, word_tokenize | |
| from transformers import pipeline | |
| class AdvancedMCQGenerator: | |
| def __init__(self): | |
| nltk.download('punkt', quiet=True) | |
| nltk.download('stopwords', quiet=True) | |
| # Initialize NLP models | |
| self.qa_pipeline = pipeline("question-answering") | |
| self.stop_words = set(stopwords.words('english')) | |
| def extract_key_concepts(self, context): | |
| """Extract key concepts and important phrases""" | |
| # Tokenize sentences | |
| sentences = sent_tokenize(context) | |
| # Extract potential key concepts | |
| key_concepts = [] | |
| for sentence in sentences: | |
| # Look for sentences with unique, meaningful content | |
| words = word_tokenize(sentence) | |
| filtered_words = [word.lower() for word in words if word.isalnum() and word.lower() not in self.stop_words and len(word) > 2] | |
| # Prioritize sentences with named entities or specific concepts | |
| if len(filtered_words) > 3: | |
| key_concepts.append(sentence) | |
| return key_concepts[:5] # Return top 5 key concepts | |
| def generate_intelligent_question(self, concept, context, difficulty): | |
| if difficulty == 'easy': | |
| templates = [ | |
| f"What is {concept}?", | |
| f"Describe {concept}.", | |
| f"Define {concept}.", | |
| f"What do you understand by {concept}?", | |
| f"Give a simple explanation of {concept}." | |
| ] | |
| elif difficulty == 'hard': | |
| templates = [ | |
| f"In what way does {concept} reflect a broader implication?", | |
| f"Critically analyze the role of {concept} in the given context.", | |
| f"How can {concept} be interpreted in complex scenarios?", | |
| f"What deeper insights does {concept} provide?", | |
| f"Discuss the nuanced impact of {concept} in this context." | |
| ] | |
| else: # medium | |
| templates = [ | |
| f"What is the primary significance of {concept}?", | |
| f"How does {concept} impact the broader context?", | |
| f"What key role does {concept} play in the narrative?", | |
| f"Explain the importance of {concept} in this context.", | |
| f"What makes {concept} crucial to understanding the situation?" | |
| ] | |
| return random.choice(templates) | |
| def generate_contextual_distractors(self, correct_answer, context, difficulty): | |
| """Create semantically related but incorrect distractors""" | |
| sentences = sent_tokenize(context) | |
| distractors = [] | |
| potential_distractors = [sent for sent in sentences if correct_answer.lower() not in sent.lower() and len(sent.split()) > 3] | |
| fallback_distractors = ["A partially related historical context","An alternative interpretation","A peripheral aspect of the main theme"] | |
| # Generating diverse distractors | |
| while len(distractors) < 3: | |
| if potential_distractors: | |
| distractor = random.choice(potential_distractors) | |
| potential_distractors.remove(distractor) | |
| words = word_tokenize(distractor) | |
| if difficulty == 'easy': | |
| phrase = ' '.join([w for w in words if w.lower() not in self.stop_words][:2]) | |
| elif difficulty == 'hard': | |
| phrase = ' '.join([w for w in words if w.lower() not in self.stop_words][:5]) | |
| else: # medium | |
| phrase = ' '.join([w for w in words if w.lower() not in self.stop_words][:3]) | |
| distractors.append(phrase.strip()) | |
| else: | |
| distractors.append(random.choice(fallback_distractors)) | |
| return distractors | |
| def generate_mcq(self, context, num_questions=3, difficulty='medium'): | |
| """Generate Multiple Choice Questions""" | |
| # Validate context | |
| if not context or len(context.split()) < 30: | |
| raise ValueError("Context is too short. Provide more detailed text.") | |
| mcq_questions = [] | |
| key_concepts = self.extract_key_concepts(context) | |
| for concept in key_concepts[:num_questions]: | |
| try: | |
| question = self.generate_intelligent_question(concept, context, difficulty) | |
| answer_result = self.qa_pipeline(question=question, context=context) | |
| correct_answer = answer_result['answer'] | |
| distractors = self.generate_contextual_distractors(correct_answer, context, difficulty) | |
| all_options = [correct_answer] + distractors | |
| random.shuffle(all_options) | |
| correct_index = all_options.index(correct_answer) # Determine correct option index | |
| mcq_questions.append({"question": question,"options": all_options,"correct_answer": correct_index}) # Create MCQ | |
| except Exception as e: | |
| print(f"Error generating question: {e}") | |
| return mcq_questions | |
| def main(): | |
| # Create generator instance | |
| generator = AdvancedMCQGenerator() | |
| context = input("Enter context text: ") | |
| num_questions = int(input("How many questions do you want? ")) | |
| difficulty = input("Choose difficulty (easy / medium / hard): ").lower().strip() | |
| questions = generator.generate_mcq(context, num_questions, difficulty) | |
| # Display and solve quiz | |
| print("\n--- Quiz Started ---") | |
| score = 0 | |
| for i, q in enumerate(questions, 1): | |
| print(f"\nQuestion {i}: {q['question']}") | |
| for j, option in enumerate(q['options']): | |
| print(f"{chr(65+j)}. {option}") | |
| while True: | |
| user_answer = input("\nYour Answer (A/B/C/D): ").upper() | |
| if user_answer in ['A', 'B', 'C', 'D']: | |
| break | |
| print("Invalid input. Please enter A, B, C, or D.") | |
| user_index = ord(user_answer) - 65 | |
| if user_index == q['correct_answer']: | |
| print("Correct!") | |
| score += 1 | |
| else: | |
| print(f"Incorrect. Correct answer was: {chr(65 + q['correct_answer'])}") | |
| print(f"\nFinal Score: {score}/{len(questions)}") | |
| if __name__ == "__main__": | |
| main() | |