tutoriales.com

Desambiguación del Sentido de las Palabras (WSD): Comprendiendo el Contexto en PNL

Este tutorial explora la Desambiguación del Sentido de las Palabras (WSD), una tarea crucial en el Procesamiento del Lenguaje Natural. Aprenderás por qué las palabras tienen múltiples significados, los principales algoritmos y enfoques, y cómo aplicar WSD para mejorar la comprensión contextual en diversas aplicaciones.

Intermedio18 min de lectura9 views
Reportar error

El lenguaje humano es inherentemente ambiguo. Una misma palabra puede tener múltiples significados dependiendo del contexto en el que se utilice. Por ejemplo, la palabra "banco" puede referirse a una institución financiera, un asiento, o un conjunto de peces. Para que las máquinas puedan comprender el lenguaje de forma efectiva, es fundamental que puedan resolver esta ambigüedad. Aquí es donde entra en juego la Desambiguación del Sentido de las Palabras (Word Sense Disambiguation - WSD).

📖 ¿Qué es la Desambiguación del Sentido de las Palabras (WSD)?

La Desambiguación del Sentido de las Palabras (WSD) es un problema abierto en el campo del Procesamiento del Lenguaje Natural (PLN) que implica la asignación del sentido correcto a una palabra polisémica (una palabra con múltiples significados) en un contexto determinado. Es una tarea fundamental para muchas aplicaciones de PLN que requieren una comprensión profunda del lenguaje, como la traducción automática, la recuperación de información, el análisis de sentimientos o la extracción de información.

💡 Consejo: Piensa en WSD como el "detector de ironía" o "detector de significado" para las máquinas. Sin WSD, un chatbot podría interpretar "me caí en el banco" como una caída dentro de un banco de peces si solo conociera ese significado.

🎯 ¿Por qué es tan importante la WSD?

La importancia de la WSD radica en su capacidad para mejorar la precisión y la utilidad de otras tareas de PLN. Sin una correcta desambiguación, los sistemas de PLN pueden producir resultados erróneos o irrelevantes. Aquí algunos ejemplos:

  • Traducción automática: Traducir "banco" como "bank" (institución) cuando se refiere a "bench" (asiento) sería un error grave.
  • Recuperación de información: Buscar "coche" en un motor de búsqueda y obtener resultados sobre el "tren de aterrizaje" de un avión porque la palabra "tren" no fue correctamente desambiguada.
  • Análisis de sentimientos: Si una palabra como "crítico" se usa en el sentido de "analítico y evaluativo" en lugar de "negativo y reprobatorio", el sentimiento general del texto podría ser malinterpretado.
  • Extracción de información: Identificar correctamente la entidad "Apple" como la compañía de tecnología o como la fruta.

🤯 El Desafío de la Ambigüedad Léxica

El desafío principal de la WSD es la vasta cantidad de ambigüedad en el lenguaje natural y la sutileza de los contextos que distinguen entre los diferentes significados. La polisemia (una palabra, múltiples significados relacionados) y la homonimia (palabras iguales, significados no relacionados) son las principales fuentes de esta ambigüedad.

Tipos de Ambigüedad:

  • Ambigüedad Léxica: Cuando una palabra o frase tiene múltiples significados.
    • Ejemplo: "banco" (asiento vs. institución financiera).
  • Ambigüedad Sintáctica: Cuando la estructura gramatical de una oración puede interpretarse de múltiples maneras.
    • Ejemplo: "El perro de mi vecino tiene una correa muy larga." (¿La correa es larga o el vecino es alto? Aunque lo más probable es lo primero, la estructura permite la segunda).
  • Ambigüedad Semántica: Cuando el significado de una oración completa es ambiguo.
    • Ejemplo: "Visité París en mi viaje." (¿De dónde era el viaje? ¿Qué tipo de viaje?).

La WSD se centra principalmente en la ambigüedad léxica, aunque resolverla a menudo requiere considerar información sintáctica y semántica más amplia.

⚠️ Advertencia: El número de sentidos para cada palabra puede variar enormemente y no siempre están claramente delimitados. Esto hace que la tarea de WSD sea intrínsecamente difícil, incluso para los humanos.

🛠️ Enfoques y Algoritmos de WSD

Existen varios enfoques para abordar la WSD, que se pueden clasificar principalmente en métodos basados en diccionarios o reglas, métodos supervisados y métodos no supervisados o semi-supervisados.

1. Métodos Basados en Diccionarios o Reglas

Estos métodos utilizan recursos léxicos como diccionarios, tesauros o bases de datos léxicas (como WordNet) para desambiguar palabras. No requieren un corpus de texto anotado, lo que los hace atractivos cuando los datos de entrenamiento son escasos.

Algoritmo de Lesk

El algoritmo de Lesk es uno de los métodos WSD basados en diccionarios más influyentes y ampliamente citados. La idea central es encontrar el sentido de una palabra que tiene la mayor superposición léxica (palabras en común) con el contexto circundante.

Funcionamiento Básico del Algoritmo de Lesk:

  1. Obtener los sentidos: Para la palabra objetivo, se recuperan todas sus definiciones (glosas) de un diccionario (ej. WordNet).
  2. Comparar con el contexto: Se compara cada glosa con las palabras del contexto de la oración donde aparece la palabra objetivo.
  3. Contar superposición: Se cuenta el número de palabras comunes (superposición) entre la glosa y el contexto.
  4. Seleccionar el mejor sentido: El sentido con la mayor superposición es el elegido como el correcto.
**Ejemplo Simplificado:**
  • Oración: "El banco del parque estaba lleno de palomas."
  • Palabra objetivo: "banco"
  • Contexto: {"el", "parque", "estaba", "lleno", "de", "palomas"}
  • Sentidos de "banco" (ej. de WordNet):
    • Sentido 1 (asiento): "Asiento largo para varias personas, generalmente sin respaldo."
    • Sentido 2 (financiero): "Institución financiera que ofrece servicios de depósito y préstamo."

Proceso:

  • Comparar Sentido 1: Glosa = {"asiento", "largo", "para", "varias", "personas", "generalmente", "sin", "respaldo"}. Superposición con contexto: ninguna palabra común.
    • Mejora: Si consideramos sinónimos o palabras relacionadas, "parque" podría relacionarse con "asiento".
  • Comparar Sentido 2: Glosa = {"institución", "financiera", "que", "ofrece", "servicios", "de", "depósito", "y", "préstamo"}. Superposición con contexto: ninguna palabra común.

Este ejemplo simple muestra la limitación. El algoritmo de Lesk original trabaja mejor cuando se expanden las glosas con ejemplos de uso o se consideran palabras relacionadas (no solo la superposición directa). Una versión extendida del algoritmo de Lesk (Extended Lesk) considera no solo las palabras en la glosa de la palabra objetivo, sino también las palabras en las glosas de las palabras de su contexto, aumentando las posibilidades de superposición.

Inicio Obtener palabra objetivo y su contexto Para cada sentido de la palabra objetivo: Obtener glosa del sentido Expandir glosa con glosas de sinónimos e hipónimos Calcular superposición entre glosa expandida y contexto Seleccionar sentido con mayor superposición Fin

2. Métodos Supervisados

Los métodos supervisados son actualmente los más precisos. Tratan la WSD como un problema de clasificación, donde los sentidos de las palabras son las clases. Requieren un corpus de texto previamente anotado con los sentidos correctos de cada palabra.

Proceso General:

  1. Recopilación de Datos: Se requiere un corpus de entrenamiento (por ejemplo, SemCor) donde cada instancia de una palabra polisémica esté etiquetada con su sentido correcto.
  2. Extracción de Características (Feature Engineering): Se extraen características del contexto de la palabra objetivo. Estas características pueden incluir:
    • Palabras de contexto: Palabras que aparecen alrededor de la palabra objetivo (n-gramas).
    • Part-of-Speech (POS) tags: La categoría gramatical de la palabra objetivo y las palabras de su contexto.
    • Características sintácticas: Relaciones de dependencia, estructura de la frase.
    • Colocaciones: Patrones de palabras que aparecen juntas (ej., "caja fuerte" vs. "caja de cartón").
    • Embeddings de palabras: Vectores densos que capturan el significado semántico de las palabras.
  3. Entrenamiento del Clasificador: Se entrena un modelo de Machine Learning (ej., Naive Bayes, Support Vector Machines (SVM), Random Forests, Redes Neuronales) utilizando las características extraídas y los sentidos anotados.
  4. Predicción: Para una nueva instancia de la palabra, se extraen las mismas características y el clasificador predice el sentido más probable.

Desafíos de los Métodos Supervisados:

  • Escasez de datos de entrenamiento: Crear corpus anotados con los sentidos correctos es extremadamente costoso y requiere mucho tiempo de expertos lingüistas.
  • Sesgo del modelo: Los modelos pueden aprender sesgos de los datos de entrenamiento.
  • Generalización: Dificultad para generalizar a nuevos dominios o contextos no vistos en el entrenamiento.

3. Métodos No Supervisados y Semi-Supervisados

Estos métodos intentan superar la escasez de datos anotados. Los métodos no supervisados no requieren ningún dato anotado, mientras que los semi-supervisados utilizan una pequeña cantidad de datos anotados o recursos léxicos para "arrancar" el proceso.

Métodos No Supervisados: Agrupamiento (Clustering)

La idea es agrupar las ocurrencias de una palabra polisémica basándose en la similitud de sus contextos. Cada grupo (cluster) se asume que representa un sentido distinto de la palabra. Posteriormente, se puede intentar mapear estos clusters a los sentidos conocidos de un diccionario.

Pasos Básicos:

  1. Representación del contexto: Cada ocurrencia de la palabra objetivo se representa como un vector (ej., usando embeddings de palabras de las palabras circundantes).
  2. Agrupamiento: Se aplican algoritmos de clustering (ej., K-Means, DBSCAN) para agrupar estas representaciones contextuales.
  3. Asignación de sentido: Cada cluster resultante se interpreta como un posible sentido de la palabra.

Métodos Semi-Supervisados: Bootstrapping

Estos métodos comienzan con un pequeño conjunto de ejemplos etiquetados (o reglas heurísticas simples) y lo utilizan para etiquetar más ejemplos de forma iterativa. Por ejemplo, si sabemos que "banco" en "banco de peces" significa la colección de peces, podemos buscar contextos similares para inferir ese sentido en nuevas oraciones.


✨ La Era de los Embeddings Contextuales (Transformers)

La llegada de los modelos de lenguaje basados en Transformers, como BERT, GPT y ELMo, ha revolucionado la PNL, y la WSD no es una excepción. Estos modelos son intrínsecamente buenos en WSD porque generan embeddings contextuales.

¿Qué son los Embeddings Contextuales?

A diferencia de los embeddings tradicionales (Word2Vec, GloVe) que asignan un único vector a cada palabra, los embeddings contextuales generan un vector diferente para cada ocurrencia de una palabra, basándose en el contexto completo de la oración. Esto significa que la palabra "banco" tendrá un embedding diferente en "fui al banco a sacar dinero" que en "me senté en el banco del parque".

📌 Nota: Los embeddings contextuales codifican la polisemia de forma natural. El vector para "banco" ya captura su sentido específico dentro de la oración.

WSD con Transformers

Con modelos como BERT, la WSD puede abordarse de varias maneras:

  1. Implícitamente: Muchos modelos Transformer pre-entrenados ya realizan WSD de forma implícita debido a su naturaleza contextual. Al generar embeddings específicos para cada sentido, las tareas downstream que usan estos embeddings (clasificación de texto, QA, etc.) se benefician directamente.
  2. Fine-tuning para WSD: Se puede hacer fine-tuning de un modelo Transformer pre-entrenado en un dataset de WSD anotado (ej., OntoNotes, SemCor). Esto lo convierte en un clasificador especializado en WSD.
    • Se toma la representación vectorial de la palabra objetivo (normalmente el token [CLS] o el token de la palabra misma) y se pasa a una capa de clasificación que predice el sentido correcto.
  3. Agrupamiento de Embeddings Contextuales: Para un enfoque no supervisado, se pueden extraer los embeddings contextuales de todas las ocurrencias de una palabra y luego aplicar algoritmos de clustering para agruparlos en diferentes sentidos.
90% Precisión Potencial con Transformers

🧑‍💻 Implementación de WSD con Python y NLTK/SpaCy

Vamos a ver cómo implementar WSD utilizando librerías populares de PLN en Python.

