情感分析是自然语言处理 (NLP) 的一个子领域,旨在识别和分类文本数据中表达的潜在情感或情绪。无论是了解客户对产品的看法、分析社交媒体帖子,还是衡量公众对政治事件的情绪,情绪分析在从大量文本数据中释放有价值的见解方面都发挥着至关重要的作用。
然而,训练准确的情感分类模型通常需要大量带注释的数据,而这些数据可能并不总是容易获得或获取起来很耗时。这种限制促使研究人员和从业者探索创新技术,例如数据增强,以生成合成数据并增强训练集。
在本文中,我们将深入研究数据增强的世界,特别是使用 OpenAI 开发的强大语言模型 ChatGPT 来生成额外的训练样本并增强情感分类模型的性能。通过利用 ChatGPT 的功能,我们可以有效地创建多样化且真实的数据,为有限注释数据将成为障碍的场景中的情感分析开辟了新的可能性。
无需数据增强的情感分类
为了训练情感分类模型,我们将使用IMDD 数据集,其中包含带有情感标签的电影评论。然后,我们将使用 TF-IDF(词频-逆文档频率)特征训练随机森林模型,这使我们能够以数字方式表示文本数据。通过将数据集划分为训练集和测试集,我们可以评估模型在未见过的数据上的性能。准确性得分将用于衡量模型预测情绪的效果。
现在,让我们继续代码:
复制到剪贴板
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
dataset = pd.read_csv(r”D:\Datasets\IMDB Dataset.csv”)
dataset.head()
dataset = dataset.head(600)
X_train, X_test, y_train, y_test = train_test_split(dataset[review],
dataset[sentiment],
test_size=0.2,
random_state=42)
# Create TF-IDF vectorizer
vectorizer = TfidfVectorizer()
X_train_tfidf = vectorizer.fit_transform(X_train)
# Train the Random Forest model
rf_model = RandomForestClassifier(n_estimators = 500)
rf_model.fit(X_train_tfidf, y_train)
# Transform the test data using the same vectorizer
X_test_tfidf = vectorizer.transform(X_test)
# Predict the sentiment on the test data
y_pred = rf_model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, y_pred)
print(“Accuracy:”, accuracy)
在没有数据增强的情况下,我的准确率达到了 0.6916。
使用 ChatGPT 进行数据增强
现在让我们使用 ChatGPT 来扩充我们的数据。我们将再生成 100 条评论。那么,让我们开始吧。
复制到剪贴板
import os
import openai
api_key = os.getenv(OPENAI_KEY2)
openai.api_key = api_key
在上面的代码片段中,我们正在设置 OpenAI API 以访问其语言模型,特别是“GPT-3.5”模型。这是 ChatGPT 在幕后使用的语言模型。
首先,我们导入所需的库。然后,我们通过从环境变量 OPENAI_KEY2 中检索 OpenAI API 密钥来设置它。此密钥对于对 OpenAI 服务进行 API 调用是必需的。
接下来,我们将openai获得的 API 密钥分配给 来配置库openai.api_key。
下一步是定义一个生成电影评论的函数。
复制到剪贴板
import time
def generate_reviews(review):
content = “””Generate one short IMDB movie review using the following review as an example. The review sentiment should be positive, negative, or neutral.
Review = {}. Also mention the sentiment of the review in one word (positive, negative, neutral) in the beginning of your reply.”””.format(review)
generated_review = openai.ChatCompletion.create(
model=“gpt-3.5-turbo”,
temperature = 0.7,
messages=[
{“role”: “user”, “content”: content}
]
)
return generated_review[“choices”][0][“message”][“content”]
上面的代码定义了一个名为generate_reviews(review)的函数,该函数使用OpenAI GPT-3.5 Turbo语言模型根据示例评论生成电影评论。该函数以输入评论为例,提示模型创建具有指定情绪(正面、负面或中性)的新电影评论。温度参数控制生成文本的创意。
然后该函数返回生成的电影评论。这种方法使我们能够利用 OpenAI 的 GPT-3.5 Turbo 语言模型的强大功能,轻松生成具有不同情感的多样化电影评论。
接下来,我们将迭代训练集中的前 100 条电影评论,并使用它们作为示例来生成新的评论。
以下代码包含一个循环,该循环使用generate_reviews(review)函数生成100条电影评论。生成的评论存储在 generated_reviews 列表中。每个评论都基于训练数据 (X_train) 中的不同示例。这种方法可以创建多样化且富有创意的电影评论。
复制到剪贴板
generated_reviews = []
X_train_list = X_train.tolist()
for i in range(100):
review = X_train_list[i]
generated_review = generate_reviews(review)
generated_reviews.append(generated_review)
print(i + 1, generated_review)
使用增强数据进行训练
我们现在将使用原始数据和增强数据来训练我们的机器学习模型。
首先,我们将 ChatGPT 生成的评论转换为包含评论和情绪列的 Pandas 数据框。以下脚本迭代每个生成的评论,将评论拆分为情绪和评论,并将这些值返回给调用函数。所有生成的评论的文本广告情绪都存储在字典中,然后附加到列表中,并转换为 Pandas 数据框。
复制到剪贴板
import re
def split_string_into_two(input_string):
# Split the string into words
words = input_string.split()
# Create the first string with the first word
first_string = words[0].lower()
first_string = re.sub(r[^a-zA-Z0-9], , first_string)
# Create the second string with the second word
second_string = .join(words[1:]) if len(words) > 1 else
# Remove new line characters
second_string = second_string.replace(\n, )
return first_string, second_string
generated_reviews_dicts = []
for review in generated_reviews:
first, second = split_string_into_two(review)
review_dict = {sentiment:first, review:second}
generated_reviews_dicts.append(review_dict)
df = pd.DataFrame(generated_reviews_dicts)
df.sentiment.value_counts()
该剧本总共产生了99条影评。其中,48 条评论被预测为正面情绪,46 条评论为负面情绪,5 条评论被标记为中性。然而,一篇评论将文本“评论”作为预测情绪,这似乎不正确。因此,我从结果中删除了该特定记录,仅保留情绪分为积极、消极或中性的评论。
接下来,我将把生成的评论添加到原始训练集中的评论中:
复制到剪贴板
X_train_aug = df[“review”]
X_train_new = X_train.append(X_train_aug)
y_train_aug = df[“sentiment”]
y_train_new = y_train.append(y_train_aug)
其余过程是相同的,我们将使用 TFIDF 将文本转换为向量,使用随机森林算法来训练我们的模型并对测试集进行预测。
复制到剪贴板
# Create TF-IDF vectorizer
vectorizer = TfidfVectorizer()
X_train_tfidf = vectorizer.fit_transform(X_train_new)
# Train the Random Forest model
rf_model = RandomForestClassifier(n_estimators = 500)
rf_model.fit(X_train_tfidf, y_train_new)
# Transform the test data using the same vectorizer
X_test_tfidf = vectorizer.transform(X_test)
# Predict the sentiment on the test data
y_pred = rf_model.predict(X_test_tfidf)
accuracy = accuracy_score(y_test, y_pred)
print(“Accuracy:”, accuracy)
在输出中,我实现了 0.75 的分类精度,比原始的 0.6916 大约提高了 6%。结果非常令人印象深刻,仅生成了 100 条新记录。这显示了 ChatGPT 在数据增强方面的重要功能。
我希望您会喜欢本教程。请随意分享您对我如何进一步改进这些结果的想法。