对于文本分类来说,数据标注是一项耗时且昂贵的工作。在训练数据集较小的情况下,使用预训练的ChatGPT模型可能比从头开始训练分类器或微调现有模型在测试集上实现更高的分类准确度。此外,ChatGPT可以帮助标注数据,以用于微调文本分类模型。
在本文中,我展示了两个实验。首先,我使用ChatGPT对文本数据进行预测,并将结果与测试集进行比较。接下来,我使用ChatGPT对文本数据进行标注,并利用标注数据来训练一个机器学习模型。研究结果显示,直接使用ChatGPT预测文本标签优于先进行数据标注,然后再进行模型训练。这些实验突显了在数据标注和文本分类任务中使用ChatGPT的实际好处。
首先,我将使用一个基本的机器学习模型对文本进行分类。这将为我们提供后续比较结果的起点。在实验的下一部分中,我们将使用ChatGPT对数据进行标注,并看看它与基线的性能相比如何。通过这种方式,我们可以找出ChatGPT是否有助于改善分类结果。
我们将使用带有标记电影评论的IMDB数据集来训练文本分类模型。数据集包含正面和负面的电影评论。我们将使用随机森林模型和TF-IDF特征将文本数据转换为数值表示。通过将数据集分为训练集和测试集,我们可以使用准确度分数来评估模型的性能,作为情感预测的度量标准。
以下是用于训练IMDB电影评论情感分类模型的代码。
# 导入必要的库
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 从CSV文件加载IMDb数据集并显示前几行
dataset = pd.read_csv(r"D:\Datasets\IMDB Dataset.csv")
dataset.head()
# 保留数据集中的前300行以供实验使用
dataset = dataset.head(300)
# 将数据集拆分为训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(dataset['review'],
dataset['sentiment'],
test_size=0.2,
random_state=42)
# 创建TF-IDF向量化器
vectorizer = TfidfVectorizer()
X_train_tfidf = vectorizer.fit_transform(X_train)
# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators = 500)
rf_model.fit(X_train_tfidf, y_train)
# 使用相同的向量化器转换测试数据
X_test_tfidf = vectorizer.transform(X_test)
# 预测测试数据上的情感
y_pred = rf_model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, y_pred)
print("准确度:", accuracy)
在240条记录上训练了一个基本的随机森林分类器模型,测试集上的准确度为0.65%。
现在,让我们使用ChatGPT直接对测试集进行预测,看看我们能够达到什么样的性能。
我们将通过从环境变量“OPENAI_KEY2”中检索API密钥并将其分配给“openai.api_key”变量来访问OpenAI API。
import os
import openai
api_key = os.getenv('OPENAI_KEY2')
openai.api_key = api_key
print(api_key)
接下来,我们定义一个名为find_sentiment(review)
的函数,该函数使用OpenAI GPT-3.5 Turbo语言模型来确定给定IMDB电影评论中表达的情感。在幕后,ChatGPT使用GPT-3.5 Turbo语言模型。
import time
def find_sentiment(review):
content = """以下是IMDB电影评论中表达的情感是什么?
从正面或负面中选择情感值。仅返回情感值。
电影评论:{}""".format(review)
sentiment = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
temperature = 0,
messages=[
{"role": "user", "content": content}
]
)
return sentiment["choices"][0]["message"]["content"]
find_sentiment(review)
函数将评论作为输入,并提示模型提供情感值,情感值应该是"positive"(正面)或"negative"(负面)。通过使用OpenAI ChatCompletion API,我们与语言模型交互以从生成的响应中提取情感值,并将情感作为输出返回。
接下来,我们遍历测试集中的所有评论,将它们传递给find_sentiment(review)
方法,并检索它们的情感。
all_sentiments = []
X_test_list = X_test.tolist()
i = 0
while i < len(X_test):
try:
review = X_test_list[i]
sentiment_value = find_sentiment(review)
all_sentiments.append(sentiment_value)
i = i + 1
print(i, sentiment_value)
except:
print("===================")
print("达到时间限制")
最后,我们将ChatGPT预测的情感与测试集中的情感进行比较。
accuracy = accuracy_score(all_sentiments, y_test)
print("准确度:", accuracy)
使用ChatGPT预测的情感,我达到了0.95%的准确度,比基准模型实现的准确度高出30%。这是一个巨大的提升,
显示了ChatGPT在文本分类任务中的强大性能。
在下一部分中,我将解释如何使用ChatGPT标注数据并用它来训练文本分类模型。
数据标注的方法与标签预测类似,因为本质上标注就是将标签分配给记录。下面的脚本对训练集中的评论进行标注为正面或负面情感。
all_sentiments = []
X_train_list = X_train.tolist()
i = 0
while i < len(X_train):
try:
review = X_train_list[i]
sentiment_value = find_sentiment(review)
all_sentiments.append(sentiment_value)
i = i + 1
print(i, sentiment_value)
except:
print("===================")
print("达到时间限制")
接下来,我们可以使用ChatGPT标注的记录来训练文本分类模型,如下所示:
# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators = 500)
rf_model.fit(X_train_tfidf, all_sentiments)
# 使用相同的向量化器转换测试数据
X_test_tfidf = vectorizer.transform(X_test)
# 预测测试数据上的情感
y_pred = rf_model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, y_pred)
print("准确度:", accuracy)
在输出中,使用ChatGPT标注的情感,我达到了0.6833%的准确度,比手动标注的数据实现的准确度高出3%。这显示了ChatGPT在小数据集的情况下使用于训练机器学习模型时的效果。
结论
总之,在小数据集的情况下,ChatGPT通常表现优于从头开始训练机器学习模型。进一步观察到,当用于训练机器学习模型时,ChatGPT标注的数据通常表现优于手动标注的数据,尤其是在小数据集的情况下。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。