Usando el Algoritmo de Lesk con NLTK

NLTK ofrece una implementación del algoritmo de Lesk (y su versión extendida) que utiliza WordNet como recurso léxico.

Requisitos:

pip install nltk

Descarga los recursos necesarios de NLTK:

import nltk
nltk.download('wordnet')
nltk.download('omw-1.4') # Open Multilingual Wordnet
nltk.download('punkt')

Ejemplo de Código:

from nltk.corpus import wordnet
from nltk.wsd import lesk
from nltk.tokenize import word_tokenize

# Oración de ejemplo
sentence1 = "Fui al banco a sacar dinero."
sentence2 = "Me senté en el banco del parque."
sentence3 = "Vimos un banco de peces en el arrecife."

# Tokenizar la oración para obtener el contexto
tokens1 = word_tokenize(sentence1)
tokens2 = word_tokenize(sentence2)
tokens3 = word_tokenize(sentence3)

# Palabra objetivo
word_target = "banco"

# Aplicar el algoritmo de Lesk
sense1 = lesk(tokens1, word_target)
sense2 = lesk(tokens2, word_target)
sense3 = lesk(tokens3, word_target)

print(f"Oración: '{sentence1}'")
print(f"Sentido de '{word_target}': {sense1.definition()}\n")

print(f"Oración: '{sentence2}'")
print(f"Sentido de '{word_target}': {sense2.definition()}\n")

print(f"Oración: '{sentence3}'")
print(f"Sentido de '{word_target}': {sense3.definition()}\n")

# Otro ejemplo con la palabra 'planta'
sentence4 = "La planta del pie me dolía."
sentence5 = "La planta de la fábrica era muy grande."
sentence6 = "Regué la planta de mi jardín."

tokens4 = word_tokenize(sentence4)
tokens5 = word_tokenize(sentence5)
tokens6 = word_tokenize(sentence6)

word_target_plant = "planta"

sense4 = lesk(tokens4, word_target_plant)
sense5 = lesk(tokens5, word_target_plant)
sense6 = lesk(tokens6, word_target_plant)

print(f"Oración: '{sentence4}'")
print(f"Sentido de '{word_target_plant}': {sense4.definition()}\n")

print(f"Oración: '{sentence5}'")
print(f"Sentido de '{word_target_plant}': {sense5.definition()}\n")

print(f"Oración: '{sentence6}'")
print(f"Sentido de '{word_target_plant}': {sense6.definition()}\n")

Posible Salida:

Oración: 'Fui al banco a sacar dinero.'
Sentido de 'banco': (en derecho bancario) la suma de dinero en una cuenta

Oración: 'Me senté en el banco del parque.'
Sentido de 'banco': un asiento largo sin respaldo

Oración: 'Vimos un banco de peces en el arrecife.'
Sentido de 'banco': un gran grupo de peces

Oración: 'La planta del pie me dolía.'
Sentido de 'planta': la parte inferior del pie

Oración: 'La planta de la fábrica era muy grande.'
Sentido de 'planta': un edificio o grupo de edificios donde los productos se fabrican o ensamblan

Oración: 'Regué la planta de mi jardín.'
Sentido de 'planta': (botánica) una pequeña planta, especialmente una de crecimiento joven

Como puedes observar, el algoritmo de Lesk de NLTK es bastante efectivo para desambiguar sentidos comunes. Sin embargo, su precisión puede variar dependiendo de la riqueza de las glosas en WordNet y la claridad del contexto.

Uso de SpaCy (con un enfoque más moderno)

SpaCy no tiene una función WSD directa incorporada como Lesk en NLTK. Sin embargo, su capacidad para trabajar con embeddings y modelos neuronales pre-entrenados permite un enfoque más robusto. Para WSD con SpaCy, a menudo se integran soluciones que aprovechan modelos de lenguaje grandes (LLMs) o se entrena un clasificador adicional.

Una forma común es usar los embeddings de spaCy para luego aplicar técnicas de clustering o un clasificador externo.

Requisitos:

pip install spacy
python -m spacy download es_core_news_lg # Descargar un modelo grande en español

Ejemplo (conceptual) con embeddings de SpaCy y clustering:

