Spaces:
Sleeping
Sleeping
# quiz_logic.py | |
import random | |
import nltk | |
from transformers import pipeline | |
from nltk.tokenize import sent_tokenize | |
# Download required tokenizer | |
nltk.download('punkt', quiet=True) | |
# Load NLI model | |
nli = pipeline("text-classification", model="facebook/bart-large-mnli") | |
def validate_inputs(context, num_questions, difficulty): | |
if not context.strip(): | |
return False, "Context cannot be empty." | |
sentences = sent_tokenize(context) | |
if len(sentences) < num_questions: | |
return False, f"Context has only {len(sentences)} sentences, but {num_questions} questions requested." | |
if difficulty not in ["easy", "medium", "hard"]: | |
return False, "Difficulty must be 'easy', 'medium', or 'hard'." | |
return True, sentences | |
def apply_noise(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 | |
def generate_statements(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 = apply_noise(clean, difficulty) | |
label = "ENTAILMENT" if clean == modified else "CONTRADICTION" | |
final.append({"statement": modified, "actual_label": label}) | |
if len(final) >= n: | |
break | |
return final | |
def score_answers(context, answers): | |
score = 0 | |
results = [] | |
for answer in answers: | |
statement = answer.get('statement') | |
user_answer = answer.get('user_answer', '').strip().lower() | |
if user_answer not in ['true', 'false']: | |
results.append({ | |
"statement": statement, | |
"result": "Invalid answer. Please use 'true' or 'false'." | |
}) | |
continue | |
input_text = f"{context} [SEP] {statement}" | |
result = nli(input_text)[0] | |
if result["label"] == "neutral": | |
results.append({ | |
"statement": statement, | |
"result": "Skipped due to ambiguous statement." | |
}) | |
continue | |
model_label = "ENTAILMENT" if result["label"] == "entailment" else "CONTRADICTION" | |
is_correct = (model_label == "ENTAILMENT" and user_answer == "true") or \ | |
(model_label == "CONTRADICTION" and user_answer == "false") | |
results.append({ | |
"statement": statement, | |
"result": "Correct" if is_correct else f"Incorrect (Correct answer: {'True' if model_label == 'ENTAILMENT' else 'False'})" | |
}) | |
if is_correct: | |
score += 1 | |
return score, results |