En este artículo, aprenderá cómo realizar una clasificación de texto con múltiples etiquetas utilizando modelos de lenguaje grandes y la biblioteca scikit-LLM, sin la necesidad de datos de entrenamiento etiquetados o entrenamiento de modelos complejos.
Los temas que cubriremos incluyen:
Qué es la clasificación de etiquetas múltiples y por qué es importante para el análisis de texto matizado. Cómo instalar y configurar scikit-LLM con un LLM gratuito y de código abierto de Groq para una inferencia cero. Cómo cargar un conjunto de datos del mundo real y ejecutar predicciones de sentimiento de múltiples etiquetas utilizando un flujo de trabajo familiar estilo scikit-learn.
Clasificación de texto de etiquetas múltiples con Scikit-LLM
Introducción
La clasificación de texto generalmente se reduce a escenarios en los que la reseña de un producto es “positiva” o “negativa”, o la consulta de un cliente pertenece a una categoría u otra. Sin embargo, cuando se trata de sentimientos humanos, la categorización rara vez es clara. A veces, incluso una sola frase puede transmitir tanto alegría como enojo; por ejemplo, “Me encanta la duración mejorada de la batería, pero el nuevo diseño es increíblemente horrible”. Ingrese a la clasificación de etiquetas múltiples: una tarea de clasificación “actualizada” capaz de asignar múltiples categorías a objetos de datos, como fragmentos de texto, simultáneamente.
La creación de clasificadores de etiquetas múltiples para texto normalmente requiere grandes cantidades de datos de entrenamiento etiquetados junto con arquitecturas de redes neuronales complejas, pero hoy existe un truco maestro: aprovechar la capacidad de razonamiento de los modelos de lenguaje grandes (LLM); en concreto, el razonamiento de tiro cero. Gracias a bibliotecas novedosas como scikit-LLM, esto se puede hacer como si se utilizara un flujo de trabajo de aprendizaje automático tradicional con scikit-learn. Este artículo le mostrará cómo abordar un problema de clasificación de opiniones de múltiples etiquetas utilizando un conjunto de datos de código abierto del mundo real.
Tutorial paso a paso
Scikit-LLM se destaca por una buena razón: actúa como un envoltorio fabuloso que hace que sea increíblemente fácil para los usuarios de scikit-learn (y también para aquellos nuevos en ambas bibliotecas) usar los LLM existentes para inferencia, sin la necesidad de una capacitación intensiva. La guinda del pastel: también permite utilizar LLM gratuitos y de código abierto sin límites de cuota. Y eso es precisamente lo que haremos: cargar, adaptar y aprovechar un LLM previamente capacitado para una tarea de clasificación de etiquetas múltiples donde a un fragmento de texto se le pueden asignar una o varias categorías.
Primero, importaremos las bibliotecas necesarias:
pip instala conjuntos de datos scikit-llm
pepita instalar scikit–llm conjuntos de datos
Usaremos un LLM gratuito de Groq, un recurso que proporciona LLM de inferencia rápida, así que asegúrese de registrarse en su sitio web y obtener una clave API aquí. Deberá copiar esta clave una vez creada (tenga en cuenta que solo se puede copiar una vez) y pegarla en el código siguiente:
from skllm.config import SKLLMConfig from skllm.models.gpt.classification.zero_shot import MultiLabelZeroShotGPTClassifier # 1. Configurar su clave API (use “any_string” si es local) SKLLMConfig.set_openai_key(“YOUR_FREE_API_KEY”) # 2. Configurar la URL del punto final personalizado SKLLMConfig.set_gpt_url(“https://api.groq.com/openai/v1/”) # 3. Inicializando el clasificador. # El prefijo “custom_url::” se utiliza para indicarle al módulo GPT que enrute a la URL especificada anteriormente. clf = MultiLabelZeroShotGPTClassifier(model=”custom_url::llama-3.3-70b-versatile”, max_labels=3)
de habilidad.configuración importar SKLLMConfig
de habilidad.modelos.gpto.clasificación.tiro_cero importar Clasificador MultiLabelZeroShotGPT
# 1. Configuración de su clave API (use “any_string” si es local)
SKLLMConfig.set_openai_key(“TU_LLAVE_API_GRATIS”)
# 2. Configurar la URL del punto final personalizado
SKLLMConfig.set_gpt_url(“https://api.groq.com/openai/v1/”)
# 3. Inicializando el clasificador.
# El prefijo “custom_url::” se utiliza para indicarle al módulo GPT que enrute a la URL especificada anteriormente.
clf = Clasificador MultiLabelZeroShotGPT(modelo=“custom_url::llama-3.3-70b-versátil”, etiquetas_max=3)
Observe que creamos una instancia específica de un objeto de la clase MultiLabelZeroShotGPTClassifier para alojar nuestro LLM previamente entrenado de Groq.
A continuación, importamos un conjunto de datos. Hugging Face tiene un excelente repositorio de conjuntos de datos para esto, y usaremos específicamente su conjunto de datos go_emotions, que es ideal para nuestra tarea; dependiendo del entorno de ejecución utilizado, es posible que se le solicite una clave API de Hugging Face (HF), pero obtener una es tan simple como registrarse en el sitio web de HF y crearla.
de conjuntos de datos importar load_dataset importar pandas como pd # 1. Nuevo espacio de nombres/nombre explícito para cumplir con las nuevas reglas de URI de HF en la biblioteca “datasets” dataset = load_dataset(“google-research-datasets/go_emotions”, split=”train[:100]”) df = dataset.to_pandas() # Extraer los comentarios de texto sin formato texts = df[‘text’].tolist() print(f”Comentarios {len(textos)} cargados.”) print(f”Muestra: ‘{textos[0]}'”)
de conjuntos de datos importar conjunto de datos de carga
importar pandas como PD
# 1. Nuevo espacio de nombres/nombre explícito para cumplir con las nuevas reglas de URI de HF en la biblioteca “conjuntos de datos”
conjunto de datos = conjunto de datos de carga(“conjuntos-de-datos-de-investigación-de-google/go_emotions”, dividir=“tren[:100]”)
df = conjunto de datos.to_pandas()
# Extraer los comentarios de texto sin formato
textos = df[‘text’].tolista()
imprimir(F“Se han cargado {len(textos)} comentarios”.)
imprimir(F“Muestra: ‘{textos[0]}'”)
Verá un resultado como este, que muestra una muestra del conjunto de datos cargado:
Cargado 100 comentarios. Ejemplo: “Mi comida favorita es cualquier cosa que no haya tenido que cocinar yo mismo”.
Cargado 100 comentarios.
Muestra: ‘Mi comida favorita es cualquier cosa que hice’t tener a cocinar mí mismo.‘
Para “entrenar” el LLM cargado, simplemente necesitamos indicar nuestro conjunto de etiquetas específico de dominio, y adaptará el modelo para clasificar instancias usando etiquetas de este conjunto. En particular, utilizaremos el siguiente conjunto de etiquetas:
etiquetas_candidato = [
“admiration”, “amusement”, “anger”, “annoyance”,
“approval”, “curiosity”, “disappointment”, “joy”,
“sadness”, “surprise”
]
etiquetas_candidatos = [
“admiration”, “amusement”, “anger”, “annoyance”,
“approval”, “curiosity”, “disappointment”, “joy”,
“sadness”, “surprise”
]
Realmente no realizamos un proceso de entrenamiento como tal: simplemente exponemos el modelo al conjunto de etiquetas que especificamos para crear una instancia del escenario del problema. He aquí cómo:
# Ajustar el modelo completamente desde cero pasando X como Ninguno para no tener entrenamiento real, # y proporcionando nuestras etiquetas como una lista anidada clf.fit(Ninguno, [candidate_labels])
# Ajustar el modelo completamente a cero pasando X como Ninguno para no realizar ningún entrenamiento real.
# y proporcionando nuestras etiquetas como una lista anidada
clf.adaptar(Ninguno, [candidate_labels])
Una vez que se hayan completado los pasos anteriores, estará casi listo para hacer algunas predicciones sobre algunos ejemplos de texto. Hagámoslo con cinco textos del conjunto de datos y mostremos algunos resultados:
# Ejecutar las predicciones en nuestros comentarios de Reddit predicciones = clf.predict(texts) # Mostrar los resultados para i en range(5): print(f”Comentario: {texts[i]}”) print(f”Sentimientos previstos: {predicciones[i]}”) imprimir(“-” * 50)
# Ejecuta las predicciones en nuestros comentarios de Reddit.
predicciones = clf.predecir(textos)
# Mostrar los resultados
para i en rango(5):
imprimir(F“Comentario: {textos[i]}”)
imprimir(F“Sentimientos previstos: {predicciones[i]}”)
imprimir(“-“ * 50)
Extracto del resultado: solo se muestran dos de las cinco predicciones:
100%|██████████| 100/100 [03:01<00:00, 1.82s/it]Comentario: Mi comida favorita es cualquier cosa que no tenga que cocinar yo mismo. Sentimientos previstos: [‘amusement’ ‘joy’ ”]————————————————– Comentario: Ahora, si se vuelve loco, todos pensarán que se está riendo jodiendo a la gente en lugar de estar realmente muerto. Sentimientos previstos: [‘anger’ ‘annoyance’ ‘surprise’]————————————————–
100%|██████████| 100/100 [03:01<00:00, 1.82s/it]Comentario: Mi favorito alimento es cualquier cosa I lo hizoNo tengo que cocinar yo mismo.
Sentimientos previstos: [‘amusement‘ ‘joy‘ ‘‘]
————————————————–
Comentario: Ahora, si se deshace de sí mismo, todos pensarán que es él mismo.s teniendo a reír atornillar con gente en cambio de de hecho muerto
Previsto Sentimientos: [‘anger’ ‘annoyance’ ‘surprise’]
—————————————————————————
Descargo de responsabilidad: el redactor y editor del artículo no se hacen responsables del contenido real del conjunto de datos de terceros que se utiliza ni del lenguaje utilizado en algunas de sus muestras.
Observe cómo se pueden asignar varias etiquetas a un solo texto como parte de la predicción.
Además, no entre en pánico si el proceso de predicción tarda un poco. Esto es normal, ya que el uso de estos LLM localmente es un proceso computacional intensivo. Por muy contradictorio que parezca, en el ejemplo anterior, la inferencia lleva mucho más tiempo que ajustar el modelo, porque no realizamos ningún entrenamiento real ni pasamos ningún conjunto de entrenamiento para fit(): simplemente pasamos el conjunto de etiquetas para definir nuestro escenario específico.
Concluyendo
Este artículo ilustró cómo llevar a cabo un proceso de clasificación de texto de múltiples etiquetas con scikit-LLM: una biblioteca que aprovecha las capacidades de los LLM previamente capacitados y permite su uso como si fueran modelos clásicos de aprendizaje automático basados en scikit-learn.
Como siguiente paso, podría experimentar expandiendo el conjunto de etiquetas candidatas para reflejar mejor el rango emocional completo de su dominio objetivo, o intercambiar un modelo diferente alojado en Groq para comparar el comportamiento de predicción. Si desea ir más allá, scikit-LLM también admite otras estrategias de clasificación de tiro cero y de pocos tiros: alimentar al clasificador con una pequeña cantidad de ejemplos etiquetados a veces puede agudizar notablemente sus predicciones sin requerir un proceso de capacitación completo. Finalmente, para los casos de uso de producción, vale la pena crear un ciclo de evaluación adecuado para medir la precisión y la recuperación a nivel de etiqueta en comparación con una muestra anotada reservada, de modo que tenga una idea concreta de dónde el modelo funciona bien y dónde tiene problemas.