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.
- 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- Los datos de NLTK se descargarán automáticamente al ejecutar el parser por primera vez.
Note
El uso de python3 o python dependerá de tu sistema y configuración.
Asegúrate de usar el comando correcto para tu entorno.
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.
python3 efe_indexing.py --add --path indice_efe --documents nuevos_docs/Modo interactivo (recomendado):
python3 efe_query.py --index indice_efeEl 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 20Ver estadísticas del índice:
python3 efe_query.py --index indice_efe --statsSearchEngine/
├── 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)
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.
# 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--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)
--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
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