日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二十一、文本情感分类二

發布時間:2024/9/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二十一、文本情感分类二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1 文本訓練化概述

  • 深度學習構建模型前需要將文本轉化為向量表示(Word Embedding)。首先需要將文本轉化為數字(文本序列化),在把數字轉化為向量。
  • 可以考慮把文本中的每個詞語和其對應的數字,使用字典保存,同時把句子轉化為數字的列表。

1.2 文本序列化的過程

  • 實現文本序列化之前,應考慮一下幾點:

  • 如何使用字典把詞語和數字進行對應;

  • 不同的詞語出現的次數不盡相同,是否需要對高頻或者低頻詞語進行過濾

  • 得到詞典之后,如何把句子轉化為數字序列,如何把數字序列轉化為句子

  • 不同句子長度不相同,每個batch的句子如何構造成相同的長度

  • 對于新出現的詞語在詞典中沒有出現怎么辦(特殊字符代理)

2. 文本情感分類的模型構建

2.1 文本情感分類具體流程

  • 數據預處理:讀取文本數據,并按照批量的方式加載數據,使用DataLoader完成數據的讀取,具體實現參考data_prepare.py。
  • 文本序列化:將文本數據轉化向量表示(Word Embedding),具體實現參考save_ws.py。
  • 模型的構建和評估:由model.py實現
  • 2. 2 代碼

    • 步驟一:準備數據data_prepare.py
    # coding:utf-8import torch from torch.utils.data import DataLoader, Dataset import os import re import pickledata_base_path = r"data\aclImdb" ws = pickle.load(open("ws.pkl", "rb")) max_len = 20# 1. 定義tokenize的方法 def tokenize(text):fileters = ['!', '"', '#', '$', '%', '&', '\(', '\)', '\*', '\+', ',', '-', '\.', '/', ':', ';', '<', '=', '>','\?', '@', '\[', '\\', '\]', '^', '_', '`', '\{', '\|', '\}', '~', '\t', '\n', '\x97', '\x96', '”', '“', ]text = re.sub("<.*?>", " ", text, flags=re.S)text = re.sub("|".join(fileters), " ", text, flags=re.S)return [i.strip() for i in text.split()]# 2. 準備dataset class ImdbDataset(Dataset):def __init__(self, mode):# 調用父類初始化方法初始化繼承的屬性super(ImdbDataset, self).__init__()if mode == "train":text_path = [os.path.join(data_base_path, i) for i in ["train/neg", "train/pos"]]else:text_path = [os.path.join(data_base_path, i) for i in ["test/neg", "test/pos"]]self.total_file_path_list = []for i in text_path:self.total_file_path_list.extend([os.path.join(i, j) for j in os.listdir(i)])def __getitem__(self, idx):cur_path = self.total_file_path_list[idx]cur_filename = os.path.basename(cur_path)label = int(cur_filename.split("_")[-1].split(".")[0]) - 1 # 處理標題,獲取label,轉化為從[0-9]text = tokenize(open(cur_path, encoding="utf-8").read().strip()) # 直接按照空格進行分詞return label, textdef __len__(self):return len(self.total_file_path_list)def collate_fn(batch):# batch是list,其中是一個一個元組,每個元組是dataset中__getitem__的結果label, content, = list(zip(*batch))content = [ws.transform(i, max_len=max_len) for i in content]content = torch.LongTensor(content)label = torch.LongTensor(label)return label, contentdef get_dataloader(train_data=True):mode = ""if train_data:mode = "train"imdb_dataset = ImdbDataset(mode)dataloader = DataLoader(dataset=imdb_dataset, batch_size=10, shuffle=True, collate_fn=collate_fn)return dataloaderif __name__ == '__main__':# 1. 定義tokenizetext = "I cannot stay indifferent<br></br> to Lars| van Trier's films. "s = tokenize(text)# 2. 實例化,準備dataloaderdataset = ImdbDataset(mode="train")dataloader = get_dataloader()# 3. 觀察數據輸出結果for idx, (label, text) in enumerate(dataloader):print("idx:", idx)print("table:", label)print("text:", text)break
    • 步驟二:文本序列化save_ws.py
    # 2. 準備dataset class ImdbDataset(Dataset):def __init__(self, mode):# 調用父類初始化方法初始化繼承的屬性super(ImdbDataset, self).__init__()if mode == "train":text_path = [os.path.join(data_base_path, i) for i in ["train/neg", "train/pos"]]else:text_path = [os.path.join(data_base_path, i) for i in ["test/neg", "test/pos"]]self.total_file_path_list = []for i in text_path:self.total_file_path_list.extend([os.path.join(i, j) for j in os.listdir(i)])def __getitem__(self, idx):cur_path = self.total_file_path_list[idx]cur_filename = os.path.basename(cur_path)label = int(cur_filename.split("_")[-1].split(".")[0]) - 1 # 處理標題,獲取label,轉化為從[0-9]text = tokenize(open(cur_path).read().strip()) # 直接按照空格進行分詞return label, textdef __len__(self):return len(self.total_file_path_list)
    • 步驟三:模型評估和預測model.py
    # coding:utf-8import pickle import torch import torch.nn as nn import torch.nn.functional as F from torch.optim import Adam from unit21.data_prepare import get_dataloader, max_lenws = pickle.load(open("ws.pkl", "rb"))class IMDBModel(nn.Module):def __init__(self,max_len):super(IMDBModel,self).__init__()self.embedding = nn.Embedding(len(ws),300,padding_idx=ws.PAD) #[N,300]self.fc = nn.Linear(max_len*300,10) #[max_len*300,10]def forward(self, x):embed = self.embedding(x) #[batch_size,max_len,300]embed = embed.view(x.size(0),-1)out = self.fc(embed)return F.log_softmax(out,dim=-1)model = IMDBModel(max_len) optimizer = Adam(model.parameters(), 0.001)# 訓練 def train(epoch):train_dataloader = get_dataloader()for idx, (target, input) in enumerate(train_dataloader):optimizer.zero_grad()output = model(input)loss = F.nll_loss(output, target) # traget需要是[0,9],不能是[1-10]loss.backward()optimizer.step()if idx % 10 == 0:print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(epoch, idx * len(input), len(train_dataloader.dataset),100. * idx / len(train_dataloader), loss.item()))torch.save(model.state_dict(), "imdb_net.pkl")def test():test_loss = 0correct = 0train = Falsemodel.load_state_dict(torch.load("imdb_net.pkl"))model.eval()test_dataloader = get_dataloader()with torch.no_grad():for target, input in test_dataloader:output = model(input)test_loss += F.nll_loss(output, target, reduction="sum")pred = torch.max(output, dim=-1, keepdim=False)[-1]correct = pred.eq(target.data).sum()test_loss = test_loss / len(test_dataloader.dataset)print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.2f}%)\n'.format(test_loss, correct, len(test_dataloader.dataset),100. * correct / len(test_dataloader.dataset)))if __name__ == '__main__':epoch = 1train(epoch)#test()

    總結

    以上是生活随笔為你收集整理的二十一、文本情感分类二的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。