Generador de actas de reunión inteligente con bert-base-NER-uncased en menos de 100 líneas de código

Objetivo del proyecto

  • Entrada: Texto de una reunión (por ejemplo, transcripción de audio o notas manuscritas).
  • Salida: Acta estructurada que agrupa entidades nombradas por tipo: persona, organización, ubicación, fecha, hora.

Por qué usar bert-base-NER-uncased

  • Alta precisión: Modelo entrenado específicamente para reconocimiento de entidades nombradas (NER), con buen rendimiento en múltiples conjuntos de datos públicos.
  • Fácil integración: Compatible con la biblioteca Hugging Face Transformers, lo que permite su uso directo en proyectos Python.
  • Bajo consumo: Versión ligera basada en BERT, ideal para aplicaciones que requieren eficiencia sin sacrificar calidad.
  • Soporte multilenguaje: Aunque se usa en inglés aquí, puede adaptarse fácilmente a otros idiomas.

Lógica principle del sistema

El proceso sigue estos pasos: 1. Cargar el modelo y el tokenizador desde Hugging Face. 2. Procesar el texto de entrada mediante el pipeline de NER. 3. Analizar los tokens etiquetados (B- para inicio, I- para continuación) para agrupar entidades consecutivas. 4. Organizar los resultados por categoría para generar una salida estructurada.

Código completo con explicaciones

# Importar dependencias
from transformers import AutoTokenizer, AutoModelForTokenClassification
from transformers import pipeline

# Cargar modelo preentrenado
model_name = "bert-base-NER-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)

# Crear pipeline de NER
ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="simple")

def parse_entities(input_text):
    """
    Extrae entidades nombradas y las organiza por tipo.
    """
    # Obtener predicciones del modelo
    raw_predictions = ner_pipeline(input_text)

    # Inicializar diccionario de resultados
    structured_output = {
        "PERSON": [],
        "ORG": [],
        "LOC": [],
        "DATE": [],
        "TIME": []
    }

    # Agrupar entidades continuas
    current_entity = None
    for item in raw_predictions:
        label = item["entity_group"]
        text = item["word"]

        if item["score"] < 0.5:  # Filtro de confianza
            continue

        if label.startswith("B-"):
            if current_entity:
                structured_output[current_entity["type"]].append(current_entity["text"])
            current_entity = {"type": label[2:], "text": text}
        elif label.startswith("I-") and current_entity and current_entity["type"] == label[2:]:
            current_entity["text"] += " " + text
        else:
            if current_entity:
                structured_output[current_entity["type"]].append(current_entity["text"])
            current_entity = None

    if current_entity:
        structured_output[current_entity["type"]].append(current_entity["text"])

    return {k: v for k, v in structured_output.items() if v}

# Ejemplo de texto de reunión
meeting_transcript = """
The meeting was chaired by Sarah from Microsoft. 
She announced that the launch date is set for June 15th at the Seattle headquarters.
"""

# Procesar y mostrar resultados
extracted_data = parse_entities(meeting_transcript)

print("Acta de reunión:")
for category, values in extracted_data.items():
    if values:
        print(f"{category}: {', '.join(values)}")

Explicación técnica clave

  • aggregation_strategy="simple": Automatiza la combinación de tokens B-I para formar entidades completas.
  • El filtro de confianza (score < 0.5) ayuda a descartar predicciones poco seguras.
  • La lógica de agrupamianto maneja correctamente casos como "New York" o "June 15th" al detectar secuencias continuas.

Resultado esperado

Al ejecutar el código, se obtiene: ``` Acta de reunión: PERSON: Sarah ORG: Microsoft DATE: June 15th LOC: Seattle headquarters


### Extensibilidad y mejoras futuras

- **Manejo de textos largos:** Dividir el texto en fragmentos menores que respeten el límite de 512 tokens.
- **Integración con reconocimiento de voz:** Usar servicios como Whisper para convertir audio a texto antes de procesarlo.
- **Salida visual:** Exportar resultados a CSV, JSON o tablas HTML para facilitar la lectura.
- **Entrenamiento personalizado:** Mejorar el modelo con datos propios de reuniones empresariales.

Este proyecto no solo muestra el poder del modelo `bert-base-NER-uncased`, sino que también sirve como base para sistemas más avanzados de asistentes de reuniones automatizados. </div>

Etiquetas: transformers NER BERT Hugging Face Python

Publicado el 8-7 10:42