patopla commited on
Commit
10d67ec
·
verified ·
1 Parent(s): 5fd26f7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +147 -86
app.py CHANGED
@@ -3,7 +3,7 @@ import gradio as gr
3
  import requests
4
  import inspect
5
  import pandas as pd
6
- from agent import AmbiguityClassifier
7
  import json
8
 
9
  # (Keep Constants as is)
@@ -15,41 +15,76 @@ DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
15
  class BasicAgent:
16
  def __init__(self):
17
  print("BasicAgent initialized.")
18
- self.analizar_historia = AmbiguityClassifier()
19
 
20
- def __call__(self, question: str) -> str:
21
- print(f"Agent received question (first 50 chars): {question[:50]}...")
22
  try:
23
- resultado = self.analizar_historia(question)
24
 
25
- # Formatear la respuesta
26
- respuesta = []
27
- if resultado["tiene_ambiguedad"]:
28
- respuesta.append("Se encontraron las siguientes ambigüedades:")
29
-
30
- if resultado["ambiguedad_lexica"]:
31
- respuesta.append("\nAmbigüedades léxicas:")
32
- for amb in resultado["ambiguedad_lexica"]:
33
- respuesta.append(f"- {amb}")
34
-
35
- if resultado["ambiguedad_sintactica"]:
36
- respuesta.append("\nAmbigüedades sintácticas:")
37
- for amb in resultado["ambiguedad_sintactica"]:
38
- respuesta.append(f"- {amb}")
39
-
40
- respuesta.append(f"\nScore de ambigüedad: {resultado['score_ambiguedad']}")
41
- respuesta.append("\nSugerencias de mejora:")
42
- for sug in resultado["sugerencias"]:
43
- respuesta.append(f"- {sug}")
44
  else:
45
- respuesta.append("No se encontraron ambigüedades en la historia de usuario.")
46
- respuesta.append(f"Score de ambigüedad: {resultado['score_ambiguedad']}")
47
-
48
- return "\n".join(respuesta)
49
  except Exception as e:
50
- error_msg = f"Error analizando la historia: {str(e)}"
51
  print(error_msg)
52
  return error_msg
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  def run_and_submit_all( profile: gr.OAuthProfile | None):
55
  """
@@ -173,78 +208,99 @@ def run_and_submit_all( profile: gr.OAuthProfile | None):
173
 
174
 
175
  # Inicializar el clasificador
176
- classifier = AmbiguityClassifier()
177
 
178
- def analyze_user_story(user_story: str) -> str:
179
- """Analiza una historia de usuario y retorna los resultados formateados."""
180
- if not user_story.strip():
181
- return "Por favor, ingrese una historia de usuario para analizar."
182
 
183
- # Analizar la historia
184
- result = classifier(user_story)
185
 
186
- # Formatear resultados
187
  output = []
188
- output.append(f"📝 Historia analizada:\n{user_story}\n")
189
- output.append(f"🎯 Score de ambigüedad: {result['score_ambiguedad']}")
190
-
191
- if result['ambiguedad_lexica']:
192
- output.append("\n📚 Ambigüedades léxicas encontradas:")
193
- for amb in result['ambiguedad_lexica']:
194
- output.append(f"• {amb}")
195
 
196
- if result['ambiguedad_sintactica']:
197
- output.append("\n🔍 Ambigüedades sintácticas encontradas:")
198
- for amb in result['ambiguedad_sintactica']:
199
- output.append(f"• {amb}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
200
 
201
- if result['sugerencias']:
202
- output.append("\n💡 Sugerencias de mejora:")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  for sug in result['sugerencias']:
204
  output.append(f"• {sug}")
205
 
 
 
 
206
  return "\n".join(output)
207
 
208
- def analyze_multiple_stories(user_stories: str) -> str:
209
- """Analiza múltiples historias de usuario separadas por líneas."""
210
- if not user_stories.strip():
211
- return "Por favor, ingrese al menos una historia de usuario para analizar."
212
 
213
- stories = [s.strip() for s in user_stories.split('\n') if s.strip()]
214
  all_results = []
215
 
216
- for i, story in enumerate(stories, 1):
217
- result = classifier(story)
218
- story_result = {
219
- "historia": story,
220
- "score": result['score_ambiguedad'],
221
- "ambiguedades_lexicas": result['ambiguedad_lexica'],
222
- "ambiguedades_sintacticas": result['ambiguedad_sintactica'],
223
- "sugerencias": result['sugerencias']
224
- }
225
- all_results.append(story_result)
226
 
227
  return json.dumps(all_results, indent=2, ensure_ascii=False)
228
 
229
  # --- Build Gradio Interface using Blocks ---
230
- with gr.Blocks(title="Detector de Ambigüedades en Historias de Usuario") as demo:
231
  gr.Markdown("""
