km1lo commited on
Commit
9c7a51d
·
verified ·
1 Parent(s): 1bdae8f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -42
app.py CHANGED
@@ -1,12 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
- """app.ipynb
3
-
4
- Automatically generated by Colab.
5
-
6
- Original file is located at
7
- https://colab.research.google.com/drive/1WQ2YqAcXFp-14DglIYkV4rawVDSbyhCe
8
- """
9
-
10
  # -*- coding: utf-8 -*-
11
  from transformers import AutoTokenizer, AutoModelForCausalLM
12
  from sentence_transformers import SentenceTransformer, util
@@ -15,6 +6,7 @@ import joblib
15
  import torch
16
  import gradio as gr
17
  import os
 
18
 
19
  # === Cargar modelos entrenados ===
20
  modelo_riesgo = joblib.load("modelo_riesgo.pkl")
@@ -38,6 +30,25 @@ model = AutoModelForCausalLM.from_pretrained(
38
  device_map="auto"
39
  )
40
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  # === Frases prototipo para verificador semántico ===
42
  frases_fisica = [
43
  "Me golpeó con el puño cerrado",
@@ -47,7 +58,6 @@ frases_fisica = [
47
  "Me fracturó una costilla",
48
  "Me tiró al piso violentamente"
49
  ]
50
-
51
  frases_sexual = [
52
  "Me obligó a tener relaciones sexuales",
53
  "Me tocó sin consentimiento",
@@ -55,7 +65,6 @@ frases_sexual = [
55
  "Me forzó a tener sexo",
56
  "Me agredió sexualmente"
57
  ]
58
-
59
  frases_economica = [
60
  "No me da dinero",
61
  "Me quita mi salario",
@@ -63,7 +72,6 @@ frases_economica = [
63
  "No me deja trabajar",
64
  "Me obliga a depender económicamente"
65
  ]
66
-
67
  frases_psicologica = [
68
  "Me insulta todo el tiempo",
69
  "Me amenaza constantemente",
@@ -71,7 +79,6 @@ frases_psicologica = [
71
  "Me hace sentir inútil",
72
  "Me controla emocionalmente"
73
  ]
74
-
75
  frases_negligencia = [
76
  "No me brinda atención médica",
77
  "No cuida a los hijos",
@@ -91,7 +98,6 @@ embeds_negligencia = modelo_vector.encode(frases_negligencia)
91
  def verificar_semantico(descripcion):
92
  emb_desc = modelo_vector.encode(descripcion)
93
  tipos_detectados = []
94
-
95
  if max(util.cos_sim(emb_desc, embeds_fisica)[0]) > 0.8:
96
  tipos_detectados.append("física")
97
  if max(util.cos_sim(emb_desc, embeds_sexual)[0]) > 0.9:
@@ -102,7 +108,6 @@ def verificar_semantico(descripcion):
102
  tipos_detectados.append("psicológica")
103
  if max(util.cos_sim(emb_desc, embeds_negligencia)[0]) > 0.85:
104
  tipos_detectados.append("negligencia")
105
-
106
  return tipos_detectados
107
 
108
  # === FUNCIÓN PRINCIPAL ===
@@ -140,19 +145,19 @@ def predecir_con_recomendacion(edad, genero, hijos, convivencia_agresor, consumo
140
  tipos_str = ", ".join(tipos_combinados)
141
 
142
  messages = [
143
- {
144
- "role": "system",
145
- "content": "Eres un jurista colombiano experto en violencia intrafamiliar."
146
- },
147
- {
148
- "role": "user",
149
- "content": f"""
150
  Analiza este caso y redacta un Auto de Medida Provisional conforme a la Ley 575 de 2000 y la Ley 1257 de 2008.
151
 
152
  Hechos del caso:
153
  Tipo de violencia: {tipos_str}
154
  Nivel de riesgo: {riesgo}
155
- Medida cautelar sugerida: {tipo_medida}
156
  Descripción detallada: {descripcion}
157
 
158
  Redacta el Auto con esta estructura formal:
@@ -164,10 +169,10 @@ CONSIDERACIONES:
164
 
165
  RESUELVE:
166
  PRIMERO: Admitir la solicitud.
167
- II, III, IV, V, etc.: Ordenar cada medida en un párrafo separado, numerando en números romanos.
168
  ÚLTIMO: Cúmplase y notifíquese.
169
 
170
- Utiliza únicamente las siguientes expresiones para nombrar las medidas si corresponden al caso:
171
  - Prohibición de acercamiento.
172
  - Prohibición de contacto.
173
  - Protección de la residencia.
@@ -175,15 +180,13 @@ Utiliza únicamente las siguientes expresiones para nombrar las medidas si corre
175
  - Prohibición de consumo de alcohol.
176
  No uses términos como 'nominar' o 'nombrar medidas'.
177
 
178
- Ejemplo de redacción de medidas (no lo copies literalmente, solo úsalo como guía de estilo):
179
- II: Ordenar la prohibición al agresor de acercarse a la víctima en un radio de 200 metros.
180
- III: Ordenar la prohibición de todo contacto con la víctima por cualquier medio.
181
- IV: Ordenar la protección de la residencia mediante acompañamiento policial.
182
- V: Ordenar la prohibición de consumo de bebidas alcohólicas.
183
 
184
- Ejemplo de justificación (solo como guía):
185
- a) Prohibición de acercamiento: conforme al literal b) del Artículo 5 de la Ley 575 de 2000.
186
- b) Prohibición de contacto: conforme al literal c) del Artículo 5.
 
 
187
 
188
  No incluyas estos ejemplos en la respuesta final.
189
  No menciones violencia económica ni sexual salvo que se describa expresamente en los hechos.
@@ -191,8 +194,8 @@ Redacta cada justificación en una sola frase única, sin repetir fundamentos.
191
  Limita todo el texto a un máximo de 300 palabras.
192
  Usa un estilo claro, formal y coherente.
193
  """
194
- }
195
- ]
196
 
197
  # Aplicar chat template
198
  encoded = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)
@@ -216,7 +219,7 @@ Usa un estilo claro, formal y coherente.
216
  else:
217
  auto_redactado = auto_completo
218
 
219
- # Post-procesar: eliminar líneas duplicadas
220
  lineas = auto_redactado.splitlines()
221
  lineas_sin_duplicados = []
222
  vistos = set()
@@ -227,7 +230,7 @@ Usa un estilo claro, formal y coherente.
227
  auto_redactado = "\n".join(lineas_sin_duplicados)
228
 
229
  # Renumerar medidas en números romanos
230
- romanos = ["II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]
231
  lineas = auto_redactado.splitlines()
232
  contador = 0
233
  for i, linea in enumerate(lineas):
@@ -238,13 +241,17 @@ Usa un estilo claro, formal y coherente.
238
  contador += 1
239
  auto_redactado = "\n".join(lineas)
240
 
241
-
242
  return tipos_str, riesgo, tipo_medida, auto_redactado
243
 
244
  # === Interfaz Gradio ===
245
- with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
246
- gr.Markdown("<h1 style='text-align:center; color:#004aad;'>LEGALFAMI – Asistente Legal con Razonamiento Jurídico</h1>")
247
- gr.Markdown("Predice tipo de violencia, riesgo, medida cautelar y genera un Auto conforme a la Ley 575 Art.5.")
 
 
 
 
 
248
 
249
  with gr.Row():
250
  with gr.Column():
@@ -260,7 +267,7 @@ with gr.Blocks(theme=gr.themes.Soft()) as interfaz:
260
  with gr.Column():
261
  tipo_violencia_out = gr.Textbox(label="🛑 Tipo de Violencia Detectada", interactive=False)
262
  riesgo_out = gr.Textbox(label="⚠️ Nivel de Riesgo Estimado", interactive=False)
263
- medida_out = gr.Textbox(label="🧾 Tipo de Medida Cautelar Sugerida", interactive=False)
264
  recomendacion_out = gr.Textbox(label="📋 Auto de Medida Provisional", lines=12, interactive=False)
265
 
266
  boton.click(
 
 
 
 
 
 
 
 
 
 
1
  # -*- coding: utf-8 -*-
2
  from transformers import AutoTokenizer, AutoModelForCausalLM
3
  from sentence_transformers import SentenceTransformer, util
 
6
  import torch
7
  import gradio as gr
8
  import os
9
+ import re
10
 
11
  # === Cargar modelos entrenados ===
12
  modelo_riesgo = joblib.load("modelo_riesgo.pkl")
 
30
  device_map="auto"
31
  )
32
 
33
+ # === CSS personalizado Externado ===
34
+ css_externado = """
35
+ @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
36
+ body {
37
+ background-color: #A3A845;
38
+ font-family: 'Roboto', sans-serif;
39
+ }
40
+ .gr-button {
41
+ background-color: #004225 !important;
42
+ color: white !important;
43
+ }
44
+ .gr-button:hover {
45
+ background-color: #006633 !important;
46
+ }
47
+ .gr-input, .gr-output {
48
+ background-color: white !important;
49
+ }
50
+ """
51
+
52
  # === Frases prototipo para verificador semántico ===
53
  frases_fisica = [
54
  "Me golpeó con el puño cerrado",
 
58
  "Me fracturó una costilla",
59
  "Me tiró al piso violentamente"
60
  ]
 
61
  frases_sexual = [
62
  "Me obligó a tener relaciones sexuales",
63
  "Me tocó sin consentimiento",
 
65
  "Me forzó a tener sexo",
66
  "Me agredió sexualmente"
67
  ]
 
68
  frases_economica = [
69
  "No me da dinero",
70
  "Me quita mi salario",
 
72
  "No me deja trabajar",
73
  "Me obliga a depender económicamente"
74
  ]
 
75
  frases_psicologica = [
76
  "Me insulta todo el tiempo",
77
  "Me amenaza constantemente",
 
79
  "Me hace sentir inútil",
80
  "Me controla emocionalmente"
81
  ]
 
82
  frases_negligencia = [
83
  "No me brinda atención médica",
84
  "No cuida a los hijos",
 
98
  def verificar_semantico(descripcion):
99
  emb_desc = modelo_vector.encode(descripcion)
100
  tipos_detectados = []
 
101
  if max(util.cos_sim(emb_desc, embeds_fisica)[0]) > 0.8:
102
  tipos_detectados.append("física")
103
  if max(util.cos_sim(emb_desc, embeds_sexual)[0]) > 0.9:
 
108
  tipos_detectados.append("psicológica")
109
  if max(util.cos_sim(emb_desc, embeds_negligencia)[0]) > 0.85:
110
  tipos_detectados.append("negligencia")
 
111
  return tipos_detectados
112
 
113
  # === FUNCIÓN PRINCIPAL ===
 
145
  tipos_str = ", ".join(tipos_combinados)
146
 
147
  messages = [
148
+ {
149
+ "role": "system",
150
+ "content": "Eres un jurista colombiano experto en violencia intrafamiliar."
151
+ },
152
+ {
153
+ "role": "user",
154
+ "content": f"""
155
  Analiza este caso y redacta un Auto de Medida Provisional conforme a la Ley 575 de 2000 y la Ley 1257 de 2008.
156
 
157
  Hechos del caso:
158
  Tipo de violencia: {tipos_str}
159
  Nivel de riesgo: {riesgo}
160
+ Medida de protección sugerida: {tipo_medida}
161
  Descripción detallada: {descripcion}
162
 
163
  Redacta el Auto con esta estructura formal:
 
169
 
170
  RESUELVE:
171
  PRIMERO: Admitir la solicitud.
172
+ II, III, IV, V, etc.: Ordenar cada medida de protección en un párrafo separado, numerando en números romanos.
173
  ÚLTIMO: Cúmplase y notifíquese.
174
 
175
+ Utiliza únicamente estas expresiones para nombrar las medidas si corresponden:
176
  - Prohibición de acercamiento.
177
  - Prohibición de contacto.
178
  - Protección de la residencia.
 
180
  - Prohibición de consumo de alcohol.
181
  No uses términos como 'nominar' o 'nombrar medidas'.
182
 
183
+ A continuación, algunos literales del Artículo 5 de la Ley 575 de 2000 (solo para tu referencia, no los copies literalmente):
 
 
 
 
184
 
185
+ Literal a): Ordenar al agresor el desalojo inmediato de la casa de habitación que comparte con la víctima.
186
+ Literal b): Ordenar al agresor abstenerse de penetrar en cualquier lugar donde se encuentre la víctima.
187
+ Literal c): Ordenar al agresor abstenerse de comunicarse con la víctima por cualquier medio.
188
+ Literal d): Ordenar la protección de la víctima por la autoridad de policía.
189
+ Literal h): Ordenar al agresor abstenerse de consumir bebidas alcohólicas o sustancias psicoactivas.
190
 
191
  No incluyas estos ejemplos en la respuesta final.
192
  No menciones violencia económica ni sexual salvo que se describa expresamente en los hechos.
 
194
  Limita todo el texto a un máximo de 300 palabras.
195
  Usa un estilo claro, formal y coherente.
196
  """
197
+ }
198
+ ]
199
 
200
  # Aplicar chat template
201
  encoded = tokenizer.apply_chat_template(messages, return_tensors="pt").to(model.device)
 
219
  else:
220
  auto_redactado = auto_completo
221
 
222
+ # Eliminar líneas duplicadas
223
  lineas = auto_redactado.splitlines()
224
  lineas_sin_duplicados = []
225
  vistos = set()
 
230
  auto_redactado = "\n".join(lineas_sin_duplicados)
231
 
232
  # Renumerar medidas en números romanos
233
+ romanos = ["I","II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]
234
  lineas = auto_redactado.splitlines()
235
  contador = 0
236
  for i, linea in enumerate(lineas):
 
241
  contador += 1
242
  auto_redactado = "\n".join(lineas)
243
 
 
244
  return tipos_str, riesgo, tipo_medida, auto_redactado
245
 
246
  # === Interfaz Gradio ===
247
+ with gr.Blocks(css=css_externado) as interfaz:
248
+ gr.Markdown("""
249
+ <div style='display: flex; align-items: center; gap: 12px;'>
250
+ <img src='https://tuservidor.com/logoexternado.jpg' style='height: 60px;'/>
251
+ <h1 style='color:#004225; font-family: Roboto, sans-serif;'>LEGALFAMI – Asistente Legal con Razonamiento Jurídico</h1>
252
+ </div>
253
+ """)
254
+ gr.Markdown("<p style='text-align:center;'>Predice tipo de violencia, nivel de riesgo, medida de protección y redacta un Auto conforme a la Ley 575 Art.5.</p>")
255
 
256
  with gr.Row():
257
  with gr.Column():
 
267
  with gr.Column():
268
  tipo_violencia_out = gr.Textbox(label="🛑 Tipo de Violencia Detectada", interactive=False)
269
  riesgo_out = gr.Textbox(label="⚠️ Nivel de Riesgo Estimado", interactive=False)
270
+ medida_out = gr.Textbox(label="🧾 Tipo de Medida de Protección Sugerida", interactive=False)
271
  recomendacion_out = gr.Textbox(label="📋 Auto de Medida Provisional", lines=12, interactive=False)
272
 
273
  boton.click(