Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	
		Horacio Perez
		
	commited on
		
		
					Upload 11 files
Browse files- README.md +26 -1
- app.py +49 -1
- editor_literario.py +19 -1
- editor_literario_autores.py +20 -1
- editor_literario_avanzado.py +35 -1
- editor_literario_embeddings.py +33 -1
- editor_literario_estilo.py +25 -1
- editor_literario_maestro.py +31 -1
- editor_literario_puntuacion.py +27 -1
- editor_literario_tono.py +24 -1
- requirements.txt +9 -1
    	
        README.md
    CHANGED
    
    | @@ -1 +1,26 @@ | |
| 1 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # ✍️ Editor Literario AI
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            **Editor Literario AI** es una herramienta avanzada de análisis de texto para escritores, editores y creativos. Utiliza modelos de lenguaje y análisis semántico para ofrecer una revisión completa de estilo, tono, comparación con autores y sugerencias editoriales.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## 🚀 Características principales
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - 🧠 **Análisis técnico**: longitud media de oración, complejidad, puntuación y ritmo narrativo.
         | 
| 8 | 
            +
            - 🎭 **Detección de tono**: identifica emociones, atmósfera narrativa y coherencia emocional.
         | 
| 9 | 
            +
            - 🧬 **Comparación con autores**: estima semejanzas estilísticas con autores literarios conocidos.
         | 
| 10 | 
            +
            - 🗂️ **Interfaz gráfica moderna**: con pestañas, scroll y modo responsive.
         | 
| 11 | 
            +
            - 🪵 **Logs en vivo**: para seguimiento técnico de los procesos internos.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ---
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ## 📸 Capturas
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            ### Pantalla principal
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ### Comparación con autores
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            > *(Puedes reemplazar las URLs por capturas reales si las tienes disponibles.)*
         | 
| 26 | 
            +
             | 
    	
        app.py
    CHANGED
    
    | @@ -1 +1,49 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
             | 
| 2 | 
            +
            import gradio as gr
         | 
| 3 | 
            +
            from editor_literario_maestro import analisis_completo
         | 
| 4 | 
            +
            from editor_literario import analisis_tecnico
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            logs = []
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            def log(msg):
         | 
| 9 | 
            +
                logs.append(msg)
         | 
| 10 | 
            +
                print(msg)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            def ejecutar_analisis(texto):
         | 
| 13 | 
            +
                log("Ejecutando análisis completo...")
         | 
| 14 | 
            +
                resultado = analisis_completo(texto)
         | 
| 15 | 
            +
                log(f"Resultado: {resultado}")
         | 
| 16 | 
            +
                return resultado
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            def ejecutar_tecnico(texto):
         | 
| 19 | 
            +
                log("Ejecutando análisis técnico...")
         | 
| 20 | 
            +
                resultado = analisis_tecnico(texto)
         | 
| 21 | 
            +
                log(f"Resultado: {resultado}")
         | 
| 22 | 
            +
                return resultado
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            def ver_logs():
         | 
| 25 | 
            +
                return "\n".join(logs[-30:])  # últimos 30 registros
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            with gr.Blocks(title="Editor Literario AI") as interfaz:
         | 
| 28 | 
            +
                with gr.Row():
         | 
| 29 | 
            +
                    gr.Markdown("## 🧠 Editor Literario AI · Análisis de estilo, tono y comparación")
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                with gr.Tabs():
         | 
| 32 | 
            +
                    with gr.Tab("Análisis completo"):
         | 
| 33 | 
            +
                        texto_input = gr.Textbox(label="Texto a analizar", lines=15, placeholder="Pega aquí tu texto...", show_copy_button=True)
         | 
| 34 | 
            +
                        boton_analisis = gr.Button("Ejecutar análisis completo")
         | 
| 35 | 
            +
                        salida_analisis = gr.Textbox(label="Resultado del análisis completo")
         | 
