Spaces:
Runtime error
Runtime error
File size: 6,331 Bytes
5a44472 57e83ff 135b9ef 166fbc5 5a44472 67f41fe 5a44472 57e83ff 5a44472 57e83ff 5a44472 fca80c7 57e83ff 5a44472 7d0c38a 5a44472 edc4138 5a44472 57e83ff 5a44472 5e02517 c32186d 5e02517 b3be0d5 166fbc5 5e02517 57e83ff 1803787 5e02517 e68f24a 5e02517 2f3594f 5e02517 2f3594f 868089c 82da3f3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
import random
import spacy
import requests
from bs4 import BeautifulSoup
import re
import spacy
import language_tool_python
import streamlit as st
from gradio_client import Client
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}", "Explain {entity}", "What do you know about {entity}"],
"ORG": ["What is {entity}?", "Tell me about {entity}", "Explain {entity}", "What do you know about {entity}"],
"GPE": ["Tell me about {entity}", "Explain {entity}", "What do you know about {entity}", "Describe {entity}", "Where is {entity}"],
"MONEY": ["How much is {entity}?", "Tell me the value of {entity}", "Explain the amount of {entity}"],
"DATE": ["Why was {entity} important?", "Explain what happened on {entity}"],
# 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 {entity} {topic}"])
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, topic is not None)
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]
questions.extend(entity_questions)
return questions
# Initialize LanguageTool
tool = language_tool_python.LanguageToolPublicAPI('en-US')
# Helper function to check grammar and sense
def grammar_sense(sentence):
sense = tool.correct(sentence)
grammar = "Correct Grammar" if not tool.check(sentence) else "Incorrect Grammar"
return "Make Sense" if "Not" not in sense and grammar == "Correct Grammar" else "Not Make Sense"
Quiz_Gen = st.form("Quiz Generation")
res = Quiz_Gen.text_input("What topic do you want to get quizzed on?")
sub = Quiz_Gen.form_submit_button("Submit")
while not sub:
x=2
if sub:
entity = res
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)]
# Example usage
data = ' '.join(paragraphs)
noOfQues = 5
st.toast("Creating Questions", icon='β
')
subjective_generator = SubjectiveTest(data, noOfQues)
question_list = subjective_generator.generate_test("")
questions = []
st.session_state.questions = question_list # Store the generated questions in session state
Quiz = st.form("Quiz")
st.toast("Filtering Questions", icon='β
')
# Check if questions are generated in session state
if 'questions' in st.session_state:
question_index = 0
while question_index < len(st.session_state.questions):
current_question = st.session_state.questions[question_index]
# Check if the current question meets your criteria
if "Explain" not in current_question and len(tool.check(current_question)) == 0 and grammar_sense(current_question) == "Make Sense":
# Get user input for the current question
user_answer = Quiz.text_input(f'{current_question}')
# Append the user answer to the list
ans.append(user_answer)
# Move to the next question
question_index += 1
submit_button = Quiz.form_submit_button("Submit")
while not submit_button:
x=1
if submit_button:
st.toast("Calculating grade", icon='β
')
with st.spinner(text="Calculating Grade"):
for i, q in enumerate(st.session_state.questions):
st.toast(f'iteration {i} has begun', icon='β
')
result = client.predict(
f'What would you rate this answer to the question: "{q}" as a percentage? Here is the answer: {ans[i]}. Your percentage grade cannot be negative or over 100%. Additionally, you should also assume that the user is of a 5-7th grade level of intellect.',
0.9,
256,
0.9,
1.2,
api_name="/chat"
)
pattern = r'(\d+)%'
match = re.search(pattern, result)
if match:
score = match.group(1)
user_scores.append(int(score))
else:
user_scores.append(85) # You can set a default score if no score is found
# Calculate the average score using the user_scores list
average_score = sum(user_scores) / len(user_scores)
st.info(f'Your average score for the answers is {average_score}%')
st.write(f'Your average score for the answers is {average_score}%')
st.balloons() |