mashaelalbu commited on
Commit
0c70cb8
·
verified ·
1 Parent(s): 8648ca4

Update app/utils.py

Browse files
Files changed (1) hide show
  1. app/utils.py +74 -83
app/utils.py CHANGED
@@ -208,88 +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
- # قاموس لتتبع أول كلمة لكل حساسية
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ }