Skip to content

Repository files navigation

Programming_Methodology

METODOLOGÍA DE LA PROGRAMACIÓN UGR 2022-2023

📚 Proyecto Language – Metodología de la Programación

📌 Descripción

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 (Language0Language5), 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.

🏗 Arquitectura y evolución

  • Language0 – Language1:

    • Implementación inicial de clases básicas (Bigram, BigramFreq, Language).
    • Gestión de bigramas en memoria dinámica.
  • Language2 – Language3:

    • Lectura y escritura de ficheros .bgr.
    • Ordenación de bigramas y cálculo de distancias entre modelos de idioma.
  • Language4:

    • Incorporación de mejoras de eficiencia y funciones avanzadas de clasificación.
  • Language5 (Versión Final):

    • Nueva clase BigramCounter para 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 un metamain.cpp.

🎯 Objetivos alcanzados

  • 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.

⚙️ Programas incluidos

1️⃣ LEARN

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.

3️⃣ CLASSIFY

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.

📂 Estructura del proyecto

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.md

📌 Ejemplo de flujo completo

Aprender modelos a partir de textos:

LEARN -l spanish -o quijote.bgr Books/quijote.txt
LEARN -l english -o changedMan.bgr Books/changedMan.txt

Fusionar varios modelos del mismo idioma (opcional):

JOIN -b -o lang_spanish.bgr Models/quijote.bgr Models/fortunata.bgr

Clasificar un texto desconocido:

CLASSIFY Books/unknown.txt Models/lang_spanish.bgr Models/lang_english.bgr

📈 Conclusiones

Este 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages