Skip to content

usbt0p/SearchEngine

Repository files navigation

Motor de Búsqueda - Documentos EFE

Sistema de recuperación de información basado en Whoosh para indexar y buscar noticias de la Agencia EFE en formato SGML. Implementa parseo automático, generación de keywords, indexación eficiente y búsqueda avanzada con filtros. Se proporciona una interfaz interactiva por línea de comandos.

Note

¡Importante! Algunos archivos del conjunto de documentos EFE están mal codificados y muestran problemas con los acentos. Para solucionarlo, puedes usar el script fix_encoding.py incluido en este repositorio antes de continuar.

Instalación

  1. Instalar dependencias en entorno virtual:
python3 -m venv .venv
source .venv/bin/activate  # En Windows: .venv\Scripts\activate
pip -V # comprobar que pip está en el entorno virtual
pip install -r requirements.txt
  1. Los datos de NLTK se descargarán automáticamente al ejecutar el parser por primera vez.

Uso

Note

El uso de python3 o python dependerá de tu sistema y configuración. Asegúrate de usar el comando correcto para tu entorno.

1. Crear el índice

Para indexar documentos desde una carpeta con archivos .sgml:

python3 efe_indexing.py --create --path indice_efe --documents efe/

El parser espera encoding utf-8 para los archivos SGML. Asegúrate de que los archivos estén correctamente codificados, corrigiendo la codificacion latin-1 con el script fix_encoding.py si es necesario.

2. Añadir documentos a un índice existente

python3 efe_indexing.py --add --path indice_efe --documents nuevos_docs/

3. Buscar documentos

Modo interactivo (recomendado):

python3 efe_query.py --index indice_efe

El modo interactivo permite:

  • Introducir consultas en texto libre
  • Seleccionar campos donde buscar (TITLE, TEXT, KEYWORDS)
  • Aplicar filtros por categoría, keyword y fecha
  • Especificar número de resultados a mostrar

Búsqueda directa desde línea de comandos:

# búsqueda simple
python3 efe_query.py --index indice_efe --query "violencia venezuela"

# búsqueda con filtro por categoría y prioridad
python3 efe_query.py --index indice_efe --query "economía" --category ECONOMIA --prioridad U

# búsqueda con filtro de fecha
python3 efe_query.py --index indice_efe --query "elecciones" --date-from 19940101 --date-to 19940131

# búsqueda en campos específicos
python3 efe_query.py --index indice_efe --query "zapatista" --fields TITLE TEXT --limit 20

Ver estadísticas del índice:

python3 efe_query.py --index indice_efe --stats

Estructura del Proyecto

SearchEngine/
├── parser_efe_corpus.py   # módulo de parseo de documentos SGML
├── efe_indexing.py         # script de indexación
├── efe_query.py            # interfaz de búsqueda
├── requirements.txt        # dependencias
├── fix_encoding.py        # script para corregir codificación de archivos
├── test_search.sh          # script de prueba rápida para linux
├── efe/                    # carpeta con documentos SGML
└── indice_efe/            # índice generado (se crea al indexar)

Diseño del Sistema

Schema de Indexación

El schema define cómo se procesan y almacenan los documentos:

Campo Tipo Descripción Indexado Stored Notas
DOCNO ID Identificador único Si Si Campo único
TITLE TEXT Título de la noticia Si Si Stemming español
TEXT TEXT Cuerpo completo Si No No stored (ahorra espacio)
DATE DATETIME Fecha publicación Si Si Para filtrado por rango
TIME DATETIME Fecha y hora completa Si Si Incluye hora de publicación
CATEGORY KEYWORD Categoría temática Si Si Lowercase, scorable
KEYWORDS KEYWORD Keywords generadas (RAKE) Si Si Separadas por comas
PRIORIDAD KEYWORD Prioridad de la noticia Si Si Lowercase, scorable
Otros STORED Metadatos adicionales No Si Solo almacenamiento

El porqué de estas decisiones es el siguiente:

  • El campo DOCNO es el identificador único de cada documento y es esencial para recuperarlo.
  • Los campos TITLE y TEXT son los principales para la búsqueda de contenido relevante.
  • El campo TITLE se almacena para mostrarlo en los resultados.
  • El campo TEXT no se almacena para reducir el tamaño del índice y mejorar el rendimiento. Al no estar stored, no se puede recuperar su contenido completo desde el índice, pero sigue siendo buscable.
  • El campo KEYWORDS se genera automáticamente usando RAKE-NLTK para mejorar la recuperación y permitir búsquedas por palabras clave relevantes, lo cual mitiga la falta de almacenamiento del campo TEXT.
  • Los campos DATE y TIME permiten realizar búsquedas filtradas por fechas específicas o rangos.
  • Las CATEGORY y PRIORIDAD son campos ligeros y útiles para filtrar y rankear resultados.
  • Campos cuya utilidad o semántica no está clara se almacenan como STORED para posible uso futuro sin impactar en la búsqueda.

Ejemplos de Consultas

# noticias sobre política
python3 efe_query.py --index indice_efe --query "gobierno presidente" --category POLITICA

# sucesos violentos
python3 efe_query.py --index indice_efe --query "muerte violencia" --category SUCESOS

# economía en enero 1994 con prioridad alta
python3 efe_query.py --index indice_efe --query "economía inflación" \
  --date-from 19940101 --date-to 19940131 --prioridad U --limit 20

# búsqueda solo en títulos
python3 efe_query.py --index indice_efe --query "zapatista chiapas" --fields TITLE

# búsqueda por keyword y prioridad
python3 efe_query.py --index indice_efe --query "rebeldes" --keyword "ejército zapatista" --prioridad R

Opciones de Línea de Comandos

efe_indexing.py

--create              crear nuevo índice (elimina el existente)
--add                 añadir documentos a índice existente
--path PATH           ruta del índice
--documents PATH      ruta a carpeta con archivos SGML (.sgml)

efe_query.py

--index PATH          ruta al índice
--query TEXT          texto de búsqueda
--fields [TITLE|TEXT|KEYWORDS ...]  campos donde buscar
--category CAT        filtrar por categoría
--keyword KW          filtrar por keyword
--prioridad PRIO      filtrar por prioridad (U, R, etc.)
--date-from AAAAMMDD  fecha desde
--date-to AAAAMMDD    fecha hasta
--limit N             número máximo de resultados (default: 10)
--stats               mostrar estadísticas del índice

Formato de Fechas

Las fechas se especifican en formato AAAAMMDD:

  • 19940102 → 2 de enero de 1994

  • También acepta: 1994-01-02 (se eliminan los guiones automáticamente)

  • Realmente, solo hay fechas entre el 2 de enero de 1994 y el 16 de enero de 1994, como se puede ver al ejecutar:

    for file in efe/*.sgml; do echo -n "$file: "; grep -c "<DATE>1994" "$file"; done

    El numero total de documentos lo confirma tambien:

    grep -h "<DOC>" efe/*.sgml | wc -l # total documentos
    grep -h "<DATE>199401" efe/*.sgml | wc -l # documentos en enero 1994

About

Simple information retrieval system using Whoosh, with indexing, querying and parsing for the EFE news corpus

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors