Neste artigo, você aprenderá como usar o recurso de resumo de texto do scikit-LLM para lidar com grandes volumes de texto em pipelines de aprendizado de máquina.
Os tópicos que cobriremos incluem:
- Como construir um transformador personalizado compatível com scikit-learn que envolve um modelo de resumo Hugging Face.
- Como integrar o resumo de texto baseado em LLM em um pipeline scikit-learn para pré-processamento de dados.
- Como encadear o resumo, a vetorização TF-IDF e um classificador em um único pipeline de ponta a ponta.

Resumo de texto com Scikit-LLM
Imagem por Editor
Introdução
Em um postagem anteriorapresentamos scikit-LLMuma biblioteca que preenche a lacuna entre os modelos tradicionais de aprendizado de máquina e os modelos modernos de grandes linguagens (LLMs). Em explicit, mostramos como implementar casos de uso de classificação zero-shot e poucos-shot com scikit-LLM.
Agora, tentamos responder à pergunta: E se nosso caso de uso de aprendizado de máquina downstream for prejudicado por grandes quantidades de texto? Para enfrentar esse desafio, exploraremos e usaremos resumidores: outro recurso poderoso desta biblioteca que destila textos longos em resumos sucintos. Vamos ver como, implementando um pipeline de preparação de dados que incorpore esse processo!
Configuração inicial
A primeira etapa é certificar-se de que o scikit-LLM está instalado – substitua “pip” por “!pip” se estiver trabalhando em um ambiente de pocket book em nuvem:
Observe que, por padrão, o scikit-LLM recorre a modelos de linguagem OpenAI, cuja execução repetida pode ser cara ou cujo número de usos pode ser muito limitado em uma conta OpenAI gratuita. Como alternativa, você pode usar modelos pré-treinados gratuitos do Hugging Face para resumo, como sshleifer/distilbart-cnn-12-6. Nesse caso, certifique-se de instalar também a biblioteca Transformers do Hugging Face, para poder carregar modelos do Hugging Face em seu programa.
pip instalar transformadores == 4.37.2
pip instalar transformadores==4.37.2 |
Pipeline de resumo de texto baseado em LLM
A definição de classe a seguir abrange a lógica para carregar um modelo pré-treinado (match()) e aplicar inferência sobre ele, ou seja, resumir os textos de entrada (rework()):
de sklearn.base importar BaseEstimator, TransformerMixin de transformadores importar pipeline importar classe tocha HuggingFaceSummarizer (BaseEstimator, TransformerMixin): def __init__ (self, model_name = “sshleifer/distilbart-cnn-12-6”, max_length = 40, min_length = 10): self.model_name = model_name self.max_length = max_length self.min_length = min_length self.summarizer = None self.gadget = 0 if torch.cuda.is_available() else -1 def match(self, X, y=None): # O método match() deve apenas carregar um modelo pré-treinado na memória # gadget=0 tem como alvo a GPU livre se você estiver usando um pocket book Colab/Kaggle. se self.summarizer for None: self.summarizer = pipeline(“summarization”, mannequin=self.model_name, gadget=self.gadget) return self def rework(self, X): # Certifique-se de que o modelo esteja carregado se self.summarizer for None: self.summarizer = pipeline(“summarization”, mannequin=self.model_name, gadget=self.gadget) # Processe textos e extraia strings de resumo outcomes = self.summarizer( X, max_length=self.max_length, min_length=self.min_length, truncation=True ) return (res(‘summary_text’) para res nos resultados)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | de aprender.base importar BaseEstimator, TransformadorMixin de transformadores importar gasoduto importar tocha aula AbraçandoFaceSummarizer(BaseEstimator, TransformadorMixin): definitivamente __iniciar__(auto, nome_modelo=“sshleifer/distilbart-cnn-12-6”, comprimento máximo=40, comprimento_min=10): auto.nome_modelo = nome_modelo auto.comprimento máximo = comprimento máximo auto.comprimento_min = comprimento_min auto.resumidor = Nenhum auto.dispositivo = 0 se tocha.cuda.está_disponível() outro –1 definitivamente ajustar(auto, X, sim=Nenhum): # O método match() deve apenas carregar um modelo pré-treinado na memória # gadget=0 tem como alvo a GPU gratuita se você estiver usando um pocket book Colab/Kaggle. se auto.resumidor é Nenhum: auto.resumidor = gasoduto(“resumo”, modelo=auto.nome_modelo, dispositivo=auto.dispositivo) retornar auto definitivamente transformar(auto, X): # Certifique-se de que o modelo esteja carregado se auto.resumidor é Nenhum: auto.resumidor = gasoduto(“resumo”, modelo=auto.nome_modelo, dispositivo=auto.dispositivo) # Processa textos e extrai strings de resumo resultados = auto.resumidor( X, comprimento máximo=auto.comprimento máximo, comprimento_min=auto.comprimento_min, truncamento=Verdadeiro ) retornar (resolução(‘resumo_texto’) para resolução em resultados) |
É importante ressaltar que a classe que definimos herda de lessons de transformadores personalizados: uma etapa necessária para garantir que os modelos Hugging Face se integrem perfeitamente com scikit-aprender ferramentas de pré-processamento e modelagem.
Para simplificar, digamos que resumiremos apenas duas revisões de texto que fazem parte de um conjunto de dados maior para classificação de texto. Os dois textos “longos” (recursos) e os sentimentos das avaliações (rótulos) poderiam ser assim:
X_long_texts = ( “Estou usando este aspirador há cerca de três semanas. No início, tive dificuldades com os acessórios e o handbook não period muito claro. No entanto, depois que descobri como funciona a escova motorizada, ela facilmente pegou todos os pelos de animais de estimação dos meus tapetes. No geral, é uma máquina sólida, embora um pouco pesada para carregar pelas escadas.”, “A entrega atrasou quatro dias, o que foi incrivelmente frustrante porque eu precisava dela para uma viagem de fim de semana. Quando a mochila finalmente chegou, o zíper prendeu imediatamente. Tentei consertar, mas o tecido parece barato e frágil. Com certeza irei devolver e pedir o reembolso complete.”, ) y_labels = (“positivo”, “negativo”).
Textos_longos = ( “Estou usando este aspirador há cerca de três semanas. No início, tive dificuldade com os acessórios e o handbook não period muito claro. No entanto, depois que descobri como funciona a escova motorizada, ela pegou facilmente todos os pêlos de animais de estimação dos meus tapetes. No geral, é uma máquina sólida, embora um pouco pesada para carregar escadas acima.”, “A entrega atrasou quatro dias, o que foi extremamente frustrante porque eu precisava dela para uma viagem de fim de semana. Quando a mochila finalmente chegou, o zíper prendeu imediatamente., ) y_labels = (“positivo”, “negativo”) |
A verdadeira magia acontece a seguir. Definimos um pipeline que reúne nosso pré-processamento de dados – ou seja, resumo orientado por LLM – e o treinamento de um classificador. Em um cenário actual, você precisará de muito mais do que dois exemplos de treinamento para construir um classificador adequado, é claro, mas o objetivo aqui é ilustrar como o resumo de texto pode reduzir a dimensionalidade dos dados de texto:
from sklearn.pipeline import Pipeline from sklearn.feature_extraction.textual content import TfidfVectorizer from sklearn.linear_model import LogisticRegression # 1. Defina o Pipeline # Nomear a variável ‘classification_pipeline’ evita possíveis conflitos com transformers.pipeline perform rating_pipeline = Pipeline(( (‘summarizer’, HuggingFaceSummarizer(max_length=30, min_length=10)), (‘vectorizer’, TfidfVectorizer()), # Usado para codificar representações numéricas de texto, necessárias para ML (‘classifier’, LogisticRegression()) ))
de aprender.gasoduto importar Gasoduto de aprender.feature_extraction.texto importar Vetorizador Tfidf de aprender.modelo_linear importar Regressão Logística Nº 1. Defina o pipeline # Nomear a variável ‘classification_pipeline’ evita possíveis conflitos com a função transformers.pipeline classificação_pipeline = Gasoduto(( (‘resumidor’, AbraçandoFaceSummarizer(comprimento máximo=30, comprimento_min=10)), (‘vetorizador’, Vetorizador Tfidf()), # Usado para codificar representações numéricas de texto, necessárias para ML (‘classificador’, Regressão Logística()) )) |
Depois que o pipeline for definido, veja como executá-lo:
# 2. Treine o Pipeline # Isso baixa o modelo, resume os textos longos na GPU, # vetoriza os resumos curtos e treina um classificador. rating_pipeline.match(X_long_texts, y_labels) print(“Pipeline treinado com sucesso em revisões resumidas!”)
# 2. Treine o pipeline # Isso baixa o modelo, resume os textos longos na GPU, # vetoriza os breves resumos e treina um classificador. classificação_pipeline.ajustar(Textos_longos, y_labels) imprimir(“Pipeline treinado com sucesso em análises resumidas!”) |
Isso é tudo! Tente adaptar o código acima a um conjunto de dados de texto rotulado actual para classificação de sentimento binário e veja como funciona na prática.
Antes de encerrarmos, se você estiver curioso para saber como são os textos resumidos, você pode inspecionar a saída diretamente:
(“No geral, é uma máquina sólida, embora um pouco pesada para subir escadas. No início, tive dificuldades com os acessórios”, ‘A entrega atrasou quatro dias, o que foi incrivelmente frustrante. O zíper prendeu imediatamente. O tecido parece barato e frágil.’)
(“No geral, é uma máquina sólida, embora um pouco pesada para subir escadas. No início, tive dificuldades com os acessórios.”, ‘A entrega atrasou quatro dias, o que foi extremamente frustrante. O zíper prendeu imediatamente. O tecido parece barato e frágil.) |
Os resumos estão, obviamente, longe da qualidade que você obteria no ChatGPT ou no Google Gemini – afinal, o modelo que usamos é um modelo pré-treinado, leve e gratuito. Dito isto, escolher modelos mais potentes certamente trará melhores resultados.
Resumo
Preenchemos a lacuna entre a modelagem clássica de aprendizado de máquina e o processamento avançado de texto por meio de grandes modelos de linguagem pré-treinados, graças ao scikit-LLM: uma biblioteca que aproveita o melhor dos dois mundos.