Spaces:
Running
Running
import random | |
import nltk | |
from transformers import pipeline | |
from nltk.tokenize import sent_tokenize | |
nltk.download('punkt_tab', quiet=True) | |
# Load NLI model | |
nli = pipeline("text-classification", model="facebook/bart-large-mnli") | |
class generate_true_false: | |
def __init__(self): | |
pass | |
def validate_inputs(self, context, num_questions, difficulty): | |
if not context.strip(): | |
raise ValueError("Context cannot be empty.") | |
sentences = sent_tokenize(context) | |
return sentences | |
def apply_noise(self, sentence: str, level: str) -> str: | |
if level == "easy": | |
return sentence | |
elif level == "medium": | |
if "Sun" in sentence: | |
return sentence.replace("Sun", "Moon") | |
return sentence.replace("is", "is not") if "is" in sentence else sentence | |
elif level == "hard": | |
if "eight" in sentence: | |
return sentence.replace("eight", "ten") | |
return sentence.replace("planets", "stars") if "planets" in sentence else sentence | |
return sentence | |
# Statement generator | |
def generate_statements(self, context, n, difficulty, sentences): | |
random.seed(42) | |
selected = random.sample(sentences, min(n * 2, len(sentences))) | |
final = [] | |
for s in selected: | |
clean = s.strip() | |
modified = self.apply_noise(clean, difficulty) | |
label = "ENTAILMENT" if clean == modified else "CONTRADICTION" | |
final.append((modified, label)) | |
if len(final) >= n: | |
break | |
return final | |
# Get valid user answer | |
def get_user_answer(self): | |
while True: | |
user = input("True or False? ").strip().lower() | |
if user in ["true", "false"]: | |
return user | |
print("Please enter 'true' or 'false'.") | |
# Main quiz logic | |
def run_quiz(self, context, num_questions, difficulty): | |
try: | |
sentences = self.validate_inputs(context, num_questions, difficulty) | |
questions = self.generate_statements(context, num_questions, difficulty, sentences) | |
print("\n--- QUIZ STARTS ---\n") | |
score = 0 | |
for idx, (statement, actual_label) in enumerate(questions, 1): | |
print(f"Q{idx}: {statement}") | |
user = self.get_user_answer() | |
# Format input for facebook/bart-large-mnli | |
input_text = f"{context} [SEP] {statement}" | |
result = nli(input_text)[0] | |
if result["label"] == "neutral": | |
print("Skipping ambiguous statement.\n") | |
continue | |
model_label = "ENTAILMENT" if result["label"] == "entailment" else "CONTRADICTION" | |
if model_label == "ENTAILMENT" and user == "true": | |
print("Correct!\n") | |
score += 1 | |
elif model_label == "CONTRADICTION" and user == "false": | |
print("Correct!\n") | |
score += 1 | |
else: | |
print(f"Incorrect! (Correct answer: {'True' if model_label == 'ENTAILMENT' else 'False'})\n") | |
print(f"\n--- Final Score: {score}/{len(questions)} ---") | |
except ValueError as e: | |
print(f"Error: {e}") | |
def main(): | |
context = input(">> Enter context text: ").strip() | |
try: | |
num_questions = int(input(">> How many questions do you want to generate? ").strip()) | |
except ValueError: | |
print("Please enter a valid integer for number of questions.") | |
return | |
difficulty = input(">> Enter difficulty level (easy / medium / hard): ").strip().lower() | |
if difficulty not in ["easy", "medium", "hard"]: | |
print("Invalid difficulty level.") | |
return | |
quiz_generator = generate_true_false() | |
quiz_generator.run_quiz(context, num_questions, difficulty) | |
if __name__ == "__main__": | |
main() | |