JairoCesar commited on
Commit
3e58e62
verified
1 Parent(s): a54319c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -32
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
- if term in key.lower() and key not in found_matches:
772
- found_matches.append(key)
 
 
 
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
- with col2_expander:
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
- main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
971
- target_compounds = set()
972
 
973
- target_compounds_text = best_match.get("compuesto_alimento", "").lower()
974
- cleaned_text = re.sub(r'\(.*?\)', '', target_compounds_text)
975
- direct_keywords = set(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
976
 
977
- generic_words = {'y', 'o', 'en', 'con', 'l谩cteos', 'carnes', 'pescados'}
978
- direct_keywords -= generic_words
979
-
980
- if direct_keywords:
981
- target_compounds.update(direct_keywords)
982
-
983
- if not target_compounds:
984
- for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
985
- if main_diagnosis_symptoms.intersection(triggered_symptoms):
986
- target_compounds.add(compound.lower())
 
 
 
 
 
 
 
987
 
988
- if not target_compounds:
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 target_compounds):
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
- for item in relevant_compounds[:5]:
1009
- st.write(f"**Compuesto:** {item['compound']}")
1010
- st.caption(f"Este compuesto est谩 directamente relacionado con '{best_match.get('condicion_asociada')}'.")
 
 
 
 
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")