自然語言處理NLP TextRNN實現(xiàn)情感分類
概要
在自然語言處理(NLP)領(lǐng)域,情感分析及分類是一項十分熱門的任務(wù)。它的目標(biāo)是從文本中提取出情感信息和意義,通常分為兩類:正向情感和負(fù)向情感,并且可以細(xì)化為多個情感級別。
在這篇文章中,我們將介紹如何使用TextRNN(Text Recurrent Neural Network)來實現(xiàn)情感短文本分類任務(wù)。我們將探索數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓(xùn)練和評估等主題。
數(shù)據(jù)集
我們將使用公開的中文情感分類數(shù)據(jù)集THUCNews。該數(shù)據(jù)集包括74000個樣本,被標(biāo)記成10個類別:'體育', '娛樂', '家居', '房產(chǎn)', '教育', '時尚', '時政', '游戲', '科技'和 '財經(jīng)'。我們選擇其中5類并按照“csv”格式存儲下來:'體育', '時政', '科技', '娛樂'和‘財經(jīng)’。每個樣本由一條短文本和一個標(biāo)簽組成。
以下是讀取數(shù)據(jù)集和預(yù)覽樣本:
import pandas as pd
# 加載數(shù)據(jù)集
df = pd.read_csv('data.csv')
# 打印前五個樣本
print(df.head())
輸出:
| label | text | |
|---|---|---|
| 0 | 3 | 華彩行動到了20位擔(dān)保人 全國民間組織網(wǎng)絡(luò)代表共襄盛舉 |
| 1 | 4 | 中移動前4月新用戶凈增955萬用戶 |
| 2 | 1 | 浙江教育房貸減輕購房壓力 師生建體制 |
| 3 | 1 | 中央黨校黨的歷史研究院原副院長林必勝先生逝世 |
| 4 | 1 | 中央黨校黨的歷史研究院實現(xiàn)640家文博單位軍工企業(yè)4000余名干部學(xué)習(xí)實踐十八大精神 |
數(shù)據(jù)預(yù)處理
首先,將文本轉(zhuǎn)換為可供模型使用的數(shù)字特征向量是自然語言處理任務(wù)中的關(guān)鍵步驟。我們可以通過利用一種稱為“分詞”的技術(shù),將文本劃分為一個個單詞或詞匯。
對于中文文本,我們將使用jieba分詞庫。以下是代碼實現(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)
接下來,我們需要將文本數(shù)據(jù)轉(zhuǎn)換為數(shù)值特征向量。我們可以使用torchtext庫來處理此操作。以下是代碼實現(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)
# 劃分測試集與訓(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)
在這里,我們定義兩個Field:第一個用于表示問題文本,第二個用于表示標(biāo)簽。然后,我們將它們放到一個名為“fields”的列表里。數(shù)據(jù)的格式是CSV,并由TabularDataset加載。
接著,我們對原始數(shù)據(jù)進(jìn)行劃分,將80%的數(shù)據(jù)作為訓(xùn)練集,20%作為測試集。為了能再次處理相同的數(shù)據(jù),我們還設(shè)置了一個種子(random state)。
最后,我們創(chuàng)建了單詞表,并利用預(yù)訓(xùn)練的詞向量(fill-vectors)進(jìn)行初始化。例如,在此處,我們選擇了GloVe詞向量(glove.6B.100d)。GloVe是一種基于全局詞頻的詞向量。
模型構(gòu)建
TextRNN 是一個典型的循環(huán)神經(jīng)網(wǎng)絡(luò)模型,專門用于處理序列數(shù)據(jù)。當(dāng)我們連續(xù)閱讀一篇文章時,記憶通常從前到后流動,并且在閱讀新的單詞時,信息會累積起來,這正是RNN的目標(biāo)。
我們將使用PyTorch來實現(xiàn)一個簡單的TextRNN模型。以下是代碼實現(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層之后有兩個線性層:一個用于投影輸出空間,一個用于產(chǎn)生最終結(jié)果。為了避免過擬合,我們還添加了一些丟棄層。
此處的輸入特征為嵌入(embedding)矩陣,該矩陣是固定大小的,其中每行對應(yīng)于詞匯表中的單個單詞。所以第一個參數(shù)為vocab_size, 第二個參數(shù)用于指定分詞后每個單詞的維度。
RNN的隱藏狀態(tài)(h)對于這類任務(wù)非常關(guān)鍵,因為它是從之前的時間步的信息生成的,并存儲了讀取所有歷史記錄的能力。在我們的示例中,我們選用GPU加速訓(xùn)練。
模型訓(xùn)練
現(xiàn)在我們準(zhǔn)備好訓(xùn)練模型了。我們將使用PyTorch Lightning框架來加速開發(fā)和調(diào)試的過程。
以下是代碼實現(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來創(chuàng)建一個PyTorch Lightning模型。在訓(xùn)練步驟中,我們計算了損失和準(zhǔn)確率,并將值記錄為train_loss、train_acc、val_loss和 val_acc。然后我們返回?fù)p失并將PyTorch Lightning接收到的優(yōu)化器作為return語句輸出。
模型評估
現(xiàn)在我們已經(jīng)完成了訓(xùn)練,下一步是評估我們的模型。我們將使用測試集進(jìn)行評估。以下是代碼實現(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個epoch。最后,使用測試數(shù)據(jù)評估模型的性能。
結(jié)論
在本文章中,我們介紹了如何使用TextRNN模型來實現(xiàn)短文本情感分類任務(wù)。我們使用PyTorch和PyTorch Lightning庫建立、訓(xùn)練和評估模型。
雖然我們主要關(guān)注情感分類任務(wù),但這些方法本質(zhì)上可以應(yīng)用于其他NLP問題。
以上就是自然語言處理NLP TextRNN實現(xiàn)情感分類的詳細(xì)內(nèi)容,更多關(guān)于NLP TextRNN情感分類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3中apply函數(shù)和lambda函數(shù)的使用詳解
本文主要介紹了python3中apply函數(shù)和lambda函數(shù)的使用詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
Python字符串轉(zhuǎn)換成浮點(diǎn)數(shù)函數(shù)分享
本文給大家分享的是一則使用Python實現(xiàn)字符串轉(zhuǎn)換成浮點(diǎn)數(shù)的代碼,主要是使用map和reduce方法來實現(xiàn),有需要的小伙伴可以參考下。2015-07-07
Python3使用requests登錄人人影視網(wǎng)站的方法
通過本文給大家介紹python代碼實現(xiàn)使用requests登錄網(wǎng)站的過程。非常具有參考價值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
Python?Scrapy庫構(gòu)建基礎(chǔ)爬蟲
這篇文章主要為大家介紹了Python?Scrapy庫構(gòu)建基礎(chǔ)爬蟲示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
pandas學(xué)習(xí)之df.fillna的具體使用
本文主要介紹了pandas學(xué)習(xí)之df.fillna的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
python3中celery異步框架簡單使用+守護(hù)進(jìn)程方式啟動
這篇文章主要介紹了python3中celery異步框架簡單使用+守護(hù)進(jìn)程方式啟動,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
python爬蟲框架scrapy代理中間件掌握學(xué)習(xí)教程
這篇文章主要介紹了python爬蟲框架scrapy代理中間件掌握學(xué)習(xí)教程,為大家說明一下 scrapy 中代理相關(guān)知識點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Pytorch之8層神經(jīng)網(wǎng)絡(luò)實現(xiàn)Cifar-10圖像分類驗證集準(zhǔn)確率94.71%
這篇文章主要介紹了Pytorch之8層神經(jīng)網(wǎng)絡(luò)實現(xiàn)Cifar-10圖像分類驗證集準(zhǔn)確率94.71%問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03

