yamanavijayavardhan commited on
Commit
7a9da00
·
1 Parent(s): 033e08c
Files changed (1) hide show
  1. main.py +56 -37
main.py CHANGED
@@ -3,18 +3,37 @@ import tempfile
3
  import nltk
4
  import logging
5
  import sys
 
6
 
7
- # Set up logging at the start of your main.py
 
 
 
 
 
 
 
8
  logging.basicConfig(
9
  level=logging.INFO,
10
  format='%(asctime)s - %(levelname)s - %(message)s',
11
  handlers=[
 
12
  logging.StreamHandler(sys.stdout)
13
  ]
14
  )
15
 
16
  logger = logging.getLogger(__name__)
17
 
 
 
 
 
 
 
 
 
 
 
18
  # Set up all cache and data directories in /tmp
19
  cache_dir = tempfile.mkdtemp()
20
  nltk_data_dir = os.path.join(cache_dir, 'nltk_data')
@@ -135,30 +154,30 @@ def compute_marks():
135
  # Get and process answers
136
  a = request.form.get('answers')
137
  if not a:
138
- logger.error("No answers provided")
139
  return jsonify({"error": "No answers provided"}), 400
140
 
141
- logger.info("=== Processing Answers ===")
142
- logger.info(f"Received answers: {a}")
143
  a = json.loads(a)
144
  answers = []
145
  for i in a:
146
  ans = i.split('\n\n')
147
  answers.append(ans)
148
- logger.info(f"Processed answers structure: {answers}")
149
 
150
  # Process files and create data structure
151
  data = {}
152
  parent_folder = os.path.join(cache_dir, 'student_answers')
153
  os.makedirs(parent_folder, exist_ok=True)
154
 
155
- logger.info("=== Processing Uploaded Files ===")
156
  files = request.files.getlist('files[]')
157
  if not files:
158
- logger.error("No files uploaded")
159
  return jsonify({"error": "No files uploaded"}), 400
160
 
161
- logger.info(f"Number of files received: {len(files)}")
162
 
163
  # File processing with logging
164
  for file in files:
@@ -166,8 +185,8 @@ def compute_marks():
166
  relative_path = file.filename.replace('\\', '/')
167
  path_parts = relative_path.split('/')
168
 
169
- logger.info(f"Processing file: {file.filename}")
170
- logger.info(f"Path parts: {path_parts}")
171
 
172
  if len(path_parts) >= 2:
173
  student_folder = path_parts[1]
@@ -178,7 +197,7 @@ def compute_marks():
178
 
179
  save_path = os.path.join(student_dir, file_name)
180
  file.save(save_path)
181
- logger.info(f"Saved file: {save_path}")
182
 
183
  if student_folder not in data:
184
  data[student_folder] = []
@@ -187,14 +206,14 @@ def compute_marks():
187
  'name': os.path.splitext(file_name)[0]
188
  })
189
  else:
190
- logger.warning(f"File {file.filename} doesn't have expected structure")
191
 
192
  # Log data structure
193
- logger.info("=== Final Data Structure ===")
194
  for student, images in data.items():
195
- logger.info(f"Student: {student}")
196
  for img in sorted(images, key=lambda x: x['name']):
197
- logger.info(f" - {img['name']} ({img['path']})")
198
 
199
  # Calculate marks with logging
200
  results = []
@@ -208,11 +227,11 @@ def compute_marks():
208
  try:
209
  image_path = image_info['path']
210
  s_answer = extract_text_from_image(image_path)
211
- logger.info(f"\nProcessing {student_folder}/{image_info['name']}:")
212
- logger.info(f"Extracted answer: {s_answer}")
213
 
214
  if s_answer and idx < len(answers):
215
- logger.info(f"Reference answer: {answers[idx]}")
216
  tf_idf_word_values, max_tfidf = create_tfidf_values(answers[idx])
