mashaelalbu commited on
Commit
1b7641b
·
verified ·
1 Parent(s): afd56c2

Update app/utils.py

Browse files
Files changed (1) hide show
  1. app/utils.py +83 -54
app/utils.py CHANGED
@@ -208,59 +208,88 @@ Respond only with the category name if found or 'None' if not found.
208
 
209
  return None
210
 
211
- def analyze_image(self, image, claude_api_key=None, user_allergies=None):
212
- """تحليل الصورة للكشف عن الحساسيات مع مراعاة حساسيات المستخدم"""
213
- try:
214
- if not self.allergy_data:
215
- raise ValueError("Allergy data not loaded")
216
-
217
- if not user_allergies:
218
- raise ValueError("User allergies not provided")
219
-
220
- # استخراج النص من الصورة
221
- extracted_text = self.ocr_model.process_image(image)
222
- if extracted_text.startswith("Error processing image"):
223
- raise ValueError(extracted_text)
224
-
225
- logger.info(f"Extracted text: {extracted_text[:200]}...")
226
-
227
- # تحويل النص إلى tokens
228
- tokens = self.tokenize_text(extracted_text)
229
- if not tokens:
230
- raise ValueError("No tokens extracted from text")
231
-
232
- database_matches = {}
233
- claude_matches = {}
234
-
235
- for token in tokens:
236
- # البحث أولاً في قاعدة البيانات للحساسيات المحددة فقط
237
- allergy = self.check_allergen_in_excel(token, user_allergies)
 
 
 
 
 
 
 
 
 
 
 
 
 
238
  if allergy:
239
- if allergy not in database_matches:
240
- database_matches[allergy] = []
241
- database_matches[allergy].append(token)
242
- elif claude_api_key:
243
- # إذا لم يُوجد في ملف الإكسل، استدعِ Claude API للحساسيات المحددة فقط
244
- allergy = self.check_allergy_risk(token, claude_api_key, user_allergies)
245
- if allergy:
246
- if allergy not in claude_matches:
247
- claude_matches[allergy] = []
248
- claude_matches[allergy].append(token)
249
-
250
- detected_allergens = list(database_matches.keys()) + list(claude_matches.keys())
251
-
252
- return {
253
- "extracted_text": extracted_text,
254
- "detected_allergens": detected_allergens,
255
- "database_matches": database_matches,
256
- "claude_matches": claude_matches,
257
- "analyzed_tokens": tokens,
258
- "success": True
259
- }
260
 
261
- except Exception as e:
262
- logger.error(f"Error analyzing image: {str(e)}", exc_info=True)
263
- return {
264
- "error": str(e),
265
- "success": False
266
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
208
 
209
  return None
210
 
211
+ def analyze_image(self, image, claude_api_key=None, user_allergies=None):
212
+ """تحليل الصورة للكشف عن الحساسيات مع مراعاة حساسيات المستخدم"""
213
+ try:
214
+ if not self.allergy_data:
215
+ raise ValueError("Allergy data not loaded")
216
+
217
+ if not user_allergies:
218
+ raise ValueError("User allergies not provided")
219
+
220
+ # استخراج النص من الصورة
221
+ extracted_text = self.ocr_model.process_image(image)
222
+ if extracted_text.startswith("Error processing image"):
223
+ raise ValueError(extracted_text)
224
+
225
+ logger.info(f"Extracted text: {extracted_text[:200]}...")
226
+
227
+ # تحويل النص إلى tokens
228
+ tokens = self.tokenize_text(extracted_text)
229
+ if not tokens:
230
+ raise ValueError("No tokens extracted from text")
231
+
232
+ database_matches = {}
233
+ claude_matches = {}
234
+
235
+ # قاموس لتتبع أول كلمة لكل حساسية
236
+ first_occurrence = {}
237
+
238
+ for token in tokens:
239
+ # البحث أولاً في قاعدة البيانات للحساسيات المحددة فقط
240
+ allergy = self.check_allergen_in_excel(token, user_allergies)
241
+ if allergy:
242
+ if allergy not in database_matches:
243
+ database_matches[allergy] = []
244
+ # حفظ أول كلمة تم اكتشاف الحساسية فيها
245
+ if allergy not in first_occurrence:
246
+ first_occurrence[allergy] = token
247
+ database_matches[allergy].append(token)
248
+ elif claude_api_key:
249
+ # إذا لم يُوجد في ملف الإكسل، استدعِ Claude API للحساسيات المحددة فقط
250
+ allergy = self.check_allergy_risk(token, claude_api_key, user_allergies)
251
  if allergy:
252
+ if allergy not in claude_matches:
253
+ claude_matches[allergy] = []
254
+ # حفظ أول كلمة تم اكتشاف الحساسية فيها
255
+ if allergy not in first_occurrence:
256
+ first_occurrence[allergy] = token
257
+ claude_matches[allergy].append(token)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
 
259
+ # إنشاء قائمة الحساسيات المكتشفة مع أول كلمة لكل منها
260
+ detected_allergens = []
261
+ seen_allergens = set()
262
+
263
+ # إضافة الحساسيات من قاعدة البيانات أولاً
264
+ for allergy in database_matches.keys():
265
+ if allergy not in seen_allergens:
266
+ detected_allergens.append({
267
+ "allergen": allergy,
268
+ "first_word": first_occurrence.get(allergy, "unknown")
269
+ })
270
+ seen_allergens.add(allergy)
271
+
272
+ # إضافة الحساسيات من Claude API
273
+ for allergy in claude_matches.keys():
274
+ if allergy not in seen_allergens:
275
+ detected_allergens.append({
276
+ "allergen": allergy,
277
+ "first_word": first_occurrence.get(allergy, "unknown")
278
+ })
279
+ seen_allergens.add(allergy)
280
+
281
+ return {
282
+ "extracted_text": extracted_text,
283
+ "detected_allergens": detected_allergens,
284
+ "database_matches": database_matches,
285
+ "claude_matches": claude_matches,
286
+ "analyzed_tokens": tokens,
287
+ "success": True
288
+ }
289
+
290
+ except Exception as e:
291
+ logger.error(f"Error analyzing image: {str(e)}", exc_info=True)
292
+ return {
293
+ "error": str(e),
294
+ "success": False
295
+ }