❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

【跟着ChatGPT学深度学习】系列

【跟着ChatGPT学深度学习】ChatGPT带我学情感分析

【跟着ChatGPT学深度学习】ChatGPT带我学情感分析
学完文本分类,觉得不够过瘾,想着文本分类的下游应用之一不就是情感分析么,于是便又开始学习情感分析了。

1. 情感分析介绍

情感分析是一种自然语言处理技术,旨在识别、提取和量化文本中的情感信息。它可以帮助人们了解一段文本的情感倾向,例如积极、消极或中性。情感分析可以用于分析社交媒体上的评论、产品评论、新闻文章、客户反馈等各种文本数据,以便企业和个人了解他们的客户和受众的情感状态和反应。在情感分析中,通常会使用一些机器学习算法或深度学习模型,例如朴素贝叶斯、支持向量机、神经网络等来进行分类和分析。

2. 情感分析学习流程

以下是一个基本的情感分析流程:

3. 情感分析学习计划

4. 情感分析领域研究学者

情感分析作为一项重要的自然语言处理技术,已经吸引了大量学者的关注。以下是一些在情感分析领域做出重要贡献的学者:

5. 情感分析领域论文

5.1 经典论文

5.2 前沿论文

6. 情感分析学习资源

(1)书籍:

(2)开源代码和工具:

(3)情感分析Github项目

(4)情感分析的api

7. 情感分析方法

8. 研究情感分析的科技公司

9. 情感分析前景

情感分析作为一种重要的自然语言处理技术,已经被广泛应用于社交媒体监测、舆情分析、产品评论分析、客户服务等领域。未来,随着人工智能和自然语言处理技术的不断发展,情感分析技术将会有更广泛的应用和更广阔的前景,具体表现如下:

总之,情感分析技术将会在各个领域得到更广泛的应用和发展,成为解决实际问题的重要工具和手段,也将促进人机交互和情感智能等领域的不断发展和创新。

10. ABSA介绍

ABSA是Aspect-Based Sentiment Analysis的缩写,中文翻译为方面级情感分析。它是情感分析的一个重要分支,主要是针对特定方面的情感分析,例如针对商品的特定属性或者服务的特定方面进行情感分析。相较于传统的情感分析,ABSA更加细粒度,能够更好地理解文本中的情感信息。

在ABSA领域,主要的任务包括方面抽取和情感分类两个部分。方面抽取任务是要从文本中识别出用户评论中提到的方面(如产品的功能、性能等),而情感分类任务则是要分析文本中针对这些方面的情感极性(如积极、消极、中性等)。

ABSA在应用场景上非常广泛,例如在电商领域,可以通过对用户对商品的评论进行方面级情感分析,提供更加精细化的商品推荐和服务体验,从而提高用户满意度和购买转化率。

11. ABSA研究学者

12. ABSA领域前沿论文

13. 情感分析baseline

13.1 朴素贝叶斯方法

当涉及到情感分析时,一个简单的基线模型是使用朴素贝叶斯分类器来分类文本。以下是一个使用Python中的Scikit-learn库实现的基线情感分析模型的示例:

数据集
我们将使用情感分析常用的IMDB电影评论数据集,其中包含50,000条影评文本,分为正面和负面两类。我们将随机选择20,000条评论用于训练模型,剩余30,000条评论用于测试模型。

特征提取
使用词袋模型(bag-of-words model)将文本转换为特征向量,可以使用CountVectorizer类实现。在此过程中,我们还可以选择去除停用词,词干提取和标准化等操作。

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(stop_words='english')
X_train = vectorizer.fit_transform(train_data)
X_test = vectorizer.transform(test_data)

模型训练和测试
使用Multinomial Naive Bayes分类器训练模型,并在测试集上评估性能。我们还可以选择其他分类器,并对其进行调参以提高性能。

from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
clf = MultinomialNB()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
print(f"Accuracy: {acc}")

结果
运行后,我们可以得到在测试集上的准确率。在此基线模型中,我们只使用了朴素贝叶斯分类器和简单的词袋模型,但这已经可以为后续更高级的模型提供一个基准。

13.2 深度学习方法-TensorFlow

