Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -54,6 +54,22 @@ def load_data():
|
|
| 54 |
st.error(f"Error cargando los archivos de datos: {e}")
|
| 55 |
return None, None
|
| 56 |
alimentos_data, foodb_index = load_data()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
KNOWN_TRIGGERS_MAP = {
|
| 58 |
# --- Aminas Vasoactivas y Bi贸genas ---
|
| 59 |
"Histamine": ["dolor de cabeza", "migra帽a", "inflamaci贸n", "congesti贸n nasal", "picaz贸n", "erupci贸n", "ansiedad", "diarrea"],
|
|
@@ -756,20 +772,20 @@ def find_best_foodb_matches(user_foods_es, foodb_index_keys, food_name_map, limi
|
|
| 756 |
|
| 757 |
found_matches = []
|
| 758 |
|
| 759 |
-
# B煤squeda por prioridades
|
|
|
|
| 760 |
for term in sorted_terms:
|
| 761 |
# Prioridad 1: Coincidencia perfecta
|
| 762 |
-
for key in foodb_index_keys
|
| 763 |
-
if term == key.lower() and key not in found_matches:
|
| 764 |
-
found_matches.append(key)
|
| 765 |
# Prioridad 2: Coincidencia de inicio
|
| 766 |
-
for key in foodb_index_keys
|
| 767 |
-
if key.lower().startswith(term) and key not in found_matches:
|
| 768 |
-
found_matches.append(key)
|
| 769 |
# Prioridad 3: Coincidencia general
|
| 770 |
-
for key in foodb_index_keys
|
| 771 |
-
|
| 772 |
-
|
|
|
|
|
|
|
|
|
|
| 773 |
|
| 774 |
return found_matches[:limit]
|
| 775 |
|
|
@@ -957,38 +973,47 @@ if st.session_state.search_results is not None:
|
|
| 957 |
score_col2.metric("Puntos por S铆ntomas", f"{best_match_data['score']['symptoms']}")
|
| 958 |
score_col3.metric("PUNTUACI脫N TOTAL", f"{best_match_data['score']['total']}", delta="M谩xima coincidencia")
|
| 959 |
|
| 960 |
-
|
| 961 |
st.write("")
|
| 962 |
if foodb_index:
|
| 963 |
with st.popover("馃敩 Componentes Moleculares del Diagn贸stico"):
|
|
|
|
| 964 |
st.info("An谩lisis de los compuestos en los alimentos mencionados que est谩n directamente implicados en el diagn贸stico principal.")
|
|
|
|
| 965 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 966 |
|
| 967 |
if not user_foods_mentioned:
|
| 968 |
st.warning("No se identific贸 un alimento espec铆fico para buscar.")
|
| 969 |
else:
|
| 970 |
-
|
| 971 |
-
target_compounds = set()
|
| 972 |
|
| 973 |
-
|
| 974 |
-
|
| 975 |
-
direct_keywords = set(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
|
| 976 |
|
| 977 |
-
|
| 978 |
-
|
| 979 |
-
|
| 980 |
-
|
| 981 |
-
|
| 982 |
-
|
| 983 |
-
|
| 984 |
-
|
| 985 |
-
|
| 986 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 987 |
|
| 988 |
-
if not
|
| 989 |
st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
|
| 990 |
else:
|
|
|
|
| 991 |
best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
|
|
|
| 992 |
if not best_food_matches:
|
| 993 |
st.warning("No se encontraron datos moleculares para los alimentos espec铆ficos mencionados.")
|
| 994 |
else:
|
|
@@ -998,19 +1023,23 @@ if st.session_state.search_results is not None:
|
|
| 998 |
relevant_compounds = []
|
| 999 |
for item in compounds_data:
|
| 1000 |
compound_name_lower = item['compound'].lower()
|
| 1001 |
-
if any(target in compound_name_lower for target in
|
| 1002 |
relevant_compounds.append(item)
|
|
|
|
| 1003 |
if relevant_compounds:
|
| 1004 |
found_any_data = True
|
| 1005 |
with st.container(border=True):
|
| 1006 |
st.subheader(f"An谩lisis de: {food_key.capitalize()}")
|
| 1007 |
st.markdown("###### 馃敩 Compuestos Relevantes para el Diagn贸stico:")
|
| 1008 |
-
|
| 1009 |
-
|
| 1010 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1011 |
if not found_any_data:
|
| 1012 |
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.")
|
| 1013 |
-
|
| 1014 |
st.markdown("---")
|
| 1015 |
with st.container(border=True):
|
| 1016 |
st.markdown("##### 馃 Posibles Efectos Neuropsicol贸gicos de los Componentes")
|
|
|
|
| 54 |
st.error(f"Error cargando los archivos de datos: {e}")
|
| 55 |
return None, None
|
| 56 |
alimentos_data, foodb_index = load_data()
|
| 57 |
+
COMPOUND_SYNONYM_MAP = {
|
| 58 |
+
"purinas": ["purine", "hypoxanthine", "adenine", "guanine", "xanthine"],
|
| 59 |
+
"fodmaps": ["fructan", "oligosaccharide", "polyol", "sorbitol", "mannitol"],
|
| 60 |
+
"aminas": ["amine", "histamine", "tyramine", "phenylethylamine", "putrescine", "cadaverine"],
|
| 61 |
+
"gluten": ["gluten", "gliadin"],
|
| 62 |
+
"case铆na": ["casein", "casomorphin"],
|
| 63 |
+
"lactosa": ["lactose"],
|
| 64 |
+
"fructosa": ["fructose"],
|
| 65 |
+
"oxalatos": ["oxalate", "oxalic acid"],
|
| 66 |
+
"salicilatos": ["salicylate", "salicylic acid"],
|
| 67 |
+
"lectinas": ["lectin", "agglutinin"],
|
| 68 |
+
"sulfitos": ["sulfite", "sulphite"],
|
| 69 |
+
"glutamato": ["glutamate", "glutamic acid"],
|
| 70 |
+
# A帽ade m谩s sin贸nimos aqu铆 seg煤n sea necesario
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
KNOWN_TRIGGERS_MAP = {
|
| 74 |
# --- Aminas Vasoactivas y Bi贸genas ---
|
| 75 |
"Histamine": ["dolor de cabeza", "migra帽a", "inflamaci贸n", "congesti贸n nasal", "picaz贸n", "erupci贸n", "ansiedad", "diarrea"],
|
|
|
|
| 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:
|
| 787 |
+
if match not in found_matches:
|
| 788 |
+
found_matches.append(match)
|
| 789 |
|
| 790 |
return found_matches[:limit]
|
| 791 |
|
|
|
|
| 973 |
score_col2.metric("Puntos por S铆ntomas", f"{best_match_data['score']['symptoms']}")
|
| 974 |
score_col3.metric("PUNTUACI脫N TOTAL", f"{best_match_data['score']['total']}", delta="M谩xima coincidencia")
|
| 975 |
|
| 976 |
+
with col2_expander:
|
| 977 |
st.write("")
|
| 978 |
if foodb_index:
|
| 979 |
with st.popover("馃敩 Componentes Moleculares del Diagn贸stico"):
|
| 980 |
+
|
| 981 |
st.info("An谩lisis de los compuestos en los alimentos mencionados que est谩n directamente implicados en el diagn贸stico principal.")
|
| 982 |
+
|
| 983 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 984 |
|
| 985 |
if not user_foods_mentioned:
|
| 986 |
st.warning("No se identific贸 un alimento espec铆fico para buscar.")
|
| 987 |
else:
|
| 988 |
+
# --- NUEVA L脫GICA DE ENRIQUECIMIENTO DE PISTAS ---
|
|
|
|
| 989 |
|
| 990 |
+
# 1. RECOPILACI脫N DE PISTAS INICIALES
|
| 991 |
+
initial_clues = set()
|
|
|
|
| 992 |
|
| 993 |
+
# Pista Directa: del campo 'compuesto_alimento' del diagn贸stico
|
| 994 |
+
direct_text = best_match.get("compuesto_alimento", "").lower()
|
| 995 |
+
cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
|
| 996 |
+
initial_clues.update(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
|
| 997 |
+
|
| 998 |
+
# Pistas Indirectas: de los s铆ntomas del diagn贸stico via KNOWN_TRIGGERS_MAP
|
| 999 |
+
main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
|
| 1000 |
+
for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
|
| 1001 |
+
if main_diagnosis_symptoms.intersection(triggered_symptoms):
|
| 1002 |
+
initial_clues.add(compound.lower())
|
| 1003 |
+
|
| 1004 |
+
# 2. ENRIQUECIMIENTO DE PISTAS con sin贸nimos moleculares
|
| 1005 |
+
final_search_keywords = set()
|
| 1006 |
+
for clue in initial_clues:
|
| 1007 |
+
final_search_keywords.add(clue) # A帽adir la pista original
|
| 1008 |
+
if clue in COMPOUND_SYNONYM_MAP:
|
| 1009 |
+
final_search_keywords.update(COMPOUND_SYNONYM_MAP[clue])
|
| 1010 |
|
| 1011 |
+
if not final_search_keywords:
|
| 1012 |
st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
|
| 1013 |
else:
|
| 1014 |
+
logger.info(f"Buscando compuestos moleculares con las palabras clave: {final_search_keywords}")
|
| 1015 |
best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
| 1016 |
+
|
| 1017 |
if not best_food_matches:
|
| 1018 |
st.warning("No se encontraron datos moleculares para los alimentos espec铆ficos mencionados.")
|
| 1019 |
else:
|
|
|
|
| 1023 |
relevant_compounds = []
|
| 1024 |
for item in compounds_data:
|
| 1025 |
compound_name_lower = item['compound'].lower()
|
| 1026 |
+
if any(target in compound_name_lower for target in final_search_keywords):
|
| 1027 |
relevant_compounds.append(item)
|
| 1028 |
+
|
| 1029 |
if relevant_compounds:
|
| 1030 |
found_any_data = True
|
| 1031 |
with st.container(border=True):
|
| 1032 |
st.subheader(f"An谩lisis de: {food_key.capitalize()}")
|
| 1033 |
st.markdown("###### 馃敩 Compuestos Relevantes para el Diagn贸stico:")
|
| 1034 |
+
unique_compounds_shown = set()
|
| 1035 |
+
for item in relevant_compounds:
|
| 1036 |
+
if item['compound'] not in unique_compounds_shown:
|
| 1037 |
+
st.write(f"**Compuesto:** {item['compound']}")
|
| 1038 |
+
st.caption(f"Este compuesto est谩 directamente relacionado con '{best_match.get('condicion_asociada')}'.")
|
| 1039 |
+
unique_compounds_shown.add(item['compound'])
|
| 1040 |
+
|
| 1041 |
if not found_any_data:
|
| 1042 |
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.")
|
|
|
|
| 1043 |
st.markdown("---")
|
| 1044 |
with st.container(border=True):
|
| 1045 |
st.markdown("##### 馃 Posibles Efectos Neuropsicol贸gicos de los Componentes")
|