Este ejemplo ilustra cómo podrías extraer embeddings de palabras con SpaCy y luego agruparlos para encontrar distintos sentidos. Esto sería un enfoque no supervisado de WSD.

import spacy
from sklearn.cluster import KMeans
import numpy as np

nlp = spacy.load("es_core_news_lg")

sentences = [
    "Fui al banco a sacar dinero.",
    "Me senté en el banco del parque.",
    "Vimos un banco de peces en el arrecife.",
    "El director del banco anunció nuevos préstamos.",
    "El banco de arena era peligroso para los barcos.",
    "Compramos un banco de madera para el jardín."
]

word_to_disambiguate = "banco"

embeddings = []
contexts = []

for sent in sentences:
    doc = nlp(sent)
    for token in doc:
        if token.text.lower() == word_to_disambiguate:
            # Usamos el embedding del token, que es contextual
            embeddings.append(token.vector)
            contexts.append(sent)
            break # Solo nos interesa la primera aparición por oración en este ejemplo

# Convertir la lista de embeddings a un array numpy
X = np.array(embeddings)

# Determinar el número de clusters (sentidos esperados). Esto es un parámetro clave.
# Para 'banco', podríamos esperar 3-4 sentidos principales (financiero, asiento, peces, arena)
num_clusters = 3 # Puedes ajustar esto basándote en el conocimiento del dominio

kmeans = KMeans(n_clusters=num_clusters, random_state=0, n_init=10) # n_init para evitar warnings
kmeans.fit(X)

# Imprimir los resultados
print(f"Agrupando '{word_to_disambiguate}' en {num_clusters} sentidos:\n")
for i, cluster_id in enumerate(kmeans.labels):
    print(f"Oración: '{contexts[i]}' -> Sentido (Cluster): {cluster_id}")

# Opcional: intentar imprimir las oraciones por cluster
print("\n--- Oraciones por Cluster ---")
for cluster_id in range(num_clusters):
    print(f"\nCluster {cluster_id}:")
    for i, label in enumerate(kmeans.labels):
        if label == cluster_id:
            print(f"  - {contexts[i]}")

Posible Salida del Clustering (los IDs de cluster pueden variar):

Agrupando 'banco' en 3 sentidos:

Oración: 'Fui al banco a sacar dinero.' -> Sentido (Cluster): 0
Oración: 'Me senté en el banco del parque.' -> Sentido (Cluster): 1
Oración: 'Vimos un banco de peces en el arrecife.' -> Sentido (Cluster): 2
Oración: 'El director del banco anunció nuevos préstamos.' -> Sentido (Cluster): 0
Oración: 'El banco de arena era peligroso para los barcos.' -> Sentido (Cluster): 2
Oración: 'Compramos un banco de madera para el jardín.' -> Sentido (Cluster): 1

--- Oraciones por Cluster ---

Cluster 0:
  - Fui al banco a sacar dinero.
  - El director del banco anunció nuevos préstamos.

Cluster 1:
  - Me senté en el banco del parque.
  - Compramos un banco de madera para el jardín.

Cluster 2:
  - Vimos un banco de peces en el arrecife.
  - El banco de arena era peligroso para los barcos.

Este ejemplo muestra cómo el clustering de embeddings contextuales puede separar de forma efectiva los diferentes usos de una palabra. El desafío en este enfoque no supervisado es mapear estos clusters a los sentidos "reales" (ej., de un diccionario) y determinar el número óptimo de clusters.

Profundizando en SpaCy y WSD Para una WSD más robusta con SpaCy, se suele utilizar una combinación de técnicas:
  1. Características enriquecidas: Usar los atributos de token de SpaCy (POS, dependencia, lema) como características adicionales en un clasificador.
  2. Modelos de Transformadores externos: Integrar modelos como transformers de Hugging Face directamente para obtener embeddings más avanzados y realizar fine-tuning.
  3. Proyectos específicos de WSD: Explorar librerías de terceros que se integran con SpaCy o que están diseñadas específicamente para WSD, como pywsd (que también usa NLTK y WordNet internamente).

El enfoque moderno tiende a apoyarse fuertemente en modelos de lenguaje pre-entrenados y su capacidad inherente para manejar el contexto.


📈 Evaluación y Métricas de WSD

La evaluación de los sistemas WSD es crucial para entender su rendimiento. Las métricas más comunes son la precisión (accuracy), la cobertura (coverage), la recall y la f-score.

  • Precisión: El porcentaje de decisiones de WSD correctas sobre el total de decisiones realizadas. Un sistema puede elegir no desambiguar si no está seguro, lo que afecta la cobertura.
  • Cobertura: El porcentaje de instancias de palabras polisémicas que el sistema intentó desambiguar.
  • Recall: El porcentaje de decisiones de WSD correctas sobre el total de instancias de palabras polisémicas en el corpus.
  • F-score: La media armónica de precisión y recall, una métrica combinada que equilibra ambos aspectos.

La evaluación suele realizarse contra un "gold standard" o corpus de pruebas anotado manualmente por expertos humanos. Comparar el rendimiento de la máquina con el acuerdo entre anotadores humanos (inter-annotator agreement) es fundamental para establecer un techo de rendimiento.


🌐 Aplicaciones de WSD

La WSD es una tarea subyacente que potencia la precisión de muchas aplicaciones de PLN:

AplicaciónImpacto de WSDEjemplo
---------
Traducción AutomáticaSelección correcta de traducciones según el contexto.Traducir "ratón" como "mouse" (animal) o "mouse" (dispositivo).
Recuperación de InformaciónMejora la relevancia de los resultados de búsqueda.Buscar "jaguar" y obtener artículos sobre el animal o el coche, según la consulta.
Análisis de SentimientosComprender el matiz emocional de palabras ambiguas.Distinguir "crítico" (importante) de "crítico" (negativo).
Extracción de InformaciónIdentificar entidades y relaciones de forma precisa.Saber si "Apple" se refiere a la empresa o la fruta en una base de datos.
Generación de Lenguaje NaturalUsar las palabras con el significado adecuado.Generar una frase sobre un "banco" financiero sin que parezca un asiento.
Reconocimiento de VozDesambiguar homófonos (palabras que suenan igual).Distinguir "hola" de "ola".
WSD Traducción Automática Elegir "bank" (banco) vs "bench" (banco) Recuperación de Información Búsquedas de "planta" (fábrica o vegetal) Análisis de Sentimientos Identifica si "brillante" es color o calidad Extracción de Información Vincular "Apple" a empresa, no fruta Generación de Lenguaje Crea respuestas coherentes sin ambigüedad Reconocimiento de Voz Distingue "vaya", "valla" o "baya" por contexto

🔮 El Futuro de la WSD

Con el auge de los modelos de lenguaje a gran escala (LLMs) como GPT-3/4, la WSD ha evolucionado. Estos modelos no realizan WSD como una tarea explícita, sino que su comprensión contextual inherente les permite generar o interpretar el texto utilizando el sentido correcto de las palabras. De alguna manera, los LLMs resuelven la WSD de forma intrínseca al procesar el lenguaje.

Sin embargo, la WSD sigue siendo un campo de investigación activo, especialmente en:

  • Idiomas con menos recursos: Donde la disponibilidad de diccionarios y corpus anotados es limitada.
  • Dominios especializados: Donde el significado de las palabras puede ser muy específico (ej., jerga médica o legal).
  • WSD para usos específicos: Cuando se necesita una explicación explícita del sentido elegido para auditoría o interpretabilidad del modelo.
🔥 Importante: Aunque los LLMs parecen haber "resuelto" muchos problemas de PNL, entender los principios subyacentes de tareas como WSD sigue siendo crucial para construir sistemas más transparentes, controlables y eficientes, especialmente en entornos de recursos limitados.

Conclusión

La Desambiguación del Sentido de las Palabras es un componente vital para lograr una verdadera comprensión del lenguaje natural por parte de las máquinas. Desde los algoritmos clásicos basados en diccionarios hasta los sofisticados modelos basados en Transformers, la evolución de WSD ha sido un viaje fascinante. A medida que los modelos de IA se vuelven más contextuales, la WSD se integra cada vez más en sus arquitecturas, permitiendo que las aplicaciones de PNL sean más inteligentes y precisas.

Esperamos que este tutorial te haya proporcionado una comprensión sólida de la WSD y su importancia en el vasto mundo del Procesamiento del Lenguaje Natural.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!