bentosmau commited on
Commit
b746037
·
1 Parent(s): 0417f5a

Improve answer accuracy by filtering common words

Browse files

Update tokenization logic to filter stopwords and adjust similarity thresholds, preventing irrelevant matches and ensuring more accurate responses.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: e3ff2484-bbd8-4aba-bea0-1940769b874a
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 09a5cc1f-d121-4d89-855a-0fa80b39cc51
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1739408b-93a5-479b-a658-30f2493b0467/e3ff2484-bbd8-4aba-bea0-1940769b874a/3MbPI1V
Replit-Helium-Checkpoint-Created: true

attached_assets/Pasted-hola-quiero-datos-sobre-supernova-gen-sis-Hola-Soy-EYES_1778872508645.txt ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hola, quiero datos sobre supernova genésis
2
+
3
+
4
+
5
+ ¡Hola! Soy EYES-1.13.1, tu asistente de IA. ¿En qué puedo ayudarte hoy?
6
+
7
+ ¿Algo más en lo que pueda ayudarte?
8
+
9
+
10
+ que es supernova génesis
11
+
12
+
13
+
14
+ Aquí tienes las licencias más importantes y sus explicaciones:
15
+
16
+ COPYRIGHT:
17
+ Es una licencia que la mayoría de páginas web, videos, series y películas utilizan para que nadie monetice, publique u otras cosas sin autorización del creador original. (YouTube, TikTok y otras apps a veces pueden banear por copyright)
18
+
19
+ Reglas de CC ⚠️:
20
+
21
+ BY (Atribución): Debes mencionar al autor original del contenido.
22
+ NC (No Monetizar): El usuario no puede usar el contenido para monetizarlo.
23
+ ND (Sin derivadas): El usuario no puede modificar el contenido.
24
+ SA (Compartir): Si modificas el contenido, tiene que tener la misma licencia.
25
+ Apache License 2.0:
26
+
27
+ ✅ Similar a MIT.
28
+ ✅ Incluye protección contra patentes, útil para empresas.
29
+ La regla: Si haces una versión modificada del proyecto, es obligatorio publicarla con licencia GPL. Se llama "copyleft" para asegurarse de que el software siempre siga siendo libre. GPL es ideal para software y código.
30
+
31
+ Ejemplo: Si una imagen tiene CC-BY, te deja usar el contenido y la única regla es mencionar al autor original.
32
+
33
+ MIT:
34
+ Una licencia muy popular porque no tiene ninguna restricción. Los usuarios pueden:
35
+
36
+ ✅ Usar.
37
+ ✅ Vender.
38
+ ✅ Modificar.
39
+ ✅ Integrar el código en proyectos privados.
40
+ CC (Creative Commons):
41
+ Una licencia donde puedes usar el contenido, adaptarlo y modificarlo.
42
+
43
+ GPL (GNU General Public License):
44
+ Licencia de software libre creada por Free Software Foundation. Usada en proyectos como Linux.
45
+
46
+ ✅ Puedes usar el software libremente.
47
+ ✅ Modificarlo.
48
+ ✅ Distribuirlo.
49
+ Ejemplo: Juan sube un contenido de arte. María lo sube, pero no la dejan monetizar y avisan a Juan que un usuario subió su contenido sin acuerdos legales.
50
+
51
+ 📋 Resumen:
52
+
53
+ GPL: Obliga a que la versión modificada del proyecto sea abierta.
54
+ MIT: Puedes hacer casi lo que quieras con el código.
55
+ Apache 2.0: Parecido a MIT, pero con protección extra de patentes.
chat-app/logica.py CHANGED
@@ -163,38 +163,55 @@ RESPUESTAS_PERSONALIZADAS = cargar_respuestas()
163
 
164
  # ── TOKENIZADOR ────────────────────────────────────────────────────────────────
165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  def tokenizar(texto):
167
  """
168
  Convierte texto a lista de tokens normalizados:
169
  1. Elimina tildes/acentos
170
  2. Convierte a minúsculas
171
  3. Elimina puntuación
172
- 4. Divide en palabras (tokens)
173
  """
