File size: 5,447 Bytes
5a44472
 
 
 
 
 
 
57e83ff
135b9ef
5a44472
588b61c
5a44472
57e83ff
 
 
 
 
9ca337b
5a44472
57e83ff
3c5ee9d
57e83ff
 
5a44472
 
138fa66
5a44472
 
 
 
 
 
 
 
e9d3c2b
5a44472
 
 
 
 
 
57e83ff
5a44472
 
67f41fe
5a44472
 
 
 
 
 
57e83ff
 
 
 
 
5a44472
 
 
 
 
 
 
57e83ff
5a44472
 
 
 
 
 
 
 
fca80c7
57e83ff
5a44472
7d0c38a
 
 
 
 
5a44472
 
 
edc4138
5a44472
57e83ff
5a44472
 
 
57e83ff
 
 
 
 
 
 
 
 
 
3015f0f
e68f24a
57e83ff
 
ad2a25d
09d4026
 
 
e68f24a
 
104329a
 
68fa6b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104329a
 
 
 
 
 
 
 
ad2a25d
104329a
68fa6b1
104329a
 
 
68fa6b1
104329a
 
 
68fa6b1
 
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
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
# 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"

# Web scraping and text cleaning
Quiz_Gen = st.form("Quiz Generation")
res = Quiz_Gen.text_input("What topic do you want to get quizzed on?")
Quiz_Gen.form_submit_button("Submit")
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)]

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

# Example usage
data = ' '.join(paragraphs)
noOfQues = 5

subjective_generator = SubjectiveTest(data, noOfQues)
question_list = subjective_generator.generate_test("")
questions = []
Quiz = st.form("Quiz")
for i, question in enumerate(question_list):
  if "Explain" not in question and len(tool.check(question)) == 0 and grammar_sense(question) == "Make Sense":
    questions.append(f"{question}")

scores = []
client = Client("https://billbojangeles2000-zephyr-7b-alpha-chatbot-karki.hf.space/")
ans = []
for i in questions:
    res = Quiz.text_input(f'{i}')
    ans.append(res)

Quiz.form_submit_button("Submit")
grade_quiz = st.button("Grade Quiz!")
if grade_quiz:
    for i, q in enumerate(questions):  # This line was missing the enumeration
        result = client.predict(
            f'What would you rate this answer to the question: "{q}" as a percentage? Here is the answer: {ans[i]}. 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"
        )
        print(result)
        pattern = r'(\d+)%'

        match = re.search(pattern, result)
        if match:
            score = match.group(1)
            scores.append(f'{int(score)}')
        else:
            scores.append(f'N/A')

    x = 0
    new_scores = []
    for score in scores:
        if score == 'N/A':
            scores.pop(x)
            scores.append(85)
            x = x + 1
        else:
            x = x + 1

    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

    st.subheader(f'Your average score for the answers is {calculate_average(scores)}')