Update app.py
Browse files
app.py
CHANGED
@@ -17,7 +17,6 @@ sentence_model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
|
17 |
# Initialize Groq client
|
18 |
client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
|
19 |
|
20 |
-
|
21 |
# System prompt for Groq
|
22 |
system_prompt = {
|
23 |
"role": "system",
|
@@ -56,7 +55,6 @@ def extract_text_from_image(filepath: str, languages: List[str]):
|
|
56 |
lang_str = '+'.join(languages) # Join languages for Tesseract
|
57 |
return pytesseract.image_to_string(image=image, lang=lang_str)
|
58 |
|
59 |
-
|
60 |
# Assign badges based on the grade
|
61 |
def assign_badge(grade):
|
62 |
if grade == 5:
|
@@ -68,7 +66,6 @@ def assign_badge(grade):
|
|
68 |
else:
|
69 |
return "Keep Improving Badge 💪"
|
70 |
|
71 |
-
|
72 |
# Categorize feedback into clarity, completeness, and accuracy
|
73 |
def detailed_feedback(similarity_score):
|
74 |
if similarity_score >= 0.9:
|
@@ -93,8 +90,6 @@ def get_grade(similarity_score):
|
|
93 |
else:
|
94 |
return 1
|
95 |
|
96 |
-
|
97 |
-
|
98 |
# Function to get BERT embeddings
|
99 |
def get_bert_embedding(text):
|
100 |
inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True)
|
@@ -116,13 +111,16 @@ def calculate_sentence_similarity(text1, text2):
|
|
116 |
|
117 |
# Function to compare logic of student and teacher answers
|
118 |
def compare_answers(student_answer, teacher_answer):
|
|
|
119 |
bert_similarity = calculate_cosine_similarity(get_bert_embedding(student_answer), get_bert_embedding(teacher_answer))
|
|
|
|
|
120 |
sentence_similarity = calculate_sentence_similarity(student_answer, teacher_answer)
|
121 |
-
|
122 |
-
final_similarity = (0.
|
123 |
return final_similarity
|
124 |
|
125 |
-
# Function to extract keywords from the model answer
|
126 |
def extract_keywords(text):
|
127 |
# Split text into words and count them
|
128 |
return set(text.lower().split())
|
@@ -132,12 +130,16 @@ def check_keywords(student_answer, model_answer):
|
|
132 |
student_keywords = extract_keywords(student_answer)
|
133 |
teacher_keywords = extract_keywords(model_answer)
|
134 |
keyword_overlap = len(student_keywords.intersection(teacher_keywords))
|
135 |
-
return keyword_overlap / len(teacher_keywords) # Ratio of matching keywords
|
136 |
|
137 |
# Function to evaluate student's answer by comparing it to a model answer
|
138 |
def evaluate_answer(image, languages, model_answer):
|
139 |
student_answer = extract_text_from_image(image, languages)
|
|
|
|
|
140 |
semantic_similarity = compare_answers(student_answer, model_answer)
|
|
|
|
|
141 |
keyword_similarity = check_keywords(student_answer, model_answer)
|
142 |
|
143 |
# Combine semantic similarity with keyword presence check
|
@@ -149,9 +151,6 @@ def evaluate_answer(image, languages, model_answer):
|
|
149 |
prompt = f"The student got grade: {grade} when the student's answer is: {student_answer} and the teacher's answer is: {model_answer}. Justify the grade given to the student."
|
150 |
return grade, combined_similarity * 100, feedback, badge, detailed_feedback_msg, prompt
|
151 |
|
152 |
-
# The rest of your existing code...
|
153 |
-
|
154 |
-
|
155 |
# Main interface function for Gradio
|
156 |
async def gradio_interface(image, languages: List[str], model_answer="The process of photosynthesis helps plants produce glucose using sunlight.", prompt="", history=[]):
|
157 |
grade, similarity_score, feedback, badge, detailed_feedback_msg, prompt = evaluate_answer(image, languages, model_answer)
|
|
|
17 |
# Initialize Groq client
|
18 |
client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
|
19 |
|
|
|
20 |
# System prompt for Groq
|
21 |
system_prompt = {
|
22 |
"role": "system",
|
|
|
55 |
lang_str = '+'.join(languages) # Join languages for Tesseract
|
56 |
return pytesseract.image_to_string(image=image, lang=lang_str)
|
57 |
|
|
|
58 |
# Assign badges based on the grade
|
59 |
def assign_badge(grade):
|
60 |
if grade == 5:
|
|
|
66 |
else:
|
67 |
return "Keep Improving Badge 💪"
|
68 |
|
|
|
69 |
# Categorize feedback into clarity, completeness, and accuracy
|
70 |
def detailed_feedback(similarity_score):
|
71 |
if similarity_score >= 0.9:
|
|
|
90 |
else:
|
91 |
return 1
|
92 |
|
|
|
|
|
93 |
# Function to get BERT embeddings
|
94 |
def get_bert_embedding(text):
|
95 |
inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True)
|
|
|
111 |
|
112 |
# Function to compare logic of student and teacher answers
|
113 |
def compare_answers(student_answer, teacher_answer):
|
114 |
+
# Use primarily BERT similarity, and sentence embeddings as a secondary method
|
115 |
bert_similarity = calculate_cosine_similarity(get_bert_embedding(student_answer), get_bert_embedding(teacher_answer))
|
116 |
+
|
117 |
+
# Adjust weight: give more emphasis to BERT
|
118 |
sentence_similarity = calculate_sentence_similarity(student_answer, teacher_answer)
|
119 |
+
|
120 |
+
final_similarity = (0.7 * bert_similarity + 0.3 * sentence_similarity)
|
121 |
return final_similarity
|
122 |
|
123 |
+
# Function to extract keywords from the model answer
|
124 |
def extract_keywords(text):
|
125 |
# Split text into words and count them
|
126 |
return set(text.lower().split())
|
|
|
130 |
student_keywords = extract_keywords(student_answer)
|
131 |
teacher_keywords = extract_keywords(model_answer)
|
132 |
keyword_overlap = len(student_keywords.intersection(teacher_keywords))
|
133 |
+
return keyword_overlap / (len(teacher_keywords) if len(teacher_keywords) > 0 else 1) # Ratio of matching keywords
|
134 |
|
135 |
# Function to evaluate student's answer by comparing it to a model answer
|
136 |
def evaluate_answer(image, languages, model_answer):
|
137 |
student_answer = extract_text_from_image(image, languages)
|
138 |
+
|
139 |
+
# Calculate semantic similarity primarily with BERT
|
140 |
semantic_similarity = compare_answers(student_answer, model_answer)
|
141 |
+
|
142 |
+
# Include keyword similarity
|
143 |
keyword_similarity = check_keywords(student_answer, model_answer)
|
144 |
|
145 |
# Combine semantic similarity with keyword presence check
|
|
|
151 |
prompt = f"The student got grade: {grade} when the student's answer is: {student_answer} and the teacher's answer is: {model_answer}. Justify the grade given to the student."
|
152 |
return grade, combined_similarity * 100, feedback, badge, detailed_feedback_msg, prompt
|
153 |
|
|
|
|
|
|
|
154 |
# Main interface function for Gradio
|
155 |
async def gradio_interface(image, languages: List[str], model_answer="The process of photosynthesis helps plants produce glucose using sunlight.", prompt="", history=[]):
|
156 |
grade, similarity_score, feedback, badge, detailed_feedback_msg, prompt = evaluate_answer(image, languages, model_answer)
|