從代碼學習深度學習 - 情感分析:使用循環神經網絡 PyTorch版

文章目錄

  • 前言
  • 1. 加載與預處理數據集
    • 數據讀取與詞元化
    • 構建詞匯表
    • 截斷、填充與數據迭代器
  • 2. 構建循環神經網絡模型
    • 雙向RNN模型(BiRNN)詳解
    • 權重初始化
  • 3. 加載預訓練詞向量
    • 構建詞向量加載器
    • 將預訓練向量注入模型
  • 4. 訓練與評估模型
    • 定義訓練函數
    • 可視化訓練過程
  • 5. 模型預測
    • 編寫預測函數
    • 實例測試
  • 6. 總結


前言

在信息爆炸的時代,從海量的文本數據中提取有價值的信息變得至關重要。無論是電商網站的商品評論、社交媒體上的用戶反饋,還是新聞文章中的觀點傾向,理解文本背后的情感色彩——即情感分析——都有著廣泛的應用。

循環神經網絡(RNN)由于其對序列數據的強大建模能力,天然地適用于處理文本這類具有時序特征的數據。在本篇博客中,我們將從零開始,使用PyTorch框架構建一個基于雙向循環神經網絡(Bi-RNN)的情感分析模型。我們不僅會詳細講解數據預處理、模型構建、訓練評估的全過程,還將引入預訓練的GloVe詞向量來提升模型的性能。

這篇博客的目標是“從代碼學習深度學習”。因此,我們將完整地展示每一個模塊的代碼,并配以詳盡的解釋,力求讓讀者不僅能看懂代碼,更能理解每一行代碼背后的原理和設計思想。無論您是深度學習初學者,還是希望系統學習PyTorch在自然語言處理中應用的開發者,相信都能從中獲益。

讓我們一起踏上這場代碼與思想的探索之旅吧!

完整代碼:下載鏈接


1. 加載與預處理數據集

任何成功的NLP項目都始于堅實的數據處理。我們的任務是分析IMDb電影評論的情感,這是一個經典的二分類問題(正面/負面)。在這一步,我們將完成從原始文本文件到PyTorch數據迭代器的全部轉換過程。

主邏輯由load_data_imdb函數驅動,它調用了一系列輔助函數來完成任務。

# 情感分析:使用循環神經網絡.ipynbimport torch
import utils_for_data
from torch import nnbatch_size = 64
train_iter, test_iter, vocab = utils_for_data.load_data_imdb(batch_size)

上面的代碼是我們的入口,它調用utils_for_data.load_data_imdb來獲取訓練/測試數據迭代器和詞匯表。現在,讓我們深入utils_for_data.pyutils_for_vocab.py,看看這一切是如何實現的。

數據讀取與詞元化

首先,我們需要從壓縮包中讀取IMDb數據集的文本和標簽。read_imdb函數負責遍歷指定目錄,讀取每個評論文件并為其打上正面(1)或負面(0)的標簽。

# utils_for_data.pyimport os
import zipfile
import tarfile
import utils_for_vocab
import torch.utils.data as data
import torchdef extract(name, folder=None):"""下載并解壓zip/tar文件參數:name (str): 要解壓的文件名/路徑,維度: [字符串]folder (str, optional): 指定的文件夾名稱,維度: [字符串] 或 None返回:str: 解壓后的目錄路徑,維度: [字符串]"""base_dir = os.path.dirname(name)data_dir, ext = os.path.splitext(name)if ext == '.zip':fp = zipfile.ZipFile(name, 'r')elif ext in ('.tar', '.gz'):fp = tarfile.open(name, 'r')else:assert False, '只有zip/tar文件可以被解壓縮'fp.extractall(base_dir)fp.close()return os.path.join(base_dir, folder) if folder else data_dirdef read_imdb(data_dir, is_train):"""讀取IMDb評論數據集文本序列和標簽參數:data_dir (str): 數據集根目錄路徑is_train (bool): 是否讀取訓練集,True為訓練集,False為測試集返回:tuple: (data, labels)data (list): 評論文本列表,維度為 [樣本數量]labels (list): 標簽列表,維度為 [樣本數量],1表示正面評價,0表示負面評價"""data = []labels = []for label in ('pos', 'neg'):folder_name = os.path.join(data_dir, 'train' if is_train else 'test', label)for file in os.listdir(folder_name):file_path = os.path.join(folder_name, file)with open(file_path, 'rb') as f:review = f.read().decode('utf-8').replace('\n', '')data.append(review)labels.append(1 if label == 'pos' else 0)return data, labels

拿到原始文本后,我們需要將其分解為模型可以理解的基本單元——詞元(Token)。這個過程稱為詞元化(Tokenization)。tokenize函數可以按單詞或字符進行分割。

