溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

NLP?TextRNN怎么實(shí)現(xiàn)情感分類

發(fā)布時(shí)間:2023-05-05 15:09:43 來(lái)源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“NLP TextRNN怎么實(shí)現(xiàn)情感分類”,在日常操作中,相信很多人在NLP TextRNN怎么實(shí)現(xiàn)情感分類問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”NLP TextRNN怎么實(shí)現(xiàn)情感分類”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

概要

在自然語(yǔ)言處理(NLP)領(lǐng)域,情感分析及分類是一項(xiàng)十分熱門的任務(wù)。它的目標(biāo)是從文本中提取出情感信息和意義,通常分為兩類:正向情感和負(fù)向情感,并且可以細(xì)化為多個(gè)情感級(jí)別。

數(shù)據(jù)集

我們將使用公開的中文情感分類數(shù)據(jù)集THUCNews。該數(shù)據(jù)集包括74000個(gè)樣本,被標(biāo)記成10個(gè)類別:'體育', '娛樂(lè)', '家居', '房產(chǎn)', '教育', '時(shí)尚', '時(shí)政', '游戲', '科技'和 '財(cái)經(jīng)'。我們選擇其中5類并按照“csv”格式存儲(chǔ)下來(lái):'體育', '時(shí)政', '科技', '娛樂(lè)'和‘財(cái)經(jīng)’。每個(gè)樣本由一條短文本和一個(gè)標(biāo)簽組成。

以下是讀取數(shù)據(jù)集和預(yù)覽樣本:

import pandas as pd
# 加載數(shù)據(jù)集
df = pd.read_csv('data.csv')
# 打印前五個(gè)樣本
print(df.head())

輸出:


labeltext
03華彩行動(dòng)到了20位擔(dān)保人 全國(guó)民間組織網(wǎng)絡(luò)代表共襄盛舉
14中移動(dòng)前4月新用戶凈增955萬(wàn)用戶
21浙江教育房貸減輕購(gòu)房壓力 師生建體制
31中央黨校黨的歷史研究院原副院長(zhǎng)林必勝先生逝世
41中央黨校黨的歷史研究院實(shí)現(xiàn)640家文博單位軍工企業(yè)4000余名干部學(xué)習(xí)實(shí)踐十八大精神

數(shù)據(jù)預(yù)處理

首先,將文本轉(zhuǎn)換為可供模型使用的數(shù)字特征向量是自然語(yǔ)言處理任務(wù)中的關(guān)鍵步驟。我們可以通過(guò)利用一種稱為“分詞”的技術(shù),將文本劃分為一個(gè)個(gè)單詞或詞匯。

對(duì)于中文文本,我們將使用jieba分詞庫(kù)。以下是代碼實(shí)現(xiàn):

import jieba
# 進(jìn)行中文分詞,并將結(jié)果以字符串列表形式返回
def chinese_word_cut(mytext):
    return ' '.join(jieba.cut(mytext))
df['text'] = df.text.apply(chinese_word_cut)

接下來(lái),我們需要將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值特征向量。我們可以使用torchtext庫(kù)來(lái)處理此操作。以下是代碼實(shí)現(xiàn):

import torchtext
from torchtext import data
# 構(gòu)建Field和Dataset
text_field = data.Field(tokenize='spacy', batch_first=True, fix_length=100)
label_field = data.LabelField(dtype=torch.long)
fields = [('text', text_field), ('label', label_field)]
dataset = data.TabularDataset(path='data.csv',
                              format='csv',
                              fields=fields,
                              skip_header=True)
# 劃分測(cè)試集與訓(xùn)練集,比例為0.8/0.2
train_data, test_data = dataset.split(split_ratio=0.8, random_state=random.getstate())
# 構(gòu)建詞典
text_field.build_vocab(train_data, vectors='glove.6B.100d')
label_field.build_vocab(train_data)

在這里,我們定義兩個(gè)Field:第一個(gè)用于表示問(wèn)題文本,第二個(gè)用于表示標(biāo)簽。然后,我們將它們放到一個(gè)名為“fields”的列表里。數(shù)據(jù)的格式是CSV,并由TabularDataset加載。

接著,我們對(duì)原始數(shù)據(jù)進(jìn)行劃分,將80%的數(shù)據(jù)作為訓(xùn)練集,20%作為測(cè)試集。為了能再次處理相同的數(shù)據(jù),我們還設(shè)置了一個(gè)種子(random state)。

最后,我們創(chuàng)建了單詞表,并利用預(yù)訓(xùn)練的詞向量(fill-vectors)進(jìn)行初始化。例如,在此處,我們選擇了GloVe詞向量(glove.6B.100d)。GloVe是一種基于全局詞頻的詞向量。

模型構(gòu)建

TextRNN 是一個(gè)典型的循環(huán)神經(jīng)網(wǎng)絡(luò)模型,專門用于處理序列數(shù)據(jù)。當(dāng)我們連續(xù)閱讀一篇文章時(shí),記憶通常從前到后流動(dòng),并且在閱讀新的單詞時(shí),信息會(huì)累積起來(lái),這正是RNN的目標(biāo)。

