Scikit-LLMを使ったテキスト要約
本記事では、Scikit-LLMライブラリのテキスト要約機能を使用して、機械学習パイプラインで大量のテキストを処理する方法を紹介します。カスタムトランスフォーマーでHugging Faceの事前学習済み要約モデルを統合し、scikit-learnパイプラインに組み込んで、長文から分類までのエンドツーエンドのフローを実現します。
記事インテリジェンス
要点
- Scikit-LLMは従来の機械学習と大規模言語モデルを橋渡しし、ゼロショット/少数ショット分類やテキスト要約を提供します。
- カスタムHuggingFaceSummarizerクラスはBaseEstimatorとTransformerMixinを継承し、事前学習済み要約モデルをロードして要約を生成します。
- パイプラインでは、要約、TF-IDFベクトル化、ロジスティック回帰分類器を直列に連結し、データ前処理とモデル学習を一体化します。
- 例では軽量モデルdistilbart-cnn-12-6を使用していますが、より強力なモデルに置き換えることが可能です。
重要な理由
このニュースが重要なのは、Scikit-LLMは従来の機械学習と大規模言語モデルを橋渡しし、ゼロショット/少数ショット分類やテキスト要約を提供しますためです。
技術的影響
モデル選定、推論コスト、プロダクト能力、評価基準に影響する可能性があります。
Scikit-LLMを使ったテキスト要約
以前の記事で、従来の機械学習モデルと大規模言語モデル(LLM)のギャップを埋めるライブラリ「Scikit-LLM」を紹介し、ゼロショットおよび少数ショット分類の実装方法を説明しました。今回は、もう一つの強力な機能であるテキスト要約に焦点を当てます。下流タスクが大量のテキストデータに妨げられている場合、要約は長文を簡潔に圧縮し、処理効率を向上させます。本記事では、要約ステップを含むデータ準備パイプラインの構築方法を解説します。
初期設定
まず、Scikit-LLMをインストールします(クラウドノートブック環境の場合はpipを!pipに置き換えてください):
pip install scikit-llmデフォルトではScikit-LLMはOpenAIモデルを使用しますが、コストがかかる場合があります。代わりに、Hugging Faceの無料事前学習済み要約モデル(例:sshleifer/distilbart-cnn-12-6)を使用できます。その場合、Transformersライブラリもインストールする必要があります:
pip install transformers==4.37.2カスタム要約トランスフォーマー
以下のクラス定義は、事前学習済みモデルをロード(fit)し、推論(transform)を適用するロジックをカプセル化します:
from sklearn.base import BaseEstimator, TransformerMixin
from transformers import pipeline
import torch
class 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.device = 0 if torch.cuda.is_available() else -1
def fit(self, X, y=None):
if self.summarizer is None:
self.summarizer = pipeline("summarization", model=self.model_name, device=self.device)
return self
def transform(self, X):
if self.summarizer is None:
self.summarizer = pipeline("summarization", model=self.model_name, device=self.device)
results = self.summarizer(X, max_length=self.max_length, min_length=self.min_length, truncation=True)
return [res['summary_text'] for res in results]このクラスはscikit-learnのカスタムトランスフォーマーベースクラスを継承しており、パイプラインとのシームレスな統合を保証します。fitメソッドはモデルをロードするだけで、transformメソッドは入力テキストリストに対して要約を生成します。
エンドツーエンドパイプラインの構築
2つの長文テキストとその感情ラベルがあるとします:
X_long_texts = [
"I've been using this vacuum cleaner for about three weeks now. At first, I struggled with the attachments, and the manual wasn't very clear. However, once I figured out how the motorized brush works, it easily picked up all the pet hair on my rugs. Overall, it's a solid machine, though a bit heavy to carry up the stairs.",
"The delivery was delayed by four days, which was incredibly frustrating because I needed it for a weekend trip. When the backpack finally arrived, the zipper snagged immediately. I tried to fix it, but the fabric feels cheap and flimsy. I will definitely be returning this and asking for a full refund."
]
y_labels = ["positive", "negative"]次に、要約、TF-IDFベクトル化、ロジスティック回帰分類器を連結するパイプラインを作成します:
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
classification_pipeline = Pipeline([
('summarizer', HuggingFaceSummarizer(max_length=30, min_length=10)),
('vectorizer', TfidfVectorizer()),
('classifier', LogisticRegression())
])パイプラインを訓練します:
classification_pipeline.fit(X_long_texts, y_labels)
print("Pipeline trained successfully on summarized reviews!")訓練中、パイプラインは自動的に要約モデルをダウンロードし、長文を要約し、要約をベクトル化し、分類器を訓練します。生成された要約を確認します:
['Overall, it\'s a solid machine, though a bit heavy to carry up the stairs. At first, I struggled with the attachments,', 'The delivery was delayed by four days, which was incredibly frustrating. The zipper snagged immediately. The fabric feels cheap and flimsy.']この例で使用した軽量モデルdistilbart-cnn-12-6の要約品質は限られていますが、より強力なモデル(OpenAIのGPTシリーズなど)に簡単に置き換えることで、より良い結果が得られます。
まとめ
Scikit-LLMを活用することで、LLM駆動のテキスト要約を従来のscikit-learnワークフローにシームレスに統合できます。このアプローチは、重要な情報を保持しながらテキストの次元を大幅に削減し、下流の機械学習タスクの効率を向上させます。上記のコードを実際の感情分類データセットに適用し、LLMと従来の機械学習の融合を体験してみてください。