217
  m = marks(s_answer, sen_vec_answers[idx], word_vec_answers[idx],
218
  tf_idf_word_values, max_tfidf, answers[idx])
@@ -222,10 +241,10 @@ def compute_marks():
222
  mark_value = round(float(m), 2)
223
  student_total += mark_value
224
  student_count += 1
225
- logger.info(f"Marks awarded: {mark_value}")
226
  else:
227
  mark_value = 0
228
- logger.warning(f"No text extracted or no reference answer for index {idx}")
229
 
230
  results.append({
231
  'student': student_folder,
@@ -234,7 +253,7 @@ def compute_marks():
234
  })
235
 
236
  except Exception as e:
237
- logger.error(f"Error processing {image_path}: {str(e)}")
238
  results.append({
239
  'student': student_folder,
240
  'image_name': image_info['name'],
@@ -244,17 +263,17 @@ def compute_marks():
244
  # Sort results
245
  results.sort(key=lambda x: (x['student'], x['image_name']))
246
 
247
- logger.info("\nFinal Results:")
248
  for r in results:
249
- logger.info(f"{r['student']}\t{r['image_name']}\t{r['marks']}")
250
 
251
  # Clean up temporary directory
252
  try:
253
  import shutil
254
  shutil.rmtree(parent_folder)
255
- logger.info(f"Cleaned up temporary directory: {parent_folder}")
256
  except Exception as e:
257
- logger.warning(f"Warning: Could not clean up temporary directory: {e}")
258
 
259
  return jsonify({
260
  "message": results,
@@ -262,7 +281,7 @@ def compute_marks():
262
  }), 200
263
 
264
  except Exception as e:
265
- logger.error("Error in compute_marks:", str(e))
266
  try:
267
  import shutil
268
  shutil.rmtree(parent_folder)
@@ -274,19 +293,19 @@ def compute_marks():
274
 
275
  def marks(answer, sen_vec_answers, word_vec_answers, tf_idf_word_values, max_tfidf, correct_answers):
276
  marks = 0
277
- logger.info("=== Marks Calculation ===")
278
- logger.info(f"Processing answer: {answer[:100]}...") # Log first 100 chars
279
 
280
  marks1 = tfidf_answer_score(answer, tf_idf_word_values, max_tfidf, marks=10)
281
- logger.info(f"TFIDF Score: {marks1}")
282
 
283
  if marks1 > 3:
284
  marks += new_value(marks1, old_min=3, old_max=10, new_min=0, new_max=5)
285
- logger.info(f"After TFIDF adjustment: {marks}")
286
 
287
  if marks1 > 2:
288
  marks2 = similarity_model_score(sen_vec_answers, answer)
289
- logger.info(f"Sentence Similarity Score: {marks2}")
290
 
291
  if marks2 > 0.95:
292
  marks += 3
@@ -294,26 +313,26 @@ def marks(answer, sen_vec_answers, word_vec_answers, tf_idf_word_values, max_tfi
294
  marks += new_value(marks2, old_min=0.5, old_max=0.95, new_min=0, new_max=3)
295
 
296
  marks3 = fasttext_similarity(word_vec_answers, answer)
297
- logger.info(f"Word Similarity Score: {marks3}")
298
 
299
- if marks3 > 0.9: # Fixed the condition to use marks3 instead of marks2
300
  marks += 2
301
  elif marks3 > 0.4:
302
  marks += new_value(marks3, old_min=0.4, old_max=0.9, new_min=0, new_max=2)
303
 
304
  marks4 = llm_score(correct_answers, answer)
305
- logger.info(f"LLM Scores: {marks4}")
306
 
307
  for i in range(len(marks4)):
308
  marks4[i] = float(marks4[i])
309
 
310
  m = max(marks4)
311
- logger.info(f"Max LLM Score: {m}")
312
 
313
  marks = marks/2 + m/2
314
- logger.info(f"Final marks: {marks}")
315
  else:
316
- logger.warning("TFIDF score too low, returning 0")
317
 
318
  return marks
319
 
 
3
  import nltk
4
  import logging
5
  import sys
6
+ from datetime import datetime
7
 
8
+ # Create a logs directory in the temp folder
9
+ log_dir = os.path.join(tempfile.gettempdir(), 'app_logs')
10
+ os.makedirs(log_dir, exist_ok=True)
11
+
12
+ # Create a log file with timestamp
13
+ log_file = os.path.join(log_dir, f'app_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log')
14
+
15
+ # Set up logging to both file and console
16
  logging.basicConfig(
17
  level=logging.INFO,
18
  format='%(asctime)s - %(levelname)s - %(message)s',
19
  handlers=[
20
+ logging.FileHandler(log_file),
21
  logging.StreamHandler(sys.stdout)
22
  ]
23
  )
24
 
25
  logger = logging.getLogger(__name__)
26
 
27
+ # Add a print function that also logs
28
+ def log_print(message, level="INFO"):
29
+ print(message) # This will show in Hugging Face logs
30
+ if level == "INFO":
31
+ logger.info(message)
32
+ elif level == "ERROR":
33
+ logger.error(message)
34
+ elif level == "WARNING":
35
+ logger.warning(message)
36
+
37
  # Set up all cache and data directories in /tmp
38
  cache_dir = tempfile.mkdtemp()
39
  nltk_data_dir = os.path.join(cache_dir, 'nltk_data')
 
154
  # Get and process answers
155
  a = request.form.get('answers')
156
  if not a:
157
+ log_print("No answers provided", "ERROR")
158
  return jsonify({"error": "No answers provided"}), 400
159
 
160
+ log_print("=== Processing Answers ===")
161
+ log_print(f"Received answers: {a}")
162
  a = json.loads(a)
163
  answers = []
164
  for i in a:
165
  ans = i.split('\n\n')
166
  answers.append(ans)
167
+ log_print(f"Processed answers structure: {answers}")
168
 
169
  # Process files and create data structure
170
  data = {}
171
  parent_folder = os.path.join(cache_dir, 'student_answers')
172
  os.makedirs(parent_folder, exist_ok=True)
173
 
174
+ log_print("=== Processing Uploaded Files ===")
175
  files = request.files.getlist('files[]')
176
  if not files:
177
+ log_print("No files uploaded", "ERROR")
178
  return jsonify({"error": "No files uploaded"}), 400
179
 
180
+ log_print(f"Number of files received: {len(files)}")
181
 
182
  # File processing with logging
183
  for file in files:
 
185
  relative_path = file.filename.replace('\\', '/')
186
  path_parts = relative_path.split('/')
187
 
188
+ log_print(f"Processing file: {file.filename}")
189
+ log_print(f"Path parts: {path_parts}")
190
 
191
  if len(path_parts) >= 2:
192
  student_folder = path_parts[1]
 
197
 
198
  save_path = os.path.join(student_dir, file_name)
199
  file.save(save_path)
200
+ log_print(f"Saved file: {save_path}")
201
 
202
  if student_folder not in data:
203
  data[student_folder] = []
 
206
  'name': os.path.splitext(file_name)[0]
207
  })
208
  else:
209
+ log_print(f"File {file.filename} doesn't have expected structure", "WARNING")
210
 
211
  # Log data structure
212
+ log_print("=== Final Data Structure ===")
213
  for student, images in data.items():
214
+ log_print(f"Student: {student}")
215
  for img in sorted(images, key=lambda x: x['name']):
216
+ log_print(f" - {img['name']} ({img['path']})")
217
 
218
  # Calculate marks with logging
219
  results = []
 
227
  try:
228
  image_path = image_info['path']
229
  s_answer = extract_text_from_image(image_path)
230
+ log_print(f"\nProcessing {student_folder}/{image_info['name']}:")
231
+ log_print(f"Extracted answer: {s_answer}")
232
 
233
  if s_answer and idx < len(answers):
234
+ log_print(f"Reference answer: {answers[idx]}")
235
  tf_idf_word_values, max_tfidf = create_tfidf_values(answers[idx])
236
  m = marks(s_answer, sen_vec_answers[idx], word_vec_answers[idx],
237
  tf_idf_word_values, max_tfidf, answers[idx])
 
241
  mark_value = round(float(m), 2)
242
  student_total += mark_value
243
  student_count += 1
244
+ log_print(f"Marks awarded: {mark_value}")
245
  else:
246
  mark_value = 0
247
+ log_print(f"No text extracted or no reference answer for index {idx}", "WARNING")
248
 
249
  results.append({
250
  'student': student_folder,
 
253
  })
254
 
255
  except Exception as e:
256
+ log_print(f"Error processing {image_path}: {str(e)}", "ERROR")
257
  results.append({
258
  'student': student_folder,
259
  'image_name': image_info['name'],
 
263
  # Sort results
264
  results.sort(key=lambda x: (x['student'], x['image_name']))
265
 
266
+ log_print("\nFinal Results:")
267
  for r in results:
268
+ log_print(f"{r['student']}\t{r['image_name']}\t{r['marks']}")
269
 
270
  # Clean up temporary directory
271
  try:
272
  import shutil
273
  shutil.rmtree(parent_folder)
274
+ log_print(f"Cleaned up temporary directory: {parent_folder}")
275
  except Exception as e:
276
+ log_print(f"Warning: Could not clean up temporary directory: {e}", "WARNING")
277
 
278
  return jsonify({
279
  "message": results,
 
281
  }), 200
282
 
283
  except Exception as e:
284
+ log_print(f"Error in compute_marks: {str(e)}", "ERROR")
285
  try:
286
  import shutil
287
  shutil.rmtree(parent_folder)
 
293
 
294
  def marks(answer, sen_vec_answers, word_vec_answers, tf_idf_word_values, max_tfidf, correct_answers):
295
  marks = 0
296
+ log_print("=== Marks Calculation ===")
297
+ log_print(f"Processing answer: {answer[:100]}...") # Log first 100 chars
298
 
299
  marks1 = tfidf_answer_score(answer, tf_idf_word_values, max_tfidf, marks=10)
300
+ log_print(f"TFIDF Score: {marks1}")
301
 
302
  if marks1 > 3:
303
  marks += new_value(marks1, old_min=3, old_max=10, new_min=0, new_max=5)
304
+ log_print(f"After TFIDF adjustment: {marks}")
305
 
306
  if marks1 > 2:
307
  marks2 = similarity_model_score(sen_vec_answers, answer)
308
+ log_print(f"Sentence Similarity Score: {marks2}")
309
 
310
  if marks2 > 0.95:
311
  marks += 3
 
313
  marks += new_value(marks2, old_min=0.5, old_max=0.95, new_min=0, new_max=3)
314
 
315
  marks3 = fasttext_similarity(word_vec_answers, answer)
316
+ log_print(f"Word Similarity Score: {marks3}")
317
 
318
+ if marks3 > 0.9:
319
  marks += 2
320
  elif marks3 > 0.4:
321
  marks += new_value(marks3, old_min=0.4, old_max=0.9, new_min=0, new_max=2)
322
 
323
  marks4 = llm_score(correct_answers, answer)
324
+ log_print(f"LLM Scores: {marks4}")
325
 
326
  for i in range(len(marks4)):
327
  marks4[i] = float(marks4[i])
328
 
329
  m = max(marks4)
330
+ log_print(f"Max LLM Score: {m}")
331
 
332
  marks = marks/2 + m/2
333
+ log_print(f"Final marks: {marks}")
334
  else:
335
+ log_print("TFIDF score too low, returning 0", "WARNING")
336
 
337
  return marks
338