232
- # 🔍 Detector de Ambigüedades en Historias de Usuario
233
-
234
- Esta herramienta analiza historias de usuario en busca de ambigüedades léxicas y sintácticas,
235
- proporcionando sugerencias para mejorarlas.
 
236
 
237
  ## 📝 Instrucciones:
238
- 1. Ingrese una historia de usuario en el campo de texto
239
- 2. Haga clic en "Analizar"
240
- 3. Revise los resultados y las sugerencias de mejora
241
-
242
  """)
243
 
244
  with gr.Tab("Análisis Individual"):
245
  input_text = gr.Textbox(
246
- label="Historia de Usuario",
247
- placeholder="Como usuario quiero...",
248
  lines=3
249
  )
250
  analyze_btn = gr.Button("Analizar")
@@ -253,32 +309,37 @@ with gr.Blocks(title="Detector de Ambigüedades en Historias de Usuario") as dem
253
  lines=10
254
  )
255
  analyze_btn.click(
256
- analyze_user_story,
257
  inputs=[input_text],
258
  outputs=[output]
259
  )
260
 
261
  with gr.Tab("Análisis Múltiple"):
262
- input_stories = gr.Textbox(
263
- label="Historias de Usuario (una por línea)",
264
- placeholder="Como usuario quiero...\nComo administrador necesito...",
265
  lines=5
266
  )
267
- analyze_multi_btn = gr.Button("Analizar Todas")
268
  output_json = gr.JSON(label="Resultados del Análisis")
269
  analyze_multi_btn.click(
270
- analyze_multiple_stories,
271
- inputs=[input_stories],
272
  outputs=[output_json]
273
  )
274
 
275
  gr.Markdown("""
276
- ## 🚀 Ejemplos de Uso
277
-
278
- Pruebe con estas historias de usuario:
279
  - Como usuario quiero un sistema rápido y eficiente para gestionar mis tareas
280
  - El sistema debe permitir exportar varios tipos de archivos
281
  - Como administrador necesito acceder fácilmente a los reportes
 
 
 
 
 
