# modules/text_analysis/discourse_analysis.py import streamlit as st import spacy import networkx as nx import matplotlib.pyplot as plt import pandas as pd import numpy as np import logging logger = logging.getLogger(__name__) from .semantic_analysis import ( create_concept_graph, visualize_concept_graph, identify_key_concepts, get_stopwords, POS_COLORS, POS_TRANSLATIONS, ENTITY_LABELS ) def compare_semantic_analysis(text1, text2, nlp, lang): """ Realiza el análisis semántico comparativo entre dos textos Args: text1: Primer texto a analizar text2: Segundo texto a analizar nlp: Modelo de spaCy cargado lang: Código de idioma Returns: tuple: (fig1, fig2, key_concepts1, key_concepts2) """ try: # Procesar los textos doc1 = nlp(text1) doc2 = nlp(text2) # Identificar conceptos clave con parámetros específicos key_concepts1 = identify_key_concepts(doc1, min_freq=2, min_length=3) key_concepts2 = identify_key_concepts(doc2, min_freq=2, min_length=3) # Crear y visualizar grafos G1 = create_concept_graph(doc1, key_concepts1) G2 = create_concept_graph(doc2, key_concepts2) fig1 = visualize_concept_graph(G1, lang) fig2 = visualize_concept_graph(G2, lang) # Limpiar títulos fig1.suptitle("") fig2.suptitle("") return fig1, fig2, key_concepts1, key_concepts2 except Exception as e: logger.error(f"Error en compare_semantic_analysis: {str(e)}") raise def create_concept_table(key_concepts): """ Crea una tabla de conceptos clave con sus frecuencias Args: key_concepts: Lista de tuplas (concepto, frecuencia) Returns: pandas.DataFrame: Tabla formateada de conceptos """ try: df = pd.DataFrame(key_concepts, columns=['Concepto', 'Frecuencia']) df['Frecuencia'] = df['Frecuencia'].round(2) return df except Exception as e: logger.error(f"Error en create_concept_table: {str(e)}") raise def perform_discourse_analysis(text1, text2, nlp, lang): """ Realiza el análisis completo del discurso Args: text1: Primer texto a analizar text2: Segundo texto a analizar nlp: Modelo de spaCy cargado lang: Código de idioma Returns: dict: Resultados del análisis """ try: # Realizar análisis comparativo fig1, fig2, key_concepts1, key_concepts2 = compare_semantic_analysis( text1, text2, nlp, lang ) # Crear tablas de resultados table1 = create_concept_table(key_concepts1) table2 = create_concept_table(key_concepts2) return { 'graph1': fig1, 'graph2': fig2, 'key_concepts1': key_concepts1, 'key_concepts2': key_concepts2, 'table1': table1, 'table2': table2, 'success': True } except Exception as e: logger.error(f"Error en perform_discourse_analysis: {str(e)}") return { 'success': False, 'error': str(e) }