| 36 | 
            +
                        boton_analisis.click(fn=ejecutar_analisis, inputs=texto_input, outputs=salida_analisis)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    with gr.Tab("Análisis técnico"):
         | 
| 39 | 
            +
                        texto_tecnico = gr.Textbox(label="Texto técnico", lines=10, placeholder="Texto para análisis técnico")
         | 
| 40 | 
            +
                        boton_tecnico = gr.Button("Ejecutar análisis técnico")
         | 
| 41 | 
            +
                        salida_tecnico = gr.Textbox(label="Resultado del análisis técnico")
         | 
| 42 | 
            +
                        boton_tecnico.click(fn=ejecutar_tecnico, inputs=texto_tecnico, outputs=salida_tecnico)
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    with gr.Tab("Logs en vivo"):
         | 
| 45 | 
            +
                        boton_logs = gr.Button("Actualizar Logs")
         | 
| 46 | 
            +
                        caja_logs = gr.Textbox(label="Últimos logs", lines=15, interactive=False)
         | 
| 47 | 
            +
                        boton_logs.click(fn=ver_logs, outputs=caja_logs)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            interfaz.launch()
         | 
    	
        editor_literario.py
    CHANGED
    
    | @@ -1 +1,19 @@ | |
| 1 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # editor_literario.py
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def analisis_tecnico(texto):
         | 
| 4 | 
            +
                """
         | 
| 5 | 
            +
                Análisis técnico básico del texto. Devuelve resultados en Markdown.
         | 
| 6 | 
            +
                """
         | 
| 7 | 
            +
                num_palabras = len(texto.split())
         | 
| 8 | 
            +
                num_caracteres = len(texto)
         | 
| 9 | 
            +
                num_lineas = texto.count("\n") + 1
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                return f"""
         | 
| 12 | 
            +
            ## 🛠️ Análisis Técnico
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            - Palabras: **{num_palabras}**
         | 
| 15 | 
            +
            - Caracteres: **{num_caracteres}**
         | 
| 16 | 
            +
            - Líneas: **{num_lineas}**
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            > Un análisis técnico inicial para comprender la extensión del texto.
         | 
| 19 | 
            +
            """
         | 
    	
        editor_literario_autores.py
    CHANGED
    
    | @@ -1 +1,20 @@ | |
| 1 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # editor_literario_autores.py
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def comparar_estilo_autores(texto):
         | 
| 4 | 
            +
                """
         | 
| 5 | 
            +
                Simula una comparación de estilo con autores literarios conocidos.
         | 
| 6 | 
            +
                """
         | 
| 7 | 
            +
                resultado = """
         | 
| 8 | 
            +
            ## 📚 Comparación con autores literarios
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Se han detectado similitudes estilísticas generales con los siguientes autores:
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            - **Julio Cortázar**: uso experimental de la estructura y exploración psicológica.
         | 
| 13 | 
            +
            - **Gabriel García Márquez**: tendencia a lo mágico con naturalidad narrativa.
         | 
| 14 | 
            +
            - **Clarice Lispector**: introspección filosófica y sensibilidad emocional.
         | 
| 15 | 
            +
            - **Juan Carlos Onetti**: tono sombrío, existencial y distante.
         | 
| 16 | 
            +
            - **Roberto Bolaño**: narración fragmentaria con tensión y ironía implícita.
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            > _Este resultado es simulado. Para análisis real, integrar embeddings y distancias de similitud semántica._
         | 
| 19 | 
            +
            """
         | 
| 20 | 
            +
                return resultado
         | 
    	
        editor_literario_avanzado.py
    CHANGED
    
    | @@ -1 +1,35 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import nltk
         | 
| 2 | 
            +
            nltk.download('punkt')
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            from sentence_transformers import SentenceTransformer, util
         | 
