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()