bentosmau commited on
Commit ·
b746037
1
Parent(s): 0417f5a
Improve answer accuracy by filtering common words
Browse filesUpdate 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
|
| 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 |
-
|
| 182 |
-
return [t for t in texto.split() if t]
|
| 183 |
|
| 184 |
def similitud_tokens(tokens_entrada, tokens_patron):
|
| 185 |
"""
|
| 186 |
-
Calcula similitud Jaccard
|
| 187 |
-
|
| 188 |
-
Retorna
|
| 189 |
"""
|
| 190 |
set_entrada = set(tokens_entrada)
|
| 191 |
set_patron = set(tokens_patron)
|
| 192 |
-
|
|
|
|
| 193 |
return 0.0
|
| 194 |
|
| 195 |
interseccion = set_entrada & set_patron
|
| 196 |
-
|
| 197 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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):
|