import numpy as np
import pandas as pd
import re
import string
import tensorflow as tf
from tensorflow.keras.layers import Dense, Embedding, LSTM
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer
from sklearn.model_selection import train_test_split
# 读取数据
data = pd.read_csv("data.csv")
# 清洗数据
def clean_text(text):
    text = text.lower() # 转换成小写
    text = re.sub('\[.*?\]', '', text) # 去除方括号及其内容
    text = re.sub('[%s]' % re.escape(string.punctuation), '', text) # 去除标点符号
    text = re.sub('\w*\d\w*', '', text) # 去除数字及其连接的单词
    return text
data["text"] = data["text"].apply(lambda x: clean_text(x))
# 划分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.2)
# 构建词汇表
tokenizer = Tokenizer(num_words=10000, oov_token="<OOV>")
tokenizer.fit_on_texts(train_data["text"])
# 将文本转换成数字序列
train_sequences = tokenizer.texts_to_sequences(train_data["text"])
test_sequences = tokenizer.texts_to_sequences(test_data["text"])
# 填充序列
train_padded = pad_sequences(train_sequences, padding="post", maxlen=100)
test_padded = pad_sequences(test_sequences, padding="post", maxlen=100)
# 构建模型
model = Sequential([
    Embedding(10000, 16),
    LSTM(16),
    Dense(1, activation="sigmoid")
])
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
# 训练模型
model.fit(train_padded, train_data["label"], epochs=10, validation_data=(test_padded, test_data["label"]))
# 测试模型
test_loss, test_acc = model.evaluate(test_padded, test_data["label"])
print("Test Loss:", test_loss)
print("Test Accuracy:", test_acc)

该baseline使用了TensorFlow框架,首先读取数据并进行清洗,然后将文本转换为数字序列,并使用pad_sequences函数填充序列。接着,使用Embedding层将数字序列转换为词向量,再使用LSTM层对词向量进行处理,最后使用Dense层输出结果。模型训练完成后,使用evaluate函数对测试集进行测试并输出准确率。

13.3 深度学习方法-PyTorch

下面是一个基于PyTorch的情感分析baseline的完整代码,包括数据处理、模型构建、训练和评估。

首先,我们需要导入必要的库和数据。这里我们使用Stanford Sentiment Treebank数据集,包含了句子和对应的情感标签(非常负面、负面、中立、正面、非常正面)。

import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import numpy as np
import pandas as pd
from collections import Counter
from torch.utils.data import DataLoader, Dataset
from torch.nn.utils.rnn import pad_sequence
# load data
df = pd.read_csv('sst_train.txt', delimiter='\t', header=None, names=['label', 'text'])
# mapping sentiment labels to numerical values
sentiment_map = {'very negative': 0, 'negative': 1, 'neutral': 2, 'positive': 3, 'very positive': 4}
df['label'] = df['label'].apply(lambda x: sentiment_map[x])
# split data into train and validation sets
train_df = df[:7000]
val_df = df[7000:]
# define vocabulary
counter = Counter()
for text in train_df['text']:
    counter.update(text.split())
vocab = {w: i+2 for i, (w, _) in enumerate(counter.most_common())}
vocab['<PAD>'] = 0
vocab['<UNK>'] = 1
# convert text to numerical sequences
def text_to_sequence(text):
    seq = [vocab.get(w, 1) for w in text.split()]
    return seq
train_df['seq'] = train_df['text'].apply(text_to_sequence)
val_df['seq'] = val_df['text'].apply(text_to_sequence)
# define dataset and dataloader
class SSTDataset(Dataset):
    def __init__(self, df):
        self.df = df
    def __len__(self):
        return len(self.df)
    def __getitem__(self, idx):
        seq = self.df.iloc[idx]['seq']
        label = self.df.iloc[idx]['label']
        return torch.tensor(seq), torch.tensor(label)
def collate_fn(batch):
    seqs, labels = zip(*batch)
    seqs = pad_sequence(seqs, batch_first=True, padding_value=0)
    labels = torch.stack(labels)
    return seqs, labels
train_dataset = SSTDataset(train_df)
val_dataset = SSTDataset(val_df)
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, collate_fn=collate_fn)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, collate_fn=collate_fn)

接下来,我们定义模型,这里使用一个简单的双向LSTM模型。

class LSTMModel(nn.Module):
    def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=num_layers, bidirectional=True)
        self.fc = nn.Linear(hidden_dim*2, num_classes)
    def forward(self, x):
        embed = self.embedding(x)
        out, _ = self.lstm(embed)
        out = self.fc(out[:, -1, :])
        return out

下一步是定义训练和评估函数。训练函数将输入模型、数据加载器和优化器,然后在训练集上训练模型。评估函数将输入模型和数据加载器,然后在验证集上评估模型的性能。这里我们将使用交叉熵损失作为损失函数。