174
- # 1. Normalizar unicode → eliminar acentos
175
  texto = unicodedata.normalize("NFD", texto)
176
  texto = "".join(c for c in texto if unicodedata.category(c) != "Mn")
177
- # 2. Minúsculas
178
  texto = texto.lower()
179
- # 3. Eliminar puntuación (conservar letras, números y espacios)
180
  texto = re.sub(r"[^\w\s]", " ", texto)
181
- # 4. Dividir en tokens
182
- return [t for t in texto.split() if t]
183
 
184
  def similitud_tokens(tokens_entrada, tokens_patron):
185
  """
186
- Calcula similitud Jaccard entre dos listas de tokens.
187
- También da bonus si el patrón es subconjunto del mensaje.
188
- Retorna un score entre 0.0 y 1.0
189
  """
190
  set_entrada = set(tokens_entrada)
191
  set_patron = set(tokens_patron)
192
- if not set_patron:
 
193
  return 0.0
194
 
195
  interseccion = set_entrada & set_patron
196
- union = set_entrada | set_patron
197
- jaccard = len(interseccion) / len(union)
 
 
 
 
 
198
 
199
  # Bonus: si todos los tokens del patrón están en la entrada
200
  if set_patron.issubset(set_entrada):
 
163
 
164
  # ── TOKENIZADOR ────────────────────────────────────────────────────────────────
165
 
166
+ # Palabras vacías en español — no aportan significado semántico propio.
167
+ # Filtrarlas evita falsos matches como "que es supernova" → licencias.
168
+ STOPWORDS = {
169
+ "que", "es", "el", "la", "los", "las", "un", "una", "unos", "unas",
170
+ "de", "del", "al", "a", "en", "por", "para", "con", "sin", "sobre",
171
+ "como", "se", "me", "te", "le", "nos", "les", "lo", "y", "o", "pero",
172
+ "si", "no", "ni", "mas", "muy", "bien", "mal", "ya", "hay", "ser",
173
+ "sus", "tu", "yo", "mi", "su", "fue", "son", "era", "han", "tiene",
174
+ "cuál", "cual", "cuales", "cuáles", "qué", "quien", "donde", "cuando",
175
+ "como", "cómo", "dónde", "quién", "qué", "cuánto", "cuanto",
176
+ "este", "esta", "estos", "estas", "ese", "esa", "esos", "esas",
177
+ "me", "puedes", "puedo", "puede", "quiero", "quieres", "dame",
178
+ "dime", "dime", "hay", "tiene", "tienen", "tengo",
179
+ }
180
+
181
  def tokenizar(texto):
182
  """
183
  Convierte texto a lista de tokens normalizados:
184
  1. Elimina tildes/acentos
185
  2. Convierte a minúsculas
186
  3. Elimina puntuación
187
+ 4. Divide en tokens y filtra stopwords
188
  """
 
189
  texto = unicodedata.normalize("NFD", texto)
190
  texto = "".join(c for c in texto if unicodedata.category(c) != "Mn")
 
191
  texto = texto.lower()
 
192
  texto = re.sub(r"[^\w\s]", " ", texto)
193
+ return [t for t in texto.split() if t and t not in STOPWORDS]
 
194
 
195
  def similitud_tokens(tokens_entrada, tokens_patron):
196
  """
197
+ Calcula similitud Jaccard sobre tokens significativos (sin stopwords).
198
+ Requisito mínimo: al menos 1 token significativo en común.
199
+ Retorna 0.0 si no hay intersección de tokens significativos.
200
  """
201
  set_entrada = set(tokens_entrada)
202
  set_patron = set(tokens_patron)
203
+
204
+ if not set_patron or not set_entrada:
205
  return 0.0
206
 
207
  interseccion = set_entrada & set_patron
208
+
209
+ # Sin ningún token significativo en común → score 0 (evita falsos matches)
210
+ if not interseccion:
211
+ return 0.0
212
+
213
+ union = set_entrada | set_patron
214
+ jaccard = len(interseccion) / len(union)
215
 
216
  # Bonus: si todos los tokens del patrón están en la entrada
217
  if set_patron.issubset(set_entrada):