我們將使用PyTorch來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的TextRNN模型。以下是代碼實(shí)現(xiàn):

import torch.nn as nn
class TextRNN(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers,
                 bidirectional, dropout):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim) 
        self.hidden_dim = hidden_dim
        self.n_layers = n_layers
        self.bidirectional = bidirectional
        self.rnn = nn.RNN(embed_dim,
                          hidden_dim,
                          num_layers=n_layers,
                          bidirectional=bidirectional,
                          batch_first=True,
                          dropout=dropout)
        self.fc = nn.Linear(hidden_dim * 2 if bidirectional else hidden_dim, output_dim)
        self.dropout = nn.Dropout(dropout)
    def forward(self, text):        
        embedded = self.embedding(text)
        output, hidden = self.rnn(embedded)
        hidden = self.dropout(torch.cat((hidden[-2,:,:], hidden[-1,:,:]), dim = 1))
        return self.fc(hidden)

在RNN層之后有兩個(gè)線性層:一個(gè)用于投影輸出空間,一個(gè)用于產(chǎn)生最終結(jié)果。為了避免過(guò)擬合,我們還添加了一些丟棄層。

此處的輸入特征為嵌入(embedding)矩陣,該矩陣是固定大小的,其中每行對(duì)應(yīng)于詞匯表中的單個(gè)單詞。所以第一個(gè)參數(shù)為vocab_size, 第二個(gè)參數(shù)用于指定分詞后每個(gè)單詞的維度。

RNN的隱藏狀態(tài)(h)對(duì)于這類任務(wù)非常關(guān)鍵,因?yàn)樗菑闹暗臅r(shí)間步的信息生成的,并存儲(chǔ)了讀取所有歷史記錄的能力。在我們的示例中,我們選用GPU加速訓(xùn)練。

模型訓(xùn)練

現(xiàn)在我們準(zhǔn)備好訓(xùn)練模型了。我們將使用PyTorch Lightning框架來(lái)加速開發(fā)和調(diào)試的過(guò)程。

以下是代碼實(shí)現(xiàn):

import torch
from torch.utils.data import DataLoader
import pytorch_lightning as pl
class Model(pl.LightningModule):
    def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim, n_layers,
                 bidirectional, dropout=0.5):
        super(Model, self).__init__()
        self.rnn = TextRNN(vocab_size, embed_dim, hidden_dim, 
                           output_dim, n_layers, bidirectional, dropout)
        self.loss_fn = nn.CrossEntropyLoss()
    def forward(self, text):
        return self.rnn(text)
    def training_step(self, batch, batch_idx):
        x, y = batch.text, batch.label
        pred_y = self(x).squeeze(1)
        loss = self.loss_fn(pred_y, y)
        acc = accuracy(pred_y, y)
        self.log('train_loss', loss, prog_bar=True)
        self.log('train_acc', acc, prog_bar=True)
        return {'loss': loss}
    def validation_step(self, batch, batch_idx):
        x, y = batch.text, batch.label
        pred_y = self(x).squeeze(1)
        loss = self.loss_fn(pred_y, y)
        acc = accuracy(pred_y, y)
        self.log('val_loss', loss, prog_bar=True)
        self.log('val_acc', acc, prog_bar=True)
    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=0.001)
        return optimizer
def accuracy(preds, y):
    _, preds = torch.max(preds, dim=1)
    correct = (preds == y).float()
    acc = correct.sum() / len(correct)
    return acc

這里我們使用LightningModule來(lái)創(chuàng)建一個(gè)PyTorch Lightning模型。在訓(xùn)練步驟中,我們計(jì)算了損失和準(zhǔn)確率,并將值記錄為train_loss、train_acc、val_loss val_acc。然后我們返回?fù)p失并將PyTorch Lightning接收到的優(yōu)化器作為return語(yǔ)句輸出。

模型評(píng)估

現(xiàn)在我們已經(jīng)完成了訓(xùn)練,下一步是評(píng)估我們的模型。我們將使用測(cè)試集進(jìn)行評(píng)估。以下是代碼實(shí)現(xiàn):

test_loader = DataLoader(test_data, batch_size=BATCH_SIZE)
ckpt = pl.callbacks.ModelCheckpoint(monitor='val_loss')
trainer = pl.Trainer(gpus=1, callbacks=[ckpt])
model = Model(len(text_field.vocab), 100, 128, len(label_field.vocab), 1, True)
trainer.fit(model, DataLoader(train_data, batch_size=BATCH_SIZE))
trainer.test(test_dataloaders=test_loader)

在這里,我們將batch size設(shè)置為128,并訓(xùn)練20個(gè)epoch。最后,使用測(cè)試數(shù)據(jù)評(píng)估模型的性能。

到此,關(guān)于“NLP TextRNN怎么實(shí)現(xiàn)情感分類”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI