mashaelalbu commited on
Commit
228fbeb
·
verified ·
1 Parent(s): 0c70cb8

Update app/utils.py

Browse files
Files changed (1) hide show
  1. app/utils.py +74 -74
app/utils.py CHANGED
@@ -208,79 +208,79 @@ 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] = set() # استخدام set لمنع التكرار
241
- database_matches[allergy].add(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] = set() # استخدام set لمنع التكرار
248
- claude_matches[allergy].add(token)
249
-
250
- # إنشاء قائمة الحساسيات المكتشفة مع كل الكلمات المرتبطة بها
251
- detected_allergens = []
252
- seen_allergens = set()
253
-
254
- # إضافة الحساسيات من قاعدة البيانات أولاً
255
- for allergy, words in database_matches.items():
256
- if allergy not in seen_allergens:
257
- detected_allergens.append({
258
- "allergen": allergy,
259
- "related_words": list(words) # تحويل set إلى list
260
- })
261
- seen_allergens.add(allergy)
262
-
263
- # إضافة الحساسيات من Claude API
264
- for allergy, words in claude_matches.items():
265
- if allergy not in seen_allergens:
266
- detected_allergens.append({
267
- "allergen": allergy,
268
- "related_words": list(words) # تحويل set إلى list
269
- })
270
- seen_allergens.add(allergy)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
 
272
- return {
273
- "extracted_text": extracted_text,
274
- "detected_allergens": detected_allergens,
275
- "database_matches": {k: list(v) for k, v in database_matches.items()}, # تحويل sets إلى lists
276
- "claude_matches": {k: list(v) for k, v in claude_matches.items()}, # تحويل sets إلى lists
277
- "analyzed_tokens": tokens,
278
- "success": True
279
- }
280
-
281
- except Exception as e:
282
- logger.error(f"Error analyzing image: {str(e)}", exc_info=True)
283
- return {
284
- "error": str(e),
285
- "success": False
286
- }
 
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] = set() # استخدام set لمنع التكرار
241
+ database_matches[allergy].add(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] = set() # استخدام set لمنع التكرار
248
+ claude_matches[allergy].add(token)
249
+
250
+ # إنشاء قائمة الحساسيات المكتشفة مع كل الكلمات المرتبطة بها
251
+ detected_allergens = []
252
+ seen_allergens = set()
253
+
254
+ # إضافة الحساسيات من قاعدة البيانات أولاً
255
+ for allergy, words in database_matches.items():
256
+ if allergy not in seen_allergens:
257
+ detected_allergens.append({
258
+ "allergen": allergy,
259
+ "related_words": list(words) # تحويل set إلى list
260
+ })
261
+ seen_allergens.add(allergy)
262
+
263
+ # إضافة الحساسيات من Claude API
264
+ for allergy, words in claude_matches.items():
265
+ if allergy not in seen_allergens:
266
+ detected_allergens.append({
267
+ "allergen": allergy,
268
+ "related_words": list(words) # تحويل set إلى list
269
+ })
270
+ seen_allergens.add(allergy)
271
+
272
+ return {
273
+ "extracted_text": extracted_text,
274
+ "detected_allergens": detected_allergens,
275
+ "database_matches": {k: list(v) for k, v in database_matches.items()}, # تحويل sets إلى lists
276
+ "claude_matches": {k: list(v) for k, v in claude_matches.items()}, # تحويل sets إلى lists
277
+ "analyzed_tokens": tokens,
278
+ "success": True
279
+ }
280
 
281
+ except Exception as e:
282
+ logger.error(f"Error analyzing image: {str(e)}", exc_info=True)
283
+ return {
284
+ "error": str(e),
285
+ "success": False
286
+ }