| 5 | 
            +
            from textblob import TextBlob
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            modelo = SentenceTransformer('all-MiniLM-L6-v2')
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            autores_referencia = {
         | 
| 10 | 
            +
                "Gabriel García Márquez": "La soledad es la forma de nuestra memoria, y el olvido es la forma de nuestra paz.",
         | 
| 11 | 
            +
                "Mario Vargas Llosa": "La literatura es fuego, es pasión, es crítica y vida.",
         | 
| 12 | 
            +
                "Julio Cortázar": "Andábamos sin buscarnos, pero sabiendo que andábamos para encontrarnos."
         | 
| 13 | 
            +
            }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            def analizar_tono_y_autores(texto_usuario):
         | 
| 16 | 
            +
                resultado = []
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                # Análisis de tono
         | 
| 19 | 
            +
                blob = TextBlob(texto_usuario)
         | 
| 20 | 
            +
                polaridad = blob.sentiment.polarity
         | 
| 21 | 
            +
                tono = "Positivo" if polaridad > 0.1 else "Negativo" if polaridad < -0.1 else "Neutral"
         | 
| 22 | 
            +
                resultado.append(f"**Tono general del texto:** {tono} (polaridad: {polaridad:.2f})\n")
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # Comparación semántica
         | 
| 25 | 
            +
                emb_texto = modelo.encode(texto_usuario, convert_to_tensor=True)
         | 
| 26 | 
            +
                similitudes = {}
         | 
| 27 | 
            +
                for autor, ejemplo in autores_referencia.items():
         | 
| 28 | 
            +
                    emb_autor = modelo.encode(ejemplo, convert_to_tensor=True)
         | 
| 29 | 
            +
                    similitud = util.cos_sim(emb_texto, emb_autor).item()
         | 
| 30 | 
            +
                    similitudes[autor] = similitud
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                autor_mas_similar = max(similitudes, key=similitudes.get)
         | 
| 33 | 
            +
                resultado.append(f"**Estilo más similar al de:** {autor_mas_similar} (similaridad: {similitudes[autor_mas_similar]:.2f})")
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                return "\n".join(resultado)
         | 
    	
        editor_literario_embeddings.py
    CHANGED
    
    | @@ -1 +1,33 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from sentence_transformers import SentenceTransformer
         | 
| 2 | 
            +
            from sklearn.metrics.pairwise import cosine_similarity
         | 
| 3 | 
            +
            import numpy as np
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # Cargar el modelo una sola vez
         | 
| 6 | 
            +
            modelo_embeddings = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # Embeddings simulados de autores literarios famosos (representación simplificada)
         | 
| 9 | 
            +
            autores_perfiles = {
         | 
| 10 | 
            +
                "Julio Cortázar": modelo_embeddings.encode("La estructura fragmentaria y los juegos de lenguaje son frecuentes."),
         | 
| 11 | 
            +
                "Clarice Lispector": modelo_embeddings.encode("Explora la introspección, la emoción cruda y el lenguaje poético."),
         | 
| 12 | 
            +
                "Roberto Bolaño": modelo_embeddings.encode("Narración fragmentaria, tensión persistente, humor implícito."),
         | 
| 13 | 
            +
                "Gabriel García Márquez": modelo_embeddings.encode("Uso natural de lo mágico y una narrativa fluida y envolvente."),
         | 
| 14 | 
            +
                "Juan Carlos Onetti": modelo_embeddings.encode("Tono sombrío, estilo existencial y descripciones minimalistas."),
         | 
| 15 | 
            +
            }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            def comparar_estilo_embeddings(texto_usuario):
         | 
| 18 | 
            +
                if not texto_usuario.strip():
         | 
| 19 | 
            +
                    return "⚠️ El texto está vacío. Por favor, introduce contenido válido."
         | 
| 20 | 
            +
                try:
         | 
| 21 | 
            +
                    emb_usuario = modelo_embeddings.encode(texto_usuario)
         | 
| 22 | 
            +
                    resultados = []
         | 
| 23 | 
            +
                    for autor, emb_autor in autores_perfiles.items():
         | 
| 24 | 
            +
                        similitud = cosine_similarity([emb_usuario], [emb_autor])[0][0]
         | 
