Scikit-LLM 降低了大語言模型的應用門檻,讓不熟悉機器學習的使用者也能輕鬆進行文字分析。其零次學習能力尤其突出,即使缺乏標記資料也能執行分類任務。此外,Scikit-LLM 支援多標籤分類,更貼近真實世界的複雜文字資料。它也提供文字向量化功能,將文字轉換為數值向量,方便整合其他機器學習模型和演算法,例如 XGBoost 分類器,建構更全面的文字分析流程。
Scikit-LLM的功能
Scikit-LLM提供了多種功能,包括:
- 零次文字分類:這是一個強大的功能,允許您將文字分類為一組標籤,而無需在任何標記資料上訓練模型。
- 多標籤零次文字分類:這是一個更先進的零次文字分類版本,允許您同時將文字分類為多個標籤。
- 文字向量化:這是一個常見的文字預處理步驟,將文字轉換為固定維度的向量表示。這個表示可以用於其他機器學習任務,例如分類、聚類或迴歸。
- 文字翻譯:這允許您使用LLM將文字從一種語言翻譯成另一種語言。
- 文字摘要:這允許您將文字檔案摘要為更短、更簡潔的版本。
Scikit-LLM的實作
現在讓我們實作Scikit-LLM的一些功能。
首先,安裝Scikit-LLM和設定:
!pip install scikit-llm watermark
然後,載入Scikit-LLM和watermark:
%load_ext watermark
現在,您可以使用Scikit-LLM的功能了。例如,您可以使用零次文字分類功能:
from scikit_llm import ZeroShotTextClassifier
classifier = ZeroShotTextClassifier()
labels = classifier.predict("這是一個測試文字")
print(labels)
這個例子展示瞭如何使用Scikit-LLM的零次文字分類功能將文字分類為一組標籤。您可以使用其他功能,例如多標籤零次文字分類、文字向量化、文字翻譯和文字摘要,來執行其他任務。
文字分類的新時代:Zero-Shot GPTClassifier
在自然語言處理的領域中,文字分類是一項基本任務,旨在將文字歸類為特定的類別。傳統的方法需要大量的訓練資料和複雜的模型,但是隨著ChatGPT的出現,情況發生了變化。ChatGPT可以在沒有特定訓練的情況下進行文字分類,僅憑藉描述性標籤就能完成這項任務。
取得OpenAI API Key
要使用Scikit-LLM,需要先獲得OpenAI API Key。這個Key是使用Scikit-LLM的必要條件,因為它需要與OpenAI的模型進行互動。獲得Key後,可以使用以下程式碼設定OpenAI API Key和組織ID:
# 匯入SKLLMConfig來組態OpenAI API
from skllm import SKLLMConfig
# 設定OpenAI API Key
OPENAI_API_KEY = "sk-****"
OPENAI_ORG_ID = "org-****"
# 設定OpenAI API Key
SKLLMConfig.set_openai_key(OPENAI_API_KEY)
# 設定OpenAI組織
SKLLMConfig.set_openai_org(OPENAI_ORG_ID)
Zero-Shot GPTClassifier
Zero-Shot GPTClassifier是Scikit-LLM的一個功能,允許使用者建立文字分類模型,而無需進行傳統的訓練。這個工具利用ChatGPT的能力,根據描述性標籤對文字進行分類。
# 匯入ZeroShotGPTClassifier模組和分類資料集
from skllm import ZeroShotGPTClassifier
from skllm.datasets import get_classification_dataset
# 載入情感分析資料集
X, y = get_classification_dataset()
# 列印X變數
print(X)
# 列印y變數
print(y)
# 將資料分割為訓練集和測試集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
訓練模型
現在,可以使用Zero-Shot GPTClassifier進行模型訓練。
# 訓練模型
from skllm import ZeroShotGPTClassifier
# 建立Zero-Shot GPTClassifier例項
classifier = ZeroShotGPTClassifier()
# 訓練模型
classifier.fit(X_train, y_train)
# 評估模型
accuracy = classifier.score(X_test, y_test)
print("模型準確度:", accuracy)
這樣,就完成了使用Zero-Shot GPTClassifier進行文字分類的過程。這個工具簡化了文字分類的流程,無需進行傳統的訓練,直接利用ChatGPT的能力對文字進行分類。
資料集分割
在進行機器學習任務時,資料集的分割是一個重要的步驟。這裡介紹兩個函式,分別用於分割訓練資料和測試資料。
訓練資料分割
def training_data(data):
"""
分割資料集以取得訓練資料。
引數:
data (list): 原始資料集
回傳:
combined_data (list): 分割後的訓練資料
"""
# 取得前8個元素(索引0-7)
subset_1 = data[:8]
# 取得接下來8個元素(索引10-17)
subset_2 = data[10:18]
# 取得剩餘資料的前8個元素(索引20-27)
subset_3 = data[20:28]
# 合併分割的資料
combined_data = subset_1 + subset_2 + subset_3
return combined_data
測試資料分割
def testing_data(data):
"""
分割資料集以取得測試資料。
引數:
data (list): 原始資料集
回傳:
combined_data (list): 分割後的測試資料
"""
# 取得最後2個元素(索引8-9)
subset_1 = data[8:10]
# 取得接下來的最後2個元素(索引18-19)
subset_2 = data[18:20]
# 取得剩餘資料的最後2個元素(索引28-29)
subset_3 = data[28:30]
# 合併分割的資料
combined_data = subset_1 + subset_2 + subset_3
return combined_data
內容解密:
這兩個函式的主要目的是將原始資料集分割成訓練資料和測試資料。訓練資料用於模型的訓練,而測試資料則用於評估模型的效能。這種分割方式可以幫助我們評估模型在未見資料上的泛化能力。
圖表翻譯:
flowchart TD A[原始資料集] --> B[訓練資料分割] B --> C[測試資料分割] C --> D[模型訓練] D --> E[模型評估]
這個流程圖展示了資料集分割的過程以及如何使用分割後的資料進行模型訓練和評估。
定義訓練資料
def training_data(data):
# 將資料分割為訓練集和測試集
subset_1 = data[:100]
subset_2 = data[100:200]
subset_3 = data[200:]
combined_data = subset_1 + subset_2 + subset_3
return combined_data
# 使用 X 和 y 變數作為 training_data 函式的引數
X_train = training_data(X)
print(len(X_train))
print(X_train)
y_train = training_data(y)
print(len(y_train))
print(y_train)
定義測試資料
def testing_data(data):
# 將資料分割為測試集
subset = data[300:]
return subset
# 使用 X 和 y 變數作為 testing_data 函式的引數
X_test = testing_data(X)
print(len(X_test))
print(X_test)
y_test = testing_data(y)
print(len(y_test))
print(y_test)
定義和訓練 OpenAI 模型
# 定義 OpenAI 模型
from zeroshot import ZeroShotGPTClassifier
clf = ZeroShotGPTClassifier(openai_model="gpt-3.5-turbo")
# 訓練模型
# clf.fit(X_train, y_train)
內容解密:
上述程式碼定義了兩個函式,training_data
和 testing_data
,用於將資料分割為訓練集和測試集。然後,使用這些函式來分割 X 和 y 變數,並列印預出結果。最後,定義了一個 OpenAI 模型,準備進行模型訓練。
圖表翻譯:
graph LR A[資料] -->|分割|> B[訓練集] A -->|分割|> C[測試集] B -->|訓練|> D[模型] C -->|評估|> D
此圖表展示了資料分割、模型訓練和評估的流程。首先,資料被分割為訓練集和測試集。然後,使用訓練集來訓練模型,並使用測試集來評估模型的效能。
自然語言處理中的情感分析
情感分析是一種自然語言處理(NLP)技術,旨在判斷文字的正面或負面情感傾向。以下是使用 Scikit-learn 和 Transformers 進行情感分析的示例。
資料準備
首先,我們需要準備好訓練資料和測試資料。這些資料應該包含文字和對應的標籤(正面、負面或中立)。
from sklearn.model_selection import train_test_split
import pandas as pd
# 載入資料
data = pd.read_csv("sentiment_data.csv")
# 切分訓練資料和測試資料
X_train, X_test, y_train, y_test = train_test_split(data["text"], data["label"], test_size=0.2, random_state=42)
模型訓練
接下來,我們可以使用 Scikit-learn 的 clf
類別進行模型訓練。
from sklearn.naive_bayes import MultinomialNB
# 定義模型
clf = MultinomialNB()
# 訓練模型
clf.fit(X_train, y_train)
預測和評估
然後,我們可以使用訓練好的模型進行預測和評估。
# 預測測試資料
predicted_labels = clf.predict(X_test)
# 評估模型
from sklearn.metrics import accuracy_score
print(f"準確度:{accuracy_score(y_test, predicted_labels):.2f}")
無標籤資料的情況
如果沒有預先標籤的資料,可以使用 Zero-Shot GPT 分類器進行預測。
from transformers import pipeline
# 定義模型
clf_no_label = pipeline("zero-shot-classification")
# 定義候選標籤
candidate_labels = ["正面", "負面", "中立"]
# 預測測試資料
predicted_labels_without_training_data = clf_no_label(X_test, candidate_labels)
多標籤零次學習文字分類
多標籤零次學習文字分類是一種複雜的任務,但其實際實作相對較為直接。以下是使用 Scikit-LLM 進行多標籤零次學習文字分類的步驟:
步驟 1:匯入必要的模組
from skllm import MultiLabelZeroShotGPTClassifier
from skllm.datasets import get_multilabel_classification_dataset
步驟 2:載入資料集
X, y = get_multilabel_classification_dataset()
步驟 3:定義模型
clf = MultiLabelZeroShotGPTClassifier(max_labels=3)
在這裡,我們定義了一個 MultiLabelZeroShotGPTClassifier
例項,指定了最大標籤數為 3。
步驟 4:訓練模型
clf.fit(X, y)
步驟 5:進行預測
labels = clf.predict(X)
這裡,我們使用訓練好的模型進行預測,並將結果儲存在 labels
變數中。
內容解密:
上述程式碼展示瞭如何使用 Scikit-LLM 進行多標籤零次學習文字分類。MultiLabelZeroShotGPTClassifier
類別允許我們指定最大標籤數,這使得模型可以為每個樣本分配多個標籤。這種方法在實際應用中非常有用,特別是在文字分類任務中,單個文字可能屬於多個類別。
圖表翻譯:
flowchart TD A[載入資料集] --> B[定義模型] B --> C[訓練模型] C --> D[進行預測] D --> E[輸出結果]
上述流程圖展示了多標籤零次學習文字分類的步驟。從載入資料集開始,到定義模型、訓練模型、進行預測,最終輸出結果。這個過程使得我們可以使用 Scikit-LLM 進行多標籤零次學習文字分類任務。
文字分類與向量化技術
在自然語言處理(NLP)領域中,文字分類是一項重要的任務,涉及將文字分配到預先定義的類別中。然而,在某些情況下,我們可能面臨著缺乏標記資料的挑戰。在這種情況下,Zero-Shot學習方法可以提供幫助。下面,我們將探討如何使用MultiLabelZeroShotGPTClassifier進行多標籤分類,以及文字向量化的重要性。
多標籤分類
在多標籤分類中,一個文字樣本可以被分配多個標籤。為了實作這一點,MultiLabelZeroShotGPTClassifier提供了一個max_labels
引數,控制模型在分類過程中可以為每個文字樣本分配的標籤數量。
實作多標籤分類
即使沒有標記資料,MultiLabelZeroShotGPTClassifier仍然可以有效地進行訓練。訓練過程中,需要提供候選標籤列表,每個內部列表包含特定文字樣本的候選標籤。以下是實作多標籤分類的示例:
# 載入必要的模組
from skllm.datasets import get_multilabel_classification_dataset
from skllm import MultiLabelZeroShotGPTClassifier
# 載入資料集
X, _ = get_multilabel_classification_dataset()
# 定義候選標籤
candidate_labels = [
"品質",
"價格",
"交付",
"服務",
"產品多樣性"
]
# 建立模型
clf = MultiLabelZeroShotGPTClassifier(max_labels=3)
# 訓練模型(僅使用候選標籤)
clf.fit(None, [candidate_labels])
# 預測資料
labels = clf.predict(X)
文字向量化
文字向量化是將文字資訊轉換為數值格式的過程,使得機器可以理解和分析文字。GPTVectorizer是Scikit-LLM框架中的一個有用工具,負責將文字轉換為固定大小的數值集合,即向量。這種轉換使得機器學習模型可以更高效地處理和理解文字資料。
實作文字向量化
以下是使用GPTVectorizer進行文字向量化的示例:
# 載入GPTVectorizer類
from skllm.preprocessing import GPTVectorizer
# 建立GPTVectorizer例項
vectorizer = GPTVectorizer()
# 將文字轉換為向量
vectors = vectorizer.fit_transform(X)
透過這些技術, мы 可以更好地處理和分析文字資料,實作高效的文字分類和向量化。
文字向量化與分類任務
在自然語言處理(NLP)任務中,文字向量化是一個至關重要的步驟,旨在將文字轉換為機器學習模型可以理解的數值向量。為了實作這一目標,我們可以使用 GPTVectorizer
類別,它可以將文字轉換為固定維度的向量。
文字向量化過程
首先,我們需要建立一個 GPTVectorizer
例項,並將其指定給變數 model
。然後,我們可以使用 fit_transform
方法將輸入文字 X
轉換為向量。這個過程不僅適應模型到資料上,也將文字轉換為固定維度的向量,儲存於變數 vectors
中。
# 建立 GPTVectorizer 例項
model = GPTVectorizer()
# 將輸入文字 X 轉換為向量
vectors = model.fit_transform(X)
整合 XGBoost 分類器
為了將文字向量化與分類任務結合起來,我們可以使用 scikit-learn 的管道(Pipeline)機制。這允許我們順暢地預處理文字並執行分類任務。首先,我們需要匯入必要的模組和類別,包括 Pipeline
、LabelEncoder
和 XGBClassifier
。
# 匯入必要的模組和類別
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelEncoder
from xgboost import XGBClassifier
標籤編碼
在進行分類任務之前,我們需要對訓練和測試標籤進行編碼。這可以使用 LabelEncoder
類別實作。
# 建立 LabelEncoder 例項
le = LabelEncoder()
# 對訓練標籤 y_train 進行編碼
y_train_encoded = le.fit_transform(y_train)
# 對測試標籤 y_test 進行編碼
y_test_encoded = le.transform(y_test)
定義管道步驟
接下來,我們需要定義管道的步驟。這包括使用 GPTVectorizer
對文字進行向量化,以及使用 XGBClassifier
進行分類。
# 定義管道步驟
steps = [('GPT', GPTVectorizer()), ('Clf', XGBClassifier())]
建立管道
然後,我們可以建立一個管道例項,並傳入定義的步驟。
# 建立管道
clf = Pipeline(steps)
訓練管道模型
最後,我們可以使用訓練資料 X_train
和編碼後的訓練標籤 y_train_encoded
對管道模型進行訓練。
# 訓練管道模型
clf.fit(X_train, y_train_encoded)
這樣,我們就成功地將文字向量化與分類任務結合起來,實作了一個順暢的文字分類流程。
文字摘要技術在 Scikit-LLM 中的應用
Scikit-LLM 中的 GPTSummarizer 模組是根據 GPT 的文字摘要技術,能夠高效地生成文字的摘要。這個模組可以在兩種不同的方式下使用:
- 獨立摘要:您可以使用 GPTSummarizer 來生成文字的摘要,從而更容易地掌握長篇檔案的主要內容。
- 預處理步驟:或者,您可以將 GPTSummarizer 整合到更廣泛的工作流程中,作為其他操作之前的預處理步驟。例如,您可以使用它來減少文字資料的大小同時保留重要資訊,從而使得文字資料的處理更加高效而不損害內容的品質和相關性。
實作
# 從 skllm.preprocessing 中匯入 GPTSummarizer 類
from skllm.preprocessing import GPTSummarizer
# 從 skllm.datasets 中匯入 get_summarization_dataset 函式
from skllm.datasets import get_summarization_dataset
# 呼叫 get_summarization_dataset 函式
X = get_summarization_dataset()
# 建立 GPTSummarizer 例項,指定 openai_model 和 max_words 引數
s = GPTSummarizer(openai_model='gpt-3.5-turbo', max_words=15)
# 將 GPTSummarizer 例項應用於輸入資料 X,生成摘要
summaries = s.fit_transform(X)
需要注意的是,max_words
超引數作為生成摘要的字數限制是一個靈活的,而不是嚴格執行的限制。這意味著在實際生成的摘要中,可能會出現超過指定字數的情況。這個特性在實際應用中需要被考慮,以確保生成的摘要既能夠涵蓋重要資訊,又能夠保持在合理的長度範圍內。
結合其他技術
GPTSummarizer 可以與其他自然語言處理技術結合使用,以提高文字摘要的品質和效率。例如,可以使用 Named Entity Recognition (NER) 技術來識別文字中的實體,並將這些實體納入摘要中,以提供更多的上下文資訊。
此外,GPTSummarizer 也可以被用作其他機器學習模型的預處理步驟,為下游任務提供高品質的輸入資料。這種方法可以提高整個管道的效能和效率。
未來發展
隨著自然語言處理技術的不斷進步,文字摘要技術也將繼續演進。未來,GPTSummarizer 可能會整合更多先進的技術,如多工學習和圖神經網路,以提高其效能和適用性。此外,對於不同語言和不同領域的文字摘要,也將是未來研究和開發的重點。
Scikit-LLM簡介
Scikit-LLM是一個開源專案,旨在提供一個簡單且易於使用的API,讓使用者可以輕鬆地使用大語言模型(LLM)進行文字分析。它提供了一系列的功能,包括零次文字分類、多標籤零次文字分類、文字向量化、文字翻譯和文字摘要。
Scikit-LLM的優點
Scikit-LLM的優點包括:
- 易於使用:Scikit-LLM提供了一個簡單且直觀的API,讓使用者可以輕鬆地使用LLM進行文字分析,即使對LLM或機器學習不熟悉。
- 不需要預先標記的資料:Scikit-LLM可以在沒有預先標記的資料的情況下使用,這使得它成為一個非常有用的工具,尤其是在文字分析任務中。
- 可以與其他機器學習演算法結合:Scikit-LLM可以與scikit-learn管道結合,讓使用者可以輕鬆地將LLM與其他機器學習演算法結合起來,從而實作更複雜的文字分析任務。
Scikit-LLM的應用
Scikit-LLM可以用於多種文字分析任務,包括:
- 客戶反饋分類:Scikit-LLM可以用於將客戶反饋分類為不同的類別,例如正面、負面或中立。
- 新聞文章分類:Scikit-LLM可以用於將新聞文章分類為不同的主題,例如政治、商業或體育。
- 文字翻譯:Scikit-LLM可以用於將文字從一種語言翻譯為另一種語言。
- 文字摘要:Scikit-LLM可以用於將長篇文字摘要為短篇文字。
從技術架構視角來看,Scikit-LLM 巧妙地將大語言模型(LLM)的能力封裝成易於使用的 API,降低了 NLP 應用開發的門檻。其零次學習能力尤其突出,允許多標籤分類和文字向量化等任務在缺乏標記資料的情況下進行,極大地拓展了應用場景。然而,目前 LLM 的 token 限制和運算成本仍然是需要考量的因素,尤其在處理長文字和大量資料時。Scikit-LLM 與 XGBoost 等傳統機器學習模型的整合,以及與Pipeline機制的相容,為更複雜的 NLP 任務提供了可行的解決方案。展望未來,隨著 LLM 技術的持續發展和 API 的不斷完善,預計 Scikit-LLM 將在更多領域展現其應用價值,例如結合知識圖譜增強文字理解和推理能力,以及針對特定領域的模型微調和最佳化。對於追求快速開發和佈署 NLP 應用,同時希望降低技術門檻的團隊而言,Scikit-LLM 是一個值得關注和嘗試的工具。