282
  """)
283
 
284
  gr.LoginButton()
 
3
  import requests
4
  import inspect
5
  import pandas as pd
6
+ from text_analyzer import TextAnalyzer
7
  import json
8
 
9
  # (Keep Constants as is)
 
15
  class BasicAgent:
16
  def __init__(self):
17
  print("BasicAgent initialized.")
18
+ self.analyzer = TextAnalyzer()
19
 
20
+ def __call__(self, text: str) -> str:
21
+ print(f"Agent received text (first 50 chars): {text[:50]}...")
22
  try:
23
+ resultado = self.analyzer(text)
24
 
25
+ # Formatear la respuesta según el tipo de texto
26
+ if resultado.get("tipo") == "historia_usuario":
27
+ return self._format_user_story_response(resultado)
28
+ elif resultado.get("tipo") == "pregunta_general":
29
+ return self._format_general_question_response(resultado)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  else:
31
+ return f"Error: {resultado.get('error', 'Tipo de texto no reconocido')}"
 
 
 
32
  except Exception as e:
33
+ error_msg = f"Error analizando el texto: {str(e)}"
34
  print(error_msg)
35
  return error_msg
36
+
37
+ def _format_user_story_response(self, resultado: dict) -> str:
38
+ """Formatea la respuesta para una historia de usuario."""
39
+ respuesta = []
40
+ if resultado["tiene_ambiguedad"]:
41
+ respuesta.append("Se encontraron las siguientes ambigüedades:")
42
+
43
+ if resultado["ambiguedad_lexica"]:
44
+ respuesta.append("\nAmbigüedades léxicas:")
45
+ for amb in resultado["ambiguedad_lexica"]:
46
+ respuesta.append(f"- {amb}")
47
+
48
+ if resultado["ambiguedad_sintactica"]:
49
+ respuesta.append("\nAmbigüedades sintácticas:")
50
+ for amb in resultado["ambiguedad_sintactica"]:
51
+ respuesta.append(f"- {amb}")
52
+
53
+ respuesta.append(f"\nScore de ambigüedad: {resultado['score_ambiguedad']}")
54
+ respuesta.append("\nSugerencias de mejora:")
55
+ for sug in resultado["sugerencias"]:
56
+ respuesta.append(f"- {sug}")
57
+ else:
58
+ respuesta.append("No se encontraron ambigüedades en la historia de usuario.")
59
+ respuesta.append(f"Score de ambigüedad: {resultado['score_ambiguedad']}")
60
+
61
+ return "\n".join(respuesta)
62
+
63
+ def _format_general_question_response(self, resultado: dict) -> str:
64
+ """Formatea la respuesta para una pregunta general."""
65
+ analisis = resultado["analisis"]
66
+ respuesta = []
67
+
68
+ respuesta.append("📝 Análisis de la pregunta:")
69
+ if analisis["is_question"]:
70
+ respuesta.append(f"• Tipo de pregunta: {analisis['question_type'] or 'No identificado'}")
71
+
72
+ if analisis["entities"]:
73
+ respuesta.append("\n🏷️ Entidades identificadas:")
74
+ for ent, label in analisis["entities"]:
75
+ respuesta.append(f"• {ent} ({label})")
76
+
77
+ if analisis["key_phrases"]:
78
+ respuesta.append("\n🔑 Frases clave identificadas:")
79
+ for phrase in analisis["key_phrases"]:
80
+ respuesta.append(f"• {phrase}")
81
+
82
+ if resultado["sugerencias"]:
83
+ respuesta.append("\n💡 Sugerencias:")
84
+ for sug in resultado["sugerencias"]:
85
+ respuesta.append(f"• {sug}")
86
+
87
+ return "\n".join(respuesta)
88
 
89
  def run_and_submit_all( profile: gr.OAuthProfile | None):
90
  """
 
208
 
209
 
210
  # Inicializar el clasificador
211
+ classifier = TextAnalyzer()
212
 
213
+ def analyze_text(text: str) -> str:
214
+ """Analiza un texto y determina automáticamente si es una historia de usuario o una pregunta general."""
215
+ if not text.strip():
216
+ return "Por favor, ingrese un texto para analizar."
217
 
218
+ # Analizar el texto
219
+ result = classifier(text)
220
 
221
+ # Formatear resultados según el tipo
222
  output = []
223
+ output.append(f"📝 Texto analizado:\n{text}\n")
 
 
 
 
 
 
224
 
225
+ if result.get("tipo") == "historia_usuario":
226
+ output.append("📋 Tipo: Historia de Usuario")
227
+ output.append(f"🎯 Score de ambigüedad: {result['score_ambiguedad']}")
228
+
229
+ if result['ambiguedad_lexica']:
230
+ output.append("\n📚 Ambigüedades léxicas encontradas:")
231
+ for amb in result['ambiguedad_lexica']:
232
+ output.append(f"• {amb}")
233
+
234
+ if result['ambiguedad_sintactica']:
235
+ output.append("\n🔍 Ambigüedades sintácticas encontradas:")
236
+ for amb in result['ambiguedad_sintactica']:
237
+ output.append(f"• {amb}")
238
+
239
+ if result['sugerencias']:
240
+ output.append("\n💡 Sugerencias de mejora:")
241
+ for sug in result['sugerencias']:
242
+ output.append(f"• {sug}")
243
 
244
+ elif result.get("tipo") == "pregunta_general":
245
+ output.append("📋 Tipo: Pregunta General")
246
+ analisis = result['analisis']
247
+
248
+ if analisis['is_question']:
249
+ output.append(f"❓ Tipo de pregunta: {analisis['question_type'] or 'No identificado'}")
250
+
251
+ if analisis['entities']:
252
+ output.append("\n🏷️ Entidades identificadas:")
253
+ for ent, label in analisis['entities']:
254
+ output.append(f"• {ent} ({label})")
255
+
256
+ if analisis['key_phrases']:
257
+ output.append("\n🔑 Frases clave:")
258
+ for phrase in analisis['key_phrases']:
259
+ output.append(f"• {phrase}")
260
+
261
+ output.append("\n💡 Sugerencias:")
262
  for sug in result['sugerencias']:
263
  output.append(f"• {sug}")
264
 
265
+ else:
266
+ output.append("❌ Error: No se pudo determinar el tipo de texto")
267
+
268
  return "\n".join(output)
269
 
270
+ def analyze_multiple_texts(texts: str) -> str:
271
+ """Analiza múltiples textos separados por líneas."""
272
+ if not texts.strip():
273
+ return "Por favor, ingrese al menos un texto para analizar."
274
 
275
+ texts_list = [t.strip() for t in texts.split('\n') if t.strip()]
276
  all_results = []
277
 
278
+ for text in texts_list:
279
+ result = classifier(text)
280
+ result["texto_original"] = text
281
+ all_results.append(result)
 
 
 
 
 
 
282
 
283
  return json.dumps(all_results, indent=2, ensure_ascii=False)
284
 
285
  # --- Build Gradio Interface using Blocks ---
286
+ with gr.Blocks(title="Analizador de Textos") as demo:
287
  gr.Markdown("""
288
+ # 🔍 Analizador de Textos
289
+
290
+ Esta herramienta analiza dos tipos de texto:
291
+ 1. **Historias de Usuario**: Detecta ambigüedades léxicas y sintácticas
292
+ 2. **Preguntas Generales**: Analiza estructura y contexto
293
 
294
  ## 📝 Instrucciones:
295
+ 1. Ingrese su texto en el campo correspondiente
296
+ 2. El sistema detectará automáticamente el tipo de texto
297
+ 3. Revise el análisis detallado y las sugerencias
 
298
  """)
299
 
300
  with gr.Tab("Análisis Individual"):
301
  input_text = gr.Textbox(
302
+ label="Texto a Analizar",
303
+ placeholder="Ingrese una historia de usuario o una pregunta general...",
304
  lines=3
305
  )
306
  analyze_btn = gr.Button("Analizar")
 
309
  lines=10
310
  )
311
  analyze_btn.click(
312
+ analyze_text,
313
  inputs=[input_text],
314
  outputs=[output]
315
  )
316
 
317
  with gr.Tab("Análisis Múltiple"):
318
+ input_texts = gr.Textbox(
319
+ label="Textos a Analizar (uno por línea)",
320
+ placeholder="Como usuario quiero...\n¿Cuál es el proceso para...?\n",
321
  lines=5
322
  )
323
+ analyze_multi_btn = gr.Button("Analizar Todos")
324
  output_json = gr.JSON(label="Resultados del Análisis")
325
  analyze_multi_btn.click(
326
+ analyze_multiple_texts,
327
+ inputs=[input_texts],
328
  outputs=[output_json]
329
  )
330
 
331
  gr.Markdown("""
332
+ ## 🚀 Ejemplos
333
+
334
+ ### Historias de Usuario:
335
  - Como usuario quiero un sistema rápido y eficiente para gestionar mis tareas
336
  - El sistema debe permitir exportar varios tipos de archivos
337
  - Como administrador necesito acceder fácilmente a los reportes
338
+
339
+ ### Preguntas Generales:
340
+ - ¿Cuál es el proceso para recuperar una contraseña olvidada?
341
+ - ¿Cómo puedo generar un reporte mensual de ventas?
342
+ - ¿Dónde encuentro la documentación del API?
343
  """)
344
 
345
  gr.LoginButton()