Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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,
|
|
|
|
| 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
|
| 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
|
| 781 |
-
|
| 782 |
-
|
| 783 |
-
all_possible_matches.extend([key for key in foodb_index_keys if
|
| 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 |
-
|
| 987 |
direct_text = best_match.get("compuesto_alimento", "").lower()
|
| 988 |
cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
|
| 989 |
-
|
| 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
|
| 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
|
| 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("---")
|