| 25 | 
            +
                        resultados.append((autor, similitud))
         | 
| 26 | 
            +
                    resultados.sort(key=lambda x: x[1], reverse=True)
         | 
| 27 | 
            +
                    md = "## 🧬 Comparación con Estilos de Autores (Embeddings Reales)\n\n"
         | 
| 28 | 
            +
                    for autor, score in resultados:
         | 
| 29 | 
            +
                        md += f"- **{autor}** → similitud: `{score:.4f}`\n"
         | 
| 30 | 
            +
                    md += "\n> _Este análisis se basa en similitud semántica usando embeddings._\n"
         | 
| 31 | 
            +
                    return md
         | 
| 32 | 
            +
                except Exception as e:
         | 
| 33 | 
            +
                    return f"❌ Error durante la comparación de estilo: {str(e)}"
         | 
    	
        editor_literario_estilo.py
    CHANGED
    
    | @@ -1 +1,25 @@ | |
| 1 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # editor_literario_estilo.py
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            def evaluar_estilo(texto):
         | 
| 4 | 
            +
                """
         | 
| 5 | 
            +
                Función básica para evaluación de estilo literario.
         | 
| 6 | 
            +
                Esta es una versión de prueba que devuelve un análisis simulado.
         | 
| 7 | 
            +
                """
         | 
| 8 | 
            +
                resumen_estilo = """
         | 
| 9 | 
            +
            ## 🖋️ Análisis de Estilo Literario
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            **Longitud del texto:** {} caracteres.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            **Estilo percibido:** Narrativo introspectivo con tendencia descriptiva.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            **Nivel de detalle:** Moderado. Uso adecuado de recursos expresivos.
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            **Oraciones complejas:** Frecuente uso de subordinadas y estructuras largas, lo que puede sugerir un estilo literario elaborado.
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            **Comparación general:** El estilo evoca cierta cercanía a autores como Julio Cortázar y Clarice Lispector por su exploración subjetiva del pensamiento y el uso de un lenguaje cuidadosamente elegido.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            > _Nota: Este análisis es genérico. Para un análisis profundo, integrar modelos de similitud de estilo literario basados en embeddings._
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            """.format(len(texto))
         | 
| 24 | 
            +
                
         | 
| 25 | 
            +
                return resumen_estilo
         | 
    	
        editor_literario_maestro.py
    CHANGED
    
    | @@ -1 +1,31 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from editor_literario_tono import analizar_tono
         | 
| 2 | 
            +
            from editor_literario_estilo import evaluar_estilo
         | 
| 3 | 
            +
            from editor_literario_autores import comparar_estilo_autores
         | 
| 4 | 
            +
            from editor_literario_puntuacion import evaluar_puntuacion
         | 
| 5 | 
            +
            import traceback
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            def analisis_completo(texto: str) -> str:
         | 
| 8 | 
            +
                """
         | 
| 9 | 
            +
                Realiza un análisis literario completo del texto ingresado,
         | 
| 10 | 
            +
                combinando tono, puntuación, estilo y comparación con autores.
         | 
| 11 | 
            +
                Devuelve el resultado en formato Markdown.
         | 
| 12 | 
            +
                """
         | 
| 13 | 
            +
                try:
         | 
| 14 | 
            +
                    tono = analizar_tono(texto)
         | 
| 15 | 
            +
                    puntuacion = evaluar_puntuacion(texto)
         | 
| 16 | 
            +
                    estilo = evaluar_estilo(texto)
         | 
| 17 | 
            +
                    autores = comparar_estilo_autores(texto)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    markdown_resultado = (
         | 
| 20 | 
            +
                        f"## 🎨 Tono Literario\n"
         | 
| 21 | 
            +
                        f"- **Tono:** {tono['tono']}\n"
         | 
| 22 | 
            +
                        f"- **Polaridad:** {tono['polaridad']:.2f}\n"
         | 
| 23 | 
            +
                        f"- **Subjetividad:** {tono['subjetividad']:.2f}\n\n"
         | 
| 24 | 
            +
                        f"{puntuacion}\n"
         | 
| 25 | 
            +
                        f"{estilo}\n"
         | 
| 26 | 
            +
                        f"{autores}"
         | 
| 27 | 
            +
                    )
         | 
