METODOLOGÍA DE LA PROGRAMACIÓN UGR 2022-2023
Este proyecto implementa un sistema para el análisis y clasificación automática de textos según el idioma en que están escritos. El núcleo del sistema se basa en el procesamiento de bigramas (pares de caracteres consecutivos) para aprender modelos estadísticos de cada idioma y, posteriormente, clasificar documentos desconocidos.
El desarrollo se ha realizado de forma incremental a lo largo de varias prácticas (Language0 → Language5), añadiendo progresivamente funcionalidades, estructuras de datos y técnicas avanzadas de C++.
La práctica final (Language5) unifica todo en un único proyecto con tres programas principales:
- LEARN: Aprende un modelo (
language) a partir de uno o varios textos. - JOIN: Fusiona varios modelos de un mismo idioma.
- CLASSIFY: Determina el idioma de un texto desconocido comparándolo con modelos aprendidos.
-
Language0 – Language1:
- Implementación inicial de clases básicas (
Bigram,BigramFreq,Language). - Gestión de bigramas en memoria dinámica.
- Implementación inicial de clases básicas (
-
Language2 – Language3:
- Lectura y escritura de ficheros
.bgr. - Ordenación de bigramas y cálculo de distancias entre modelos de idioma.
- Lectura y escritura de ficheros
-
Language4:
- Incorporación de mejoras de eficiencia y funciones avanzadas de clasificación.
-
Language5 (Versión Final):
- Nueva clase
BigramCounterpara conteo eficiente en una matriz 2D dinámica. - Sobrecarga de operadores (
[],<<,>>, relacionales,+=) en todas las clases clave. - Soporte para ficheros binarios y de texto.
- Proyecto con múltiples ejecutables (
LEARN.cpp,JOIN.cpp,CLASSIFY.cpp) gestionados desde unmetamain.cpp.
- Nueva clase
- Manejo avanzado de punteros y memoria dinámica en clases.
- Implementación de constructor de copia, destructor y operador de asignación seguros (Regla de los Tres).
- Uso extensivo de sobrecarga de operadores para mejorar la legibilidad y reutilización del código.
- Procesamiento de ficheros binarios (
std::ostream::write) y de texto. - Diseño modular con reutilización de código de prácticas anteriores.
- Uso de herramientas de depuración y análisis de memoria como valgrind y el depurador de NetBeans.
Genera un modelo de idioma (.bgr) a partir de uno o varios textos.
LEARN [-t|-b] [-l nombreIdioma] [-o ficheroSalida] texto1.txt [texto2.txt ...]- -t | -b: Define la salida en formato texto (por defecto) o binario.
- -l: Asigna un identificador de idioma (unknown por defecto).
- -o: Especifica el nombre del fichero de salida (output.bgr por defecto). 2️⃣ JOIN Fusiona varios modelos de un mismo idioma para crear uno más robusto.
JOIN [-t|-b] [-o ficheroSalida.bgr] file1.bgr [file2.bgr ...]- Soporta la conversión entre formatos de texto y binario durante la fusión.
- Genera un modelo combinado más representativo.
Predice el idioma de un texto comparándolo con modelos .bgr existentes.
CLASSIFY texto.txt lang1.bgr [lang2.bgr ...]Calcula la distancia entre el modelo del texto de entrada y cada modelo de referencia. Devuelve el identificador del idioma con la menor distancia.
Language5/
├── src/
│ ├── Bigram.cpp / Bigram.h
│ ├── BigramFreq.cpp / BigramFreq.h
│ ├── Language.cpp / Language.h
│ ├── BigramCounter.cpp / BigramCounter.h
│ ├── LEARN.cpp
│ ├── JOIN.cpp
│ ├── CLASSIFY.cpp
│ └── metamain.cpp
├── Books/ # Textos de ejemplo para aprender y clasificar
├── Models/ # Modelos .bgr generados por LEARN y JOIN
└── README.mdLEARN -l spanish -o quijote.bgr Books/quijote.txt
LEARN -l english -o changedMan.bgr Books/changedMan.txtJOIN -b -o lang_spanish.bgr Models/quijote.bgr Models/fortunata.bgrCLASSIFY Books/unknown.txt Models/lang_spanish.bgr Models/lang_english.bgrEste proyecto ha permitido:
- Consolidar conceptos avanzados de programación orientada a objetos en C++.
- Trabajar eficientemente con memoria dinámica y estructuras de datos optimizadas.
- Aprender a gestionar proyectos con múltiples ejecutables y dependencias compartidas.
- Desarrollar un sistema funcional y robusto para la clasificación automática de textos por idioma, un problema clásico en el procesamiento del lenguaje natural.