Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -55,7 +55,20 @@ def load_data():
|
|
| 55 |
st.error(f"Error cargando los archivos de datos: {e}")
|
| 56 |
return None, None
|
| 57 |
alimentos_data, foodb_index = load_data()
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
MASTER_SYMPTOM_MAP = {
|
| 60 |
"dolor abdominal": {
|
| 61 |
"frases_es": ["dolor de estómago", "dolor de panza", "dolor abdominal", "retortijones", "cólicos", "calambres abdominales"],
|
|
@@ -859,7 +872,7 @@ if st.session_state.search_results is not None:
|
|
| 859 |
if foodb_index:
|
| 860 |
with st.popover("🔬 Componentes Moleculares Relevantes"):
|
| 861 |
|
| 862 |
-
REMEDIAL_PREFIXES = ("anti", "preventive", "remedy", "treatment", "inhibitor")
|
| 863 |
|
| 864 |
st.info("Compuestos en el alimento más relevante que podrían estar relacionados con tus síntomas.")
|
| 865 |
|
|
@@ -869,29 +882,37 @@ if st.session_state.search_results is not None:
|
|
| 869 |
if not user_foods_mentioned or not user_symptoms_es:
|
| 870 |
st.warning("Se necesita al menos un alimento y un síntoma para el análisis molecular.")
|
| 871 |
else:
|
| 872 |
-
# 1. Encontrar la mejor y única coincidencia de alimento
|
| 873 |
best_food_match_key = find_best_foodb_match(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
| 874 |
|
| 875 |
if not best_food_match_key:
|
| 876 |
st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
|
| 877 |
else:
|
| 878 |
-
# 2. Realizar el análisis solo en la mejor coincidencia
|
| 879 |
st.subheader(f"Análisis de: {best_food_match_key.capitalize()}")
|
| 880 |
|
| 881 |
compounds_data = foodb_index[best_food_match_key]
|
| 882 |
-
symptom_keywords_en = []
|
| 883 |
-
for symptom_es in user_symptoms_es:
|
| 884 |
-
if symptom_es in MASTER_SYMPTOM_MAP:
|
| 885 |
-
symptom_keywords_en.extend(MASTER_SYMPTOM_MAP[symptom_es].get('keywords_en', []))
|
| 886 |
|
| 887 |
causative_compounds = []
|
| 888 |
remedial_compounds = []
|
| 889 |
|
| 890 |
for item in compounds_data:
|
|
|
|
| 891 |
effects_en = item.get("effects", [])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 892 |
is_causative = False
|
| 893 |
is_remedial = False
|
| 894 |
-
|
| 895 |
for effect in effects_en:
|
| 896 |
if any(keyword in effect.lower() for keyword in symptom_keywords_en):
|
| 897 |
if effect.lower().startswith(REMEDIAL_PREFIXES):
|
|
@@ -909,11 +930,15 @@ if st.session_state.search_results is not None:
|
|
| 909 |
st.markdown("###### 🔬 Posibles Compuestos Desencadenantes:")
|
| 910 |
for item in causative_compounds[:5]:
|
| 911 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 912 |
-
|
| 913 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 914 |
elif remedial_compounds:
|
| 915 |
st.markdown("###### 💊 Compuestos con Efectos Potencialmente Beneficiosos:")
|
| 916 |
-
st.caption("No se encontraron compuestos desencadenantes directos
|
| 917 |
for item in remedial_compounds[:5]:
|
| 918 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 919 |
relevant_effects = [eff for eff in item['effects'] if any(kw in eff.lower() and eff.lower().startswith(REMEDIAL_PREFIXES) for kw in symptom_keywords_en)]
|
|
|
|
| 55 |
st.error(f"Error cargando los archivos de datos: {e}")
|
| 56 |
return None, None
|
| 57 |
alimentos_data, foodb_index = load_data()
|
| 58 |
+
KNOWN_TRIGGERS_MAP = {
|
| 59 |
+
"Histamine": ["dolor de cabeza", "migraña", "inflamación", "congestión nasal", "picazón", "erupción"],
|
| 60 |
+
"Tyramine": ["dolor de cabeza", "migraña"],
|
| 61 |
+
"Phenylethylamine": ["dolor de cabeza", "migraña"],
|
| 62 |
+
"Gluten": ["niebla mental", "dolor abdominal", "diarrea", "inflamación", "dolor articular"],
|
| 63 |
+
"Casein": ["niebla mental", "inflamación", "acné"],
|
| 64 |
+
"Lactose": ["hinchazón", "gases", "diarrea", "dolor abdominal"],
|
| 65 |
+
"Fructans": ["hinchazón", "gases", "dolor abdominal"],
|
| 66 |
+
"Caffeine": ["ansiedad", "dolor de cabeza", "insomnio"], # Puede causar y remediar dolores de cabeza
|
| 67 |
+
"Alcohol": ["dolor de cabeza", "niebla mental", "inflamación"],
|
| 68 |
+
"Capsaicin": ["dolor", "acidez"],
|
| 69 |
+
"Solanine": ["dolor articular", "inflamación"],
|
| 70 |
+
"Lectins": ["inflamación", "dolor articular", "hinchazón"]
|
| 71 |
+
}
|
| 72 |
MASTER_SYMPTOM_MAP = {
|
| 73 |
"dolor abdominal": {
|
| 74 |
"frases_es": ["dolor de estómago", "dolor de panza", "dolor abdominal", "retortijones", "cólicos", "calambres abdominales"],
|
|
|
|
| 872 |
if foodb_index:
|
| 873 |
with st.popover("🔬 Componentes Moleculares Relevantes"):
|
| 874 |
|
| 875 |
+
REMEDIAL_PREFIXES = ("anti", "preventive", "remedy", "treatment", "inhibitor", "anxiolytic", "analgesic")
|
| 876 |
|
| 877 |
st.info("Compuestos en el alimento más relevante que podrían estar relacionados con tus síntomas.")
|
| 878 |
|
|
|
|
| 882 |
if not user_foods_mentioned or not user_symptoms_es:
|
| 883 |
st.warning("Se necesita al menos un alimento y un síntoma para el análisis molecular.")
|
| 884 |
else:
|
|
|
|
| 885 |
best_food_match_key = find_best_foodb_match(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
| 886 |
|
| 887 |
if not best_food_match_key:
|
| 888 |
st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
|
| 889 |
else:
|
|
|
|
| 890 |
st.subheader(f"Análisis de: {best_food_match_key.capitalize()}")
|
| 891 |
|
| 892 |
compounds_data = foodb_index[best_food_match_key]
|
| 893 |
+
symptom_keywords_en = {kw for sym in user_symptoms_es if sym in MASTER_SYMPTOM_MAP for kw in MASTER_SYMPTOM_MAP[sym].get('keywords_en', [])}
|
|
|
|
|
|
|
|
|
|
| 894 |
|
| 895 |
causative_compounds = []
|
| 896 |
remedial_compounds = []
|
| 897 |
|
| 898 |
for item in compounds_data:
|
| 899 |
+
compound_name = item['compound']
|
| 900 |
effects_en = item.get("effects", [])
|
| 901 |
+
|
| 902 |
+
# --- LÓGICA DE PRIORIDAD ---
|
| 903 |
+
# 1. ¿Es un desencadenante conocido para ESTE síntoma?
|
| 904 |
+
is_known_trigger = False
|
| 905 |
+
if compound_name in KNOWN_TRIGGERS_MAP:
|
| 906 |
+
if any(symptom in KNOWN_TRIGGERS_MAP[compound_name] for symptom in user_symptoms_es):
|
| 907 |
+
causative_compounds.append(item)
|
| 908 |
+
is_known_trigger = True
|
| 909 |
+
|
| 910 |
+
if is_known_trigger:
|
| 911 |
+
continue # Si ya es un culpable, no lo analizamos más
|
| 912 |
+
|
| 913 |
+
# 2. Si no, analizar efectos para causas o remedios
|
| 914 |
is_causative = False
|
| 915 |
is_remedial = False
|
|
|
|
| 916 |
for effect in effects_en:
|
| 917 |
if any(keyword in effect.lower() for keyword in symptom_keywords_en):
|
| 918 |
if effect.lower().startswith(REMEDIAL_PREFIXES):
|
|
|
|
| 930 |
st.markdown("###### 🔬 Posibles Compuestos Desencadenantes:")
|
| 931 |
for item in causative_compounds[:5]:
|
| 932 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 933 |
+
# Mostramos por qué es un desencadenante conocido, o los efectos relevantes
|
| 934 |
+
if item['compound'] in KNOWN_TRIGGERS_MAP:
|
| 935 |
+
st.write(f"**Efectos Relevantes:** Desencadenante conocido de {', '.join([s for s in user_symptoms_es if s in KNOWN_TRIGGERS_MAP[item['compound']]])}")
|
| 936 |
+
else:
|
| 937 |
+
relevant_effects = [eff for eff in item['effects'] if any(kw in eff.lower() and not eff.lower().startswith(REMEDIAL_PREFIXES) for kw in symptom_keywords_en)]
|
| 938 |
+
st.write(f"**Efectos Relevantes:** {', '.join(relevant_effects)}")
|
| 939 |
elif remedial_compounds:
|
| 940 |
st.markdown("###### 💊 Compuestos con Efectos Potencialmente Beneficiosos:")
|
| 941 |
+
st.caption("No se encontraron compuestos desencadenantes directos en la base de datos.")
|
| 942 |
for item in remedial_compounds[:5]:
|
| 943 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 944 |
relevant_effects = [eff for eff in item['effects'] if any(kw in eff.lower() and eff.lower().startswith(REMEDIAL_PREFIXES) for kw in symptom_keywords_en)]
|