JairoCesar commited on
Commit
940dc96
·
verified ·
1 Parent(s): aa6a261

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +19 -19
app.py CHANGED
@@ -752,9 +752,11 @@ def find_best_matches_hybrid(entities, data):
752
 
753
  @retry(wait=wait_random_exponential(min=1, max=10), stop=stop_after_attempt(3))
754
 
 
755
  def find_best_foodb_matches(user_foods_es, foodb_index_keys, food_name_map, limit=3):
756
  """
757
- Encuentra una lista de las mejores coincidencias de alimentos en FoodB, priorizando la especificidad.
 
758
  """
759
  if not user_foods_es:
760
  return []
@@ -772,15 +774,15 @@ def find_best_foodb_matches(user_foods_es, foodb_index_keys, food_name_map, limi
772
 
773
  found_matches = []
774
 
775
- # Búsqueda por prioridades para encontrar varias coincidencias relevantes
776
  all_possible_matches = []
777
  for term in sorted_terms:
778
  # Prioridad 1: Coincidencia perfecta
779
  all_possible_matches.extend([key for key in foodb_index_keys if term == key.lower()])
780
- # Prioridad 2: Coincidencia de inicio
781
- all_possible_matches.extend([key for key in foodb_index_keys if key.lower().startswith(term)])
782
- # Prioridad 3: Coincidencia general
783
- all_possible_matches.extend([key for key in foodb_index_keys if term in key.lower()])
784
 
785
  # Eliminar duplicados manteniendo el orden
786
  for match in all_possible_matches:
@@ -983,26 +985,24 @@ if st.session_state.search_results is not None:
983
  if not user_foods_mentioned:
984
  st.warning("No se identificó un alimento específico para buscar.")
985
  else:
986
- initial_clues = set()
987
  direct_text = best_match.get("compuesto_alimento", "").lower()
988
  cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
989
- initial_clues.update(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
990
-
991
- main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
992
- for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
993
- if main_diagnosis_symptoms.intersection(triggered_symptoms):
994
- initial_clues.add(compound.lower())
995
 
996
  final_search_keywords = set()
997
- for clue in initial_clues:
998
- final_search_keywords.add(clue)
999
  if clue in COMPOUND_SYNONYM_MAP:
1000
  final_search_keywords.update(COMPOUND_SYNONYM_MAP[clue])
 
 
1001
 
1002
  if not final_search_keywords:
1003
  st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
1004
  else:
 
1005
  best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
 
1006
  if not best_food_matches:
1007
  st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
1008
  else:
@@ -1014,6 +1014,7 @@ if st.session_state.search_results is not None:
1014
  compound_name_lower = item['compound'].lower()
1015
  if any(target in compound_name_lower for target in final_search_keywords):
1016
  relevant_compounds.append(item)
 
1017
  if relevant_compounds:
1018
  found_any_data = True
1019
  with st.container(border=True):
@@ -1023,11 +1024,12 @@ if st.session_state.search_results is not None:
1023
  for item in relevant_compounds:
1024
  if item['compound'] not in unique_compounds_shown:
1025
  st.write(f"**Compuesto:** {item['compound']}")
1026
- st.caption(f"Este compuesto está directamente relacionado con '{best_match.get('condicion_asociada')}'.")
1027
  unique_compounds_shown.add(item['compound'])
 
1028
  if not found_any_data:
1029
  st.warning(f"No se encontraron los compuestos específicos de '{best_match.get('condicion_asociada')}' en los alimentos analizados en la base de datos FoodB.")
1030
-
1031
  st.markdown("---")
1032
  with st.container(border=True):
1033
  st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
@@ -1090,7 +1092,5 @@ if st.session_state.search_results is not None:
1090
  if analysis_key in st.session_state.analysis_cache:
1091
  st.info(st.session_state.analysis_cache[analysis_key])
1092
 
1093
- # --- LÍNEA CORREGIDA ---
1094
- # Esta línea ahora está fuera del 'with st.container' pero dentro del 'for' loop.
1095
  if i < len(results[1:5]) - 1:
1096
  st.markdown("---")
 
752
 
753
  @retry(wait=wait_random_exponential(min=1, max=10), stop=stop_after_attempt(3))
754
 
755
+
756
  def find_best_foodb_matches(user_foods_es, foodb_index_keys, food_name_map, limit=3):
757
  """
758
+ Encuentra una lista de las mejores coincidencias de alimentos en FoodB,
759
+ utilizando búsqueda de palabras completas para máxima precisión.
760
  """
761
  if not user_foods_es:
762
  return []
 
774
 
775
  found_matches = []
776
 
777
+ # Búsqueda por prioridades
778
  all_possible_matches = []
779
  for term in sorted_terms:
780
  # Prioridad 1: Coincidencia perfecta
781
  all_possible_matches.extend([key for key in foodb_index_keys if term == key.lower()])
782
+ # Prioridad 2: Coincidencia de palabra completa (usando regex)
783
+ # Esto encontrará 'beef' en 'Beef, steak' pero no 'lamb' en 'Lambsquarters'
784
+ regex = r'\b' + re.escape(term) + r'\b'
785
+ all_possible_matches.extend([key for key in foodb_index_keys if re.search(regex, key, re.IGNORECASE)])
786
 
787
  # Eliminar duplicados manteniendo el orden
788
  for match in all_possible_matches:
 
985
  if not user_foods_mentioned:
986
  st.warning("No se identificó un alimento específico para buscar.")
987
  else:
988
+ target_clues = set()
989
  direct_text = best_match.get("compuesto_alimento", "").lower()
990
  cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
991
+ target_clues.update(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
 
 
 
 
 
992
 
993
  final_search_keywords = set()
994
+ for clue in target_clues:
 
995
  if clue in COMPOUND_SYNONYM_MAP:
996
  final_search_keywords.update(COMPOUND_SYNONYM_MAP[clue])
997
+ else:
998
+ final_search_keywords.add(clue)
999
 
1000
  if not final_search_keywords:
1001
  st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
1002
  else:
1003
+ logger.info(f"Buscando compuestos moleculares con las palabras clave: {final_search_keywords}")
1004
  best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
1005
+
1006
  if not best_food_matches:
1007
  st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
1008
  else:
 
1014
  compound_name_lower = item['compound'].lower()
1015
  if any(target in compound_name_lower for target in final_search_keywords):
1016
  relevant_compounds.append(item)
1017
+
1018
  if relevant_compounds:
1019
  found_any_data = True
1020
  with st.container(border=True):
 
1024
  for item in relevant_compounds:
1025
  if item['compound'] not in unique_compounds_shown:
1026
  st.write(f"**Compuesto:** {item['compound']}")
1027
+ st.caption(f"Este compuesto es un tipo de **{', '.join(target_clues).capitalize()}** implicado en '{best_match.get('condicion_asociada')}'.")
1028
  unique_compounds_shown.add(item['compound'])
1029
+
1030
  if not found_any_data:
1031
  st.warning(f"No se encontraron los compuestos específicos de '{best_match.get('condicion_asociada')}' en los alimentos analizados en la base de datos FoodB.")
1032
+
1033
  st.markdown("---")
1034
  with st.container(border=True):
1035
  st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
 
1092
  if analysis_key in st.session_state.analysis_cache:
1093
  st.info(st.session_state.analysis_cache[analysis_key])
1094
 
 
 
1095
  if i < len(results[1:5]) - 1:
1096
  st.markdown("---")