# utils_for_vocab.pyimport torch
import torch.utils.data
from collections import Counterdef tokenize(lines, token='word'):"""將文本行拆分為單詞或字符詞元參數:lines (list): 文本行列表,維度: [行數],每個元素為字符串token (str): 詞元化類型,維度: [標量],'word'表示按單詞分割,'char'表示按字符分割返回:tokenized_lines (list): 詞元化后的文本,維度: [行數 × 詞元數],嵌套列表結構"""if token == 'word':return [line.split() for line in lines]elif token == 'char':return [list(line) for line in lines]else:print('錯誤:未知詞元類型:' + token)

構建詞匯表

計算機無法直接處理文本,我們需要將詞元映射為數字索引。Vocab類就是為此設計的。它會統計所有詞元的頻率,并只保留那些出現頻率高于min_freq的詞元,其余的都歸為未知詞元<unk>。這不僅能減小詞匯表的大小,還能過濾掉噪音。

# utils_for_vocab.pydef count_corpus(tokens):"""統計詞元出現頻率參數:tokens (list): 詞元列表,維度: [詞元數] 或 [序列數 × 詞元數](嵌套列表)返回:counter (Counter): 詞元頻率統計對象,鍵為詞元,值為出現次數"""if len(tokens) == 0 or isinstance(tokens[0], list):tokens = [token for line in tokens for token in line]return Counter(tokens)class Vocab:"""文本詞匯表類,用于管理詞元到索引的映射關系"""def __init__(self, tokens=None, min_freq=0, reserved_tokens=None):"""初始化詞匯表參數:tokens (list): 詞元列表,維度: [詞元數] 或 [序列數 × 詞元數]min_freq (int): 最小詞頻閾值,維度: [標量],低于此頻率的詞元將被忽略reserved_tokens (list): 保留詞元列表,維度: [保留詞元數],如特殊標記"""if tokens is None:tokens = []if reserved_tokens is None:reserved_tokens = []counter = count_corpus(tokens)self._token_freqs = sorted(counter.items()<

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88429.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

化于無形的 lambda 語法

針對數據集合的每個成員進行計算是很常見的任務&#xff0c;用循環語句當然能實現&#xff0c;但比較麻煩&#xff0c;算個簡單的求和都要寫很多句代碼。 編程語言經常把這些運算封裝成函數&#xff0c;比如 Python 的 sum 函數&#xff0c;求訂單價格總和是這樣寫的&#xff…

day42

1. 回調函數&#xff1a;把一個函數當成“任務清單”交給另一個函數&#xff0c;等后者干完活&#xff0c;就按清單執行這個函數。比如點外賣后留電話&#xff0c;騎手送到了就打電話&#xff08;執行回調&#xff09;通知你。 2. lambda函數&#xff1a;臨時寫的超短函數&…

百度日志中臺前端重構實踐

日志中臺是百度內部針對打點數據的全生命周期管理平臺&#xff0c;作為公司日志數據的唯一入口&#xff0c;承擔以下核心職能&#xff1a;1.功能覆蓋&#xff1a;提供從數據采集、傳輸、存儲到查詢分析的一站式服務&#xff0c;支持產品運營分析、研發性能監控、運維管理等多元…

資訊安全 (Information Security)3大 “CIA“要素

資訊安全之3大要素&#xff0c;業界慣用"CIA"稱之&#xff0c;包括機密性 (Confidentiality)、完整性(Integrity)與可用性(Availability)&#xff1b;更應增加諸如鑑別性、可歸責性、不可否認性與可靠性。 1.機密性 (Confidentiality) 機密性是指採用適當的安全機制…

php后臺增加權限控制

背景 最近在對接某大廠&#xff0c;部署差不多了&#xff0c;但是在漏洞掃描環節有問題&#xff0c;前端是用vue代碼寫的。后端是php。發現前端路由可以攔截未登錄的url。但是后端php接口不用登錄就能訪問&#xff0c;很危險 解決方法 一、創建 Auth 中間件 首先創建一個專門…

跨平臺后端編程ASP.NET CORE Razor新一代Web開發框架C#

asp.net core Razor動態語言編程代替asp.net .aspx更高級嗎&#xff1f; https://blog.csdn.net/xiaoyao961/article/details/148846065 C#Blazor應用-跨平臺WEB開發VB.NET-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148846437 Products.razor文件,Blazor和…

Storm-Pulse 全國強對流預報接口深度解析:從技術原理到防災應用(附API接入示例)

2025年6月14日安徽省氣象臺發布的強對流黃色預警中&#xff0c;合肥、阜陽等地出現了小時雨量 30-50 毫米的短時強降水和8-10級雷暴大風&#xff0c;局地甚至觀測到云閃現象。強對流天氣是指由強烈上升氣流引發的突發性、高破壞力天氣現象&#xff0c;涵蓋了短時強降水、雷暴大…

2024中國科學技術大學計算機保研上機真題