def train(model, train_loader, optimizer):
    model.train()
    train_loss = 0
    correct = 0
    total = 0
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = F.cross_entropy(output, target)
        loss.backward()
        optimizer.step()
        train_loss += loss.item()
        _, predicted = output.max(1)
        total += target.size(0)
        correct += predicted.eq(target).sum().item()
    train_acc = 100. * correct / total
    train_loss /= len(train_loader)
    return train_loss, train_acc
def evaluate(model, val_loader):
    model.eval()
    val_loss = 0
    correct = 0
    total = 0
    with torch.no_grad():
        for data, target in val_loader:
            data, target = data.to(device), target.to(device)
            output = model(data)
            val_loss += F.cross_entropy(output, target).item()
            _, predicted = output.max(1)
            total += target.size(0)
            correct += predicted.eq(target).sum().item()
    val_acc = 100. * correct / total
    val_loss /= len(val_loader)
    return val_loss, val_acc

最后,我们将设置模型、优化器和超参数,并训练模型。我们将训练模型5个时期并在每个时期结束时评估模型的性能。我们还将跟踪训练和验证损失以及训练和验证准确性。

model = SentimentClassifier(vocab_size, embedding_dim, hidden_dim, num_layers, dropout, output_dim).to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
train_losses = []
train_accs = []
val_losses = []
val_accs = []
for epoch in range(1, epochs + 1):
    train_loss, train_acc = train(model, train_loader, optimizer)
    val_loss, val_acc = evaluate(model, val_loader)
    print(f'Epoch: {epoch}, Train Loss: {train_loss:.3f}, Train Acc: {train_acc:.2f}%, Val Loss: {val_loss:.3f}, Val Acc: {val_acc:.2f}%')
    train_losses.append(train_loss)
    train_accs.append(train_acc)
    val_losses.append(val_loss)
    val_accs.append(val_acc)

在训练完模型之后,我们可以绘制损失和准确性曲线以查看模型的训练情况。

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 2, figsize=(10,5))
axs[0].plot(train_losses, label='train')
axs[0].plot(val_losses, label='val')
axs[0].set_title('Loss')
axs[0].legend()
axs[1].

接着上一段代码继续编写模型训练和测试的代码:

# 定义模型训练函数
def train(model, train_loader, optimizer, criterion, device):
    model.train()
    train_loss = 0
    train_acc = 0
    for texts, labels in train_loader:
        texts = texts.to(device)
        labels = labels.to(device)
        optimizer.zero_grad()
        outputs = model(texts)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        train_loss += loss.item()
        _, predicted = torch.max(outputs.data, 1)
        train_acc += (predicted == labels).sum().item()
    train_loss /= len(train_loader)
    train_acc /= len(train_loader.dataset)
    return train_loss, train_acc
# 定义模型测试函数
def evaluate(model, test_loader, criterion, device):
    model.eval()
    test_loss = 0
    test_acc = 0
    with torch.no_grad():
        for texts, labels in test_loader:
            texts = texts.to(device)
            labels = labels.to(device)
            outputs = model(texts)
            loss = criterion(outputs, labels)
            test_loss += loss.item()
            _, predicted = torch.max(outputs.data, 1)
            test_acc += (predicted == labels).sum().item()
    test_loss /= len(test_loader)
    test_acc /= len(test_loader.dataset)
    return test_loss, test_acc

接下来,我们使用上述函数进行模型训练和测试,并输出模型的训练和测试结果:

# 模型训练和测试
num_epochs = 5
for epoch in range(num_epochs):
    train_loss, train_acc = train(model, train_loader, optimizer, criterion, device)
    print(f'Epoch [{epoch+1}/{num_epochs}], Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}')
    test_loss, test_acc = evaluate(model, test_loader, criterion, device)
    print(f'Test Loss: {test_loss:.4f}, Test Acc: {test_acc:.4f}')
# 输出模型训练和测试的结果
train_loss, train_acc = evaluate(model, train_loader, criterion, device)
print(f'Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}')
test_loss, test_acc = evaluate(model, test_loader, criterion, device)
print(f'Test Loss: {test_loss:.4f}, Test Acc: {test_acc:.4f}')

参考文献

【跟着ChatGPT学深度学习】ChatGPT带我学情感分析
【跟着ChatGPT学深度学习】ChatGPT带我学情感分析

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

发表回复