Quizziz / app.py
BillBojangeles2000's picture
Update app.py
a1f74de
raw
history blame
7.54 kB
import streamlit as st
import random
import spacy
import requests
from bs4 import BeautifulSoup
import re
import spacy
import language_tool_python
import json
from gradio_client import Client
API_URL = "https://api-inference.huggingface.co/models/facebook/bart-large-mnli"
headers = {"Authorization": "Bearer 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"}
def query(payload):
response = requests.post(API_URL, headers=headers, json=payload)
return response.json()
# Define the grammar_sense function
def grammar_sense(sentence):
sense = query({
"inputs": sentence,
"parameters": {"candidate_labels": ["Make Sense", "Not Make Sense"]},
})
grammar = query({
"inputs": sentence,
"parameters": {"candidate_labels": ["Correct Grammar", "Incorrect Grammar"]},
})
objects = ["Sense", "Grammar"]
ans = []
for i in objects:
if i == "Sense":
response_data = json.loads(json.dumps(sense))
labels = response_data['labels']
scores = response_data['scores']
index_of_highest_score = scores.index(max(scores))
highest_score_label = labels[index_of_highest_score]
ans.append(highest_score_label)
else:
response_data = json.loads(json.dumps(grammar))
labels = response_data['labels']
scores = response_data['scores']
index_of_highest_score = scores.index(max(scores))
highest_score_label = labels[index_of_highest_score]
ans.append(highest_score_label)
if not 'Not' in ans[0] and ans[1] == 'Correct Grammar':
return True
else:
return False
# Initialize LanguageTool
tool = language_tool_python.LanguageToolPublicAPI('en-US')
# Define the Streamlit app
st.title("NLP Testing and Scoring App")
# Ask for the topic at the start
topic = st.text_input("Enter a topic:")
# Web scraping and text cleaning
entity = "Florida" # You can replace this with the user's topic input
if topic:
entity = topic # Use the user's input as the entity
prefix = "https://wiki.kidzsearch.com/wiki/"
page = requests.get(f'{prefix}{entity}')
res = BeautifulSoup(page.content, 'html.parser')
text = [i.get_text() for i in res.find_all('p')]
cleaned_text = ' '.join(text)
cleaned_text = re.sub(r'[^a-zA-Z0-9.,]', ' ', cleaned_text)
paragraphs = [p.strip() for p in re.split(r'\n', cleaned_text) if p.strip()]
# Process text using SpaCy
nlp = spacy.load("en_core_web_sm")
doc = nlp(cleaned_text)
sentences = [sent.text for sent in doc.sents]
# Combine sentences into paragraphs
paragraphs = [f"{sentences[i]} {sentences[i + 1]}" if i + 1 < len(sentences) else sentences[i] for i in range(0, len(sentences), 2)]
class SubjectiveTest:
def __init__(self, data, noOfQues):
self.summary = data
self.noOfQues = noOfQues
self.nlp = spacy.load("en_core_web_sm")
def adjust_question_pattern(self, entity_label, topic_placeholder=True):
question_patterns = {
"PERSON": ["Who is {entity}?", "Tell me about {entity}", "What do you know about {entity}"],
"ORG": ["What is {entity}?", "Tell me about {entity}", "What do you know about {entity}"],
"GPE": ["Tell me about {entity}", "What do you know about {entity}", "Where is {entity}"],
"MONEY": ["How much is {entity}?", "Tell me the value of {entity}"],
"DATE": ["Why was {entity} important?"],
# Add more entity-label to question-pattern mappings as needed
}
if topic_placeholder:
for key in question_patterns:
question_patterns[key] = [pattern + " {topic}" for pattern in question_patterns[key]]
return question_patterns.get(entity_label, "Explain")
def generate_test(self, topic=None):
doc = self.nlp(self.summary)
question_answer_dict = dict()
for sentence in doc.sents:
for ent in sentence.ents:
entity_label = ent.label_
entity_text = ent.text
question_patterns = self.adjust_question_pattern(entity_label, "")
for pattern in question_patterns:
question = pattern.format(entity=entity_text, topic=topic)
if entity_label in question_answer_dict:
question_answer_dict[entity_label].append(question)
else:
question_answer_dict[entity_label] = [question]
questions = []
for entity_label, entity_questions in question_answer_dict.items():
entity_questions = entity_questions[:self.noOfQues]
if "Explain" in entity_questions:
continue
else:
questions.extend(entity_questions)
return questions
with st.form("quiz_form"):
# Create a button to initiate quiz generation
generate_quiz = st.form_submit_button("Generate Quiz")
if generate_quiz:
st.write("Generating the quiz...")
data = ' '.join(paragraphs)
noOfQues = 5
subjective_generator = SubjectiveTest(data, noOfQues)
questions = subjective_generator.generate_test(topic) # Use the user's input topic here
# Filter out invalid and empty questions
x = 0
while x > len(questions):
for i in questions:
if len(i) == 1:
questions.pop(x)
x = x + 1
else:
x = x + 1
# Ensure you have valid questions
if not questions:
st.write("No valid questions to process.")
else:
answers = {} # Dictionary to store answers
# Use the filtered questions in your code
for i, question in enumerate(questions):
res = st.text_input(f'Q{i + 1}: {question}') # Get user input for each question
answers[f'Q{i + 1}'] = res # Store the user's answer
scores = []
client = Client("https://billbojangeles2000-zephyr-7b-alpha-chatbot-karki.hf.space/")
question_list = subjective_generator.generate_test(topic) # Define 'questions' here
questions = []
for i, question in enumerate(question_list):
if (question != "") and (len(tool.check(question)) == 0) and (grammar_sense(question)):
questions.append(f"Question: {question}")
for i, question in enumerate(questions):
res = answers[f'Q{i + 1}']
if res:
result = client.predict(
f'What would you rate this answer to the question: "{question}" as a percentage? Here is the answer: {res}. Make sure to write your answer as "Score" and then write your score of the response.',
0.9,
256,
0.9,
1.2,
api_name="/chat"
)
pattern = r'(\d+)%'
match = re.search(pattern, result)
if match:
score = int(match.group(1))
scores.append(score)
else:
scores.append(85)
def calculate_average(numbers):
if not numbers:
return 0 # Return 0 for an empty list to avoid division by zero.
total = sum(numbers)
average = total / len(numbers)
return average
# Calculate and display the average score
average_score = calculate_average(scores)
st.write(f'Your average score is {average_score}')