| 28 | 
            +
                except Exception as e:
         | 
| 29 | 
            +
                    markdown_resultado = f"❌ Error al generar el análisis completo:\n```\n{traceback.format_exc()}\n```"
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                return markdown_resultado
         | 
    	
        editor_literario_puntuacion.py
    CHANGED
    
    | @@ -1 +1,27 @@ | |
| 1 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # editor_literario_puntuacion.py
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            import re
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            def evaluar_puntuacion(texto):
         | 
| 6 | 
            +
                """
         | 
| 7 | 
            +
                Analiza el uso de puntuación en el texto de forma básica.
         | 
| 8 | 
            +
                Retorna un resumen en formato Markdown.
         | 
| 9 | 
            +
                """
         | 
| 10 | 
            +
                total_puntos = texto.count(".")
         | 
| 11 | 
            +
                total_comas = texto.count(",")
         | 
| 12 | 
            +
                total_signos_interrogacion = texto.count("?") + texto.count("¿")
         | 
| 13 | 
            +
                total_signos_exclamacion = texto.count("!") + texto.count("¡")
         | 
| 14 | 
            +
                oraciones = re.split(r'[.!?]+', texto)
         | 
| 15 | 
            +
                oraciones_largas = [o for o in oraciones if len(o.split()) > 20]
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                return f"""
         | 
| 18 | 
            +
            ## ✒️ Análisis de Puntuación
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            - Total de puntos: **{total_puntos}**
         | 
| 21 | 
            +
            - Total de comas: **{total_comas}**
         | 
| 22 | 
            +
            - Signos de interrogación: **{total_signos_interrogacion}**
         | 
| 23 | 
            +
            - Signos de exclamación: **{total_signos_exclamacion}**
         | 
| 24 | 
            +
            - Oraciones largas (más de 20 palabras): **{len(oraciones_largas)}**
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            > Se recomienda revisar las oraciones largas para mejorar la legibilidad.
         | 
| 27 | 
            +
            """
         | 
    	
        editor_literario_tono.py
    CHANGED
    
    | @@ -1 +1,24 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
             | 
| 2 | 
            +
            from textblob import TextBlob
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            def analizar_tono(texto):
         | 
| 5 | 
            +
                if not texto.strip():
         | 
| 6 | 
            +
                    return "El texto está vacío."
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                blob = TextBlob(texto)
         | 
| 9 | 
            +
                polaridad = blob.sentiment.polarity
         | 
| 10 | 
            +
                subjetividad = blob.sentiment.subjectivity
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                tono = "Neutral"
         | 
| 13 | 
            +
                if polaridad > 0.2:
         | 
| 14 | 
            +
                    tono = "Positivo"
         | 
| 15 | 
            +
                elif polaridad < -0.2:
         | 
| 16 | 
            +
                    tono = "Negativo"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                resultado = {
         | 
| 19 | 
            +
                    "tono": tono,
         | 
| 20 | 
            +
                    "polaridad": polaridad,
         | 
| 21 | 
            +
                    "subjetividad": subjetividad,
         | 
| 22 | 
            +
                }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                return resultado
         | 
    	
        requirements.txt
    CHANGED
    
    | @@ -1 +1,9 @@ | |
| 1 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            gradio==5.35.0
         | 
| 2 | 
            +
            sentence-transformers
         | 
| 3 | 
            +
            torch
         | 
| 4 | 
            +
            openai
         | 
| 5 | 
            +
            nltk
         | 
| 6 | 
            +
            scikit-learn
         | 
| 7 | 
            +
            textblob
         | 
| 8 | 
            +
            matplotlib
         | 
| 9 | 
            +
            sentence-transformers>=2.2.2
         | 
