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>