Sistema Inteligente de Monitoreo y Análisis de Noticias Web. Implementa un pipeline completo de procesamiento desde extracción y NLP hasta clasificación, análisis de sentimientos, búsqueda inteligente y un dashboard visual interactivo.
Construir un módulo inicial capaz de:
- Analizar la estructura DOM de una página HTML.
- Extraer noticias con título, cuerpo, fecha, autor, categoría y URL.
- Controlar qué enlaces puede visitar el rastreador.
- Evitar rastreo fuera del dominio o directorio permitido.
- Generar un resumen de extracción.
- Exportar los datos a JSON y CSV.
- Dejar una base para una futura implementación con Scrapy.
simanw_fase1/
├── main.py
├── requirements.txt
├── README.md
├── data/
│ ├── noticias_extraidas.json
│ └── noticias_extraidas.csv
├── src/
│ ├── __init__.py
│ ├── control_rastreo.py
│ ├── exportador.py
│ ├── extractor.py
│ ├── html_demo.py
│ └── parser_dom.py
└── scrapy_spider/
└── simanw_spider.pySe recomienda usar Python 3.12 para evitar problemas de compatibilidad con algunas dependencias.
Crear un entorno virtual:
python -m venv .venvActivar el entorno virtual en Windows PowerShell:
.venv\Scripts\Activate.ps1Instalar dependencias:
pip install -r requirements.txtDesde la raíz del proyecto:
python main.pyEjecutar la suite de tests:
python -m pytestEl programa ejecuta cuatro pasos:
- Analiza el DOM del HTML de prueba.
- Extrae las noticias disponibles.
- Simula el control de rastreo de URLs.
- Exporta los datos en archivos JSON y CSV.
Los archivos generados se guardan en la carpeta data/.
Analiza la estructura básica de una página HTML y devuelve información general como título, navegación, tendencias y cantidad de artículos.
Contiene la clase ExtractorNoticias, encargada de convertir artículos HTML en datos estructurados.
Contiene la clase ControlRastreo, encargada de validar URLs, mantener una cola de rastreo, registrar URLs visitadas y rechazar enlaces fuera del alcance definido.
Guarda las noticias extraídas en formato JSON y CSV.
Incluye una versión base del spider usando Scrapy para una futura implementación en producción.
El archivo scrapy_spider/simanw_spider.py es una referencia inicial. Para ejecutarlo como proyecto Scrapy real, primero habría que crear un proyecto con:
scrapy startproject simanw_scrapyDespués se movería el spider a la carpeta spiders/ del proyecto generado.
Al finalizar esta fase, el sistema cuenta con una base funcional para extraer noticias desde HTML, controlar el alcance de rastreo y almacenar los datos. Esta información podrá ser utilizada en las siguientes fases para procesamiento de lenguaje natural, clasificación, búsqueda inteligente, análisis semántico y generación de reportes.
SIMANW incluye una interfaz de escritorio construida con customtkinter.
Desde PowerShell, en la raiz del proyecto:
cd "C:\Users\Oscar Zamudio\Documents\SIMANW"
.\.venv\Scripts\Activate.ps1
python -m src.nltk_setup
python app_desktop.pySi aun no existe el entorno virtual o faltan dependencias:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m src.nltk_setup
python app_desktop.py- Abrir
Load / Analyze News. - Seleccionar
Demo localpara una ejecucion reproducible sin internet. - Presionar
Analyze News. - Revisar
Dashboard,Smart Results,News Explorer,Search & Q&A,Knowledge Graph,Reports & ExportsyAcademic Evidence.
SIMANW incluye un dashboard interactivo construido con Streamlit que expone todas las capacidades del sistema en un entorno visual moderno.
pip install -r requirements.txtAl ejecutar la aplicación por primera vez se descargan automáticamente los recursos de NLTK necesarios (punkt, punkt_tab, stopwords, vader_lexicon). Si prefieres descargarlos manualmente:
import nltk
nltk.download("punkt")
nltk.download("punkt_tab")
nltk.download("stopwords")
nltk.download("vader_lexicon")python main.pyEsto produce data/noticias_extraidas.json con el corpus procesado completo.
streamlit run app.pyLa aplicación abre en http://localhost:8501 en el navegador.
| Sección | Descripción |
|---|---|
| Dashboard | Vista general con métricas del corpus (total noticias, categorías, autores, sentimiento predominante), gráfica de distribución por categoría, gráfica de sentimientos y tabla resumen. |
| Noticias extraídas | Catálogo filtrable por categoría, sentimiento, autor y rango de fechas. Muestra título, cuerpo, categoría original, categoría predicha, sentimiento y enlace a la fuente. |
| Pipeline NLP | Para cualquier noticia seleccionada: texto original, texto limpio, tokens, tokens sin stopwords y stems. Estadísticas del corpus (vocabulario, riqueza léxica) y palabras más frecuentes. Top términos TF-IDF por documento. |
| Clasificación | Comparación entre categoría original y categoría predicha (LinearSVC). Scores de decisión por categoría visualizados en barras horizontales. Tabla comparativa del corpus completo. |
| Sentimientos | Distribución de sentimientos (positivo/neutral/negativo) con gráfica de pastel y barras de compound score. Detalle por noticia con gauge de intensidad de sentimiento. |
| Búsqueda inteligente | Búsqueda en lenguaje natural o vectorial. Interpreta filtros semánticos (sentimiento, categoría) automáticamente. Muestra resultados con relevancia, snippet y metadatos. |
| Recomendaciones | Selecciona una noticia base y obtiene las más similares por contenido TF-IDF. Mapa de calor con la matriz de similitud coseno del corpus. |
| Evaluación IRS | Tabla de métricas (Precision, Recall, F1, Average Precision) para consultas de ejemplo por categoría. MAP global del sistema. Herramienta interactiva de Precision@K. |
| Exportación | Descarga el corpus en JSON (completo con NLP) o CSV (campos tabulares con métricas de sentimiento). Guardado directo en disco en data/. |
SIMANW construye un Knowledge Graph en RDF a partir del corpus procesado.
| Archivo | Formato | Descripción |
|---|---|---|
data/ac13_simanw.ttl |
Turtle | Volcado RDF principal |
data/ac13_simanw.jsonld |
JSON-LD compacto | Mismos datos con @context legible |
shapes/simanw_shapes.ttl |
SHACL | Reglas de validación formal |
queries/*.rq |
SPARQL | Consultas sobre el grafo local |
docs/ontologia_simanw.md |
Markdown | Documentación completa de la ontología |
python main_actividades_complementarias.pyEsto ejecuta ejecutar_ac13() y regenera los archivos RDF en data/.
Por defecto SIMANW puede ejecutar el Knowledge Graph en modo offline para que la demo sea reproducible sin depender de red. Para AC-7, si se quiere consultar Wikidata realmente y registrar QIDs/enlaces externos obtenidos desde el endpoint SPARQL, activa la variable de entorno antes de abrir la app:
$env:SIMANW_WIKIDATA_ONLINE = "1"
python app_desktop.pyEn la app, ejecuta el pipeline desde Load / Analyze News y revisa Knowledge Graph o Academic Evidence. La evidencia debe mostrar wikidata_online: True, el endpoint https://query.wikidata.org/sparql, entidades evaluadas, enlaces creados y archivos como data/enlaces_wikidata_ac7.json.
Para volver al modo offline en la misma terminal:
Remove-Item Env:\SIMANW_WIKIDATA_ONLINE -ErrorAction SilentlyContinue
python app_desktop.pySi el modo online esta desactivado o no hay conexion, AC-7 se reporta como parcial/offline y no se debe presentar como enriquecimiento real de Wikidata.
| Prefijo | URI |
|---|---|
simanw: |
http://simanw.org/ontology/ |
dc: |
http://purl.org/dc/elements/1.1/ |
schema: |
https://schema.org/ |
foaf: |
http://xmlns.com/foaf/0.1/ |
skos: |
http://www.w3.org/2004/02/skos/core# |
# Ejecutar las consultas AC-13 en consola
python -c "
from main_actividades_complementarias import ejecutar_ac13
ejecutar_ac13()
"from src.knowledge_graph import KnowledgeGraphSIMANW
kg = KnowledgeGraphSIMANW()
# ... construir grafo ...
resultado = kg.validar_con_shacl('shapes/simanw_shapes.ttl')
print(resultado['conforme'], resultado['texto'])El proyecto también funciona sin la interfaz visual:
# Pipeline completo
python main.py
# Por fases
python main_fase2.py
python main_fase3.py
python main_fase4.py
# Tests
python -m pytest