中國科學技術大學計算機保研上機真題 在線測評鏈接&#xff1a;https://pgcode.cn/problem 運動會比賽日程安排 題目描述 某運動會設立 M M M 個比賽項目&#xff0c;每個運動員&#xff08;共 N N N 個運動員&#xff09;可以參加多個項目&#xff0c;每個項目的比賽時長…

(LeetCode 面試經典 150 題) 122. 買賣股票的最佳時機 II (貪心)

題目&#xff1a;122. 買賣股票的最佳時機 II 思路&#xff1a;貪心&#xff0c;時間復雜度0(n)。 當天比前一天值大&#xff0c;就進行賣出的交易。購入是默認前一天已購入。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int…

一篇文章了解XML

一、什么是 XML&#xff1f; XML 是一種結構化數據的標記語言&#xff0c;用來存儲、傳輸和描述數據。 它和 HTML 很像&#xff0c;但它的標簽是自定義的&#xff0c;不限定格式和外觀&#xff0c;而是強調數據的結構和含義。 XML不是用來展示數據的&#xff0c;HTML是用來展…

react經驗:i18n配置換行的富文本

應用場景 調用"useTranslations().rich"輸出換行的文本。 實施步驟 1.翻譯文件 例如:zh.json {"home":"第一行<br></br>第二行<font>加粗文本</font>" }2.調用rich處理標簽 t.rich(home, { br: () > <br /&g…

Wpf中控件作為Binding的源

1、Xaml代碼 Slider 滑動控件&#xff0c;設置了最小值0和最大值100&#xff0c;TextBox作為Binding的目標對象&#xff0c;它的Text屬性作為Binding目標的屬性&#xff0c;Binding的源的Source就是slider_test這個Slider滑動控件&#xff0c;Binding的源的Path就是slider_test…

【機器學習深度學習】典型的模型訓練過程

目錄 一、模型訓練直觀圖 二、核心目標 三、訓練過程詳解 3.1 訓練階段 1、準備起點&#xff1a;輸入數據 初始參數權重 2、模型嘗試預測&#xff1a;變換計算 (前向傳播) 3、檢查錯誤&#xff1a;計算損失值 4、學習的關鍵&#xff1a;反向傳播 梯度下降法 (調整權…

Mysql8.0版本未卸載干凈如何重新下載

Mysql8.0版本未卸載干凈如何重新下載 安裝前準備 清理現有安裝&#xff08;確保干凈環境&#xff09; :: 停止并卸載現有MySQL服務 net stop MySQL >nul 2>&1 sc delete MySQL >nul 2>&1:: 刪除舊數據目錄 rd /s /q "C:\ProgramData\MySQL" &…

垃圾收集器G1ZGC詳解

G1收集器(-XX:UseG1GC) G1 把堆劃分為許多大小相同的 Region&#xff08;默認 1~32 MB&#xff0c;一個堆通常包含上千個 Region&#xff0c;JVM目標是不超過2048個Region(JVM源碼里TARGET_REGION_NUMBER 定義)&#xff09; 不再是傳統的 Eden、Survivor、Old 靜態分代模型&…

Bootstrap 5學習教程,從入門到精通,Bootstrap 5 彈出框(Popovers) 語法知識點及案例(22)

Bootstrap 5 彈出框(Popovers) 語法知識點及案例 一、彈出框基本概念 彈出框(Popovers)是Bootstrap提供的一個小型覆蓋層組件&#xff0c;用于顯示額外的信息&#xff0c;當用戶點擊某個元素時出現&#xff0c;再次點擊時消失。 二、彈出框基本語法知識點 1. 必需屬性 dat…

輕巧靈動,智啟未來 ——Kinova Gen3 Lite 機器人輕松解鎖各行業自動化新姿勢

近年來&#xff0c;Kinova Gen3 Lite 機器人憑借其卓越的性能、靈活的應用能力以及出色的性價比&#xff0c;在全球范圍內掀起了一股熱銷狂潮。無論是科研機構、高校實驗室&#xff0c;還是工業制造企業&#xff0c;都對它青睞有加。其銷量持續攀升&#xff0c;市場占有率不斷擴…

STM32 實現PID

&#x1f9f1; 一、PID核心模塊&#xff08;模塊化設計&#xff09; 頭文件 pid_controller.h #pragma once #include <stdint.h>typedef struct {// 可調參數float Kp, Ki, Kd; // PID系數float output_min; // 輸出下限float output_max; // 輸出上…

基于MATLAB的BP神經網絡回歸模型在空氣質量預測中的應用

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔&#xff09;&#xff0c;如需數據代碼文檔可以直接到文章最后關注獲取。 1.項目背景 隨著城市化進程的加快和工業化的不斷發展&#xff0c;空氣質量問題日益受到廣泛關注。空氣中污染物如PM2.5、PM10、…

Linux docker拉取鏡像報錯解決

1、錯誤提示&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection 主要原因就是docker源不正確&#xff0c;需要配置一下。 2、報錯如下&#xff1a; 3、解決辦法&#x…