計算機競賽 GRU的 電影評論情感分析 - python 深度學習 情感分類

1 前言

🔥學長分享優質競賽項目,今天要分享的是

🚩 GRU的 電影評論情感分析 - python 深度學習 情感分類

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:3分
  • 工作量:3分
  • 創新點:4分

這是一個較為新穎的競賽課題方向,學長非常推薦!

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

1 項目介紹

其實,很明顯這個項目和微博謠言檢測是一樣的,也是個二分類的問題,因此,我們可以用到學長之前提到的各種方法,即:

樸素貝葉斯或者邏輯回歸以及支持向量機都可以解決這個問題。

另外在深度學習中,我們可以用CNN-Text或者RNN以及LSTM等模型最好。

當然在構建網絡中也相對簡單,相對而言,LSTM就比較復雜了,為了讓不同層次的同學們可以接受,學長就用了相對簡單的GRU模型。

如果大家想了解LSTM。以后,學長會給大家詳細介紹。

2 情感分類介紹

其實情感分析在自然語言處理中,情感分析一般指判斷一段文本所表達的情緒狀態,屬于文本分類問題。一般而言:情緒類別:正面/負面。當然,這就是為什么本人在前面提到情感分析實際上也是二分類問題的原因。

3 數據集

學長本次使用的是非常典型的IMDB數據集。

該數據集包含來自互聯網的50000條嚴重兩極分化的評論,該數據被分為用于訓練的25000條評論和用于測試的25000條評論,訓練集和測試集都包含50%的正面評價和50%的負面評價。該數據集已經經過預處理:評論(單詞序列)已經被轉換為整數序列,其中每個整數代表字典中的某個單詞。

查看其數據集的文件夾:這是train和test文件夾。

在這里插入圖片描述

接下來就是以train文件夾介紹里面的內容
在這里插入圖片描述

然后就是以neg文件夾介紹里面的內容,里面會有若干的text文件:
在這里插入圖片描述

4 實現

4.1 數據預處理

    #導入必要的包
?    import zipfile
?    import os
?    import io
?    import random
?    import json
?    import matplotlib.pyplot as plt
?    import numpy as np
?    import paddle
?    import paddle.fluid as fluid
?    from paddle.fluid.dygraph.nn import Conv2D, Pool2D, Linear, Embedding
?    from paddle.fluid.dygraph.base import to_variable
?    from paddle.fluid.dygraph import GRUUnit
?    import paddle.dataset.imdb as imdb?    
?    
?    #加載字典
?    def load_vocab():
?        vocab = imdb.word_dict()
?        return vocab
?    #定義數據生成器
?    class SentaProcessor(object):
?        def __init__(self):
?            self.vocab = load_vocab()def data_generator(self, batch_size, phase='train'):if phase == "train":return paddle.batch(paddle.reader.shuffle(imdb.train(self.vocab),25000), batch_size, drop_last=True)elif phase == "eval":return paddle.batch(imdb.test(self.vocab), batch_size,drop_last=True)else:raise ValueError("Unknown phase, which should be in ['train', 'eval']")

步驟

  1. 首先導入必要的第三方庫

  2. 接下來就是數據預處理,需要注意的是:數據是以數據標簽的方式表示一個句子,因此,每個句子都是以一串整數來表示的,每個數字都是對應一個單詞。當然,數據集就會有一個數據集字典,這個字典是訓練數據中出現單詞對應的數字標簽。

4.2 構建網絡

這次的GRU模型分為以下的幾個步驟

  • 定義網絡
  • 定義損失函數
  • 定義優化算法

具體實現如下

?

    #定義動態GRUclass DynamicGRU(fluid.dygraph.Layer):def __init__(self,size,param_attr=None,bias_attr=None,is_reverse=False,gate_activation='sigmoid',candidate_activation='relu',h_0=None,origin_mode=False,):super(DynamicGRU, self).__init__()self.gru_unit = GRUUnit(size * 3,param_attr=param_attr,bias_attr=bias_attr,activation=candidate_activation,gate_activation=gate_activation,origin_mode=origin_mode)self.size = sizeself.h_0 = h_0self.is_reverse = is_reversedef forward(self, inputs):hidden = self.h_0res = []for i in range(inputs.shape[1]):if self.is_reverse:i = inputs.shape[1] - 1 - iinput_ = inputs[ :, i:i+1, :]input_ = fluid.layers.reshape(input_, [-1, input_.shape[2]], inplace=False)hidden, reset, gate = self.gru_unit(input_, hidden)hidden_ = fluid.layers.reshape(hidden, [-1, 1, hidden.shape[1]], inplace=False)res.append(hidden_)if self.is_reverse:res = res[::-1]res = fluid.layers.concat(res, axis=1)return res

?
class GRU(fluid.dygraph.Layer):
def init(self):
super(GRU, self).init()
self.dict_dim = train_parameters[“vocab_size”]
self.emb_dim = 128
self.hid_dim = 128
self.fc_hid_dim = 96
self.class_dim = 2
self.batch_size = train_parameters[“batch_size”]
self.seq_len = train_parameters[“padding_size”]
self.embedding = Embedding(
size=[self.dict_dim + 1, self.emb_dim],
dtype=‘float32’,
param_attr=fluid.ParamAttr(learning_rate=30),
is_sparse=False)
h_0 = np.zeros((self.batch_size, self.hid_dim), dtype=“float32”)
h_0 = to_variable(h_0)

        self._fc1 = Linear(input_dim=self.hid_dim, output_dim=self.hid_dim*3)self._fc2 = Linear(input_dim=self.hid_dim, output_dim=self.fc_hid_dim, act="relu")self._fc_prediction = Linear(input_dim=self.fc_hid_dim,output_dim=self.class_dim,act="softmax")self._gru = DynamicGRU(size=self.hid_dim, h_0=h_0)def forward(self, inputs, label=None):emb = self.embedding(inputs)o_np_mask =to_variable(inputs.numpy().reshape(-1,1) != self.dict_dim).astype('float32')mask_emb = fluid.layers.expand(to_variable(o_np_mask), [1, self.hid_dim])emb = emb * mask_embemb = fluid.layers.reshape(emb, shape=[self.batch_size, -1, self.hid_dim])fc_1 = self._fc1(emb)gru_hidden = self._gru(fc_1)gru_hidden = fluid.layers.reduce_max(gru_hidden, dim=1)tanh_1 = fluid.layers.tanh(gru_hidden)fc_2 = self._fc2(tanh_1)prediction = self._fc_prediction(fc_2)if label is not None:acc = fluid.layers.accuracy(prediction, label=label)return prediction, accelse:return prediction

4.3 訓練模型

?

    def train():with fluid.dygraph.guard(place = fluid.CUDAPlace(0)): # # 因為要進行很大規模的訓練,因此我們用的是GPU,如果沒有安裝GPU的可以使用下面一句,把這句代碼注釋掉即可# with fluid.dygraph.guard(place = fluid.CPUPlace()):

?
processor = SentaProcessor()
train_data_generator = processor.data_generator(batch_size=train_parameters[“batch_size”], phase=‘train’)

        model = GRU()sgd_optimizer = fluid.optimizer.Adagrad(learning_rate=train_parameters["lr"],parameter_list=model.parameters())steps = 0Iters, total_loss, total_acc = [], [], []for eop in range(train_parameters["epoch"]):for batch_id, data in enumerate(train_data_generator()):steps += 1doc = to_variable(np.array([np.pad(x[0][0:train_parameters["padding_size"]], (0, train_parameters["padding_size"] - len(x[0][0:train_parameters["padding_size"]])),'constant',constant_values=(train_parameters["vocab_size"]))for x in data]).astype('int64').reshape(-1))label = to_variable(np.array([x[1] for x in data]).astype('int64').reshape(train_parameters["batch_size"], 1))model.train()prediction, acc = model(doc, label)loss = fluid.layers.cross_entropy(prediction, label)avg_loss = fluid.layers.mean(loss)avg_loss.backward()sgd_optimizer.minimize(avg_loss)model.clear_gradients()if steps % train_parameters["skip_steps"] == 0:Iters.append(steps)total_loss.append(avg_loss.numpy()[0])total_acc.append(acc.numpy()[0])print("step: %d, ave loss: %f, ave acc: %f" %(steps,avg_loss.numpy(),acc.numpy()))if steps % train_parameters["save_steps"] == 0:save_path = train_parameters["checkpoints"]+"/"+"save_dir_" + str(steps)print('save model to: ' + save_path)fluid.dygraph.save_dygraph(model.state_dict(),save_path)draw_train_process(Iters, total_loss, total_acc)

在這里插入圖片描述
在這里插入圖片描述

4.4 模型評估

在這里插入圖片描述

結果還可以,這里說明的是,剛開始的模型訓練評估不可能這么好,很明顯是過擬合的問題,這就需要我們調整我們的epoch、batchsize、激活函數的選擇以及優化器、學習率等各種參數,通過不斷的調試、訓練最好可以得到不錯的結果,但是,如果還要更好的模型效果,其實可以將GRU模型換為更為合適的RNN中的LSTM以及bi-
LSTM模型會好很多。

4.5 模型預測

train_parameters["batch_size"] = 1
with fluid.dygraph.guard(place = fluid.CUDAPlace(0)):sentences = 'this is a great movie'data = load_data(sentences)print(sentences)print(data)data_np = np.array(data)data_np = np.array(np.pad(data_np,(0,150-len(data_np)),"constant",constant_values =train_parameters["vocab_size"])).astype('int64').reshape(-1)infer_np_doc = to_variable(data_np)model_infer = GRU()model, _ = fluid.load_dygraph("data/save_dir_750.pdparams")model_infer.load_dict(model)model_infer.eval()result = model_infer(infer_np_doc)print('預測結果為:正面概率為:%0.5f,負面概率為:%0.5f' % (result.numpy()[0][0],result.numpy()[0][1]))

在這里插入圖片描述

訓練的結果還是挺滿意的,到此為止,我們的本次項目實驗到此結束。

5 最后

🧿 更多資料, 項目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相關文章

代碼隨想錄算法訓練營第三十八天 | 理論基礎,509. 斐波那契數,70. 爬樓梯,746. 使用最小花費爬樓梯

代碼隨想錄算法訓練營第三十八天 | 理論基礎,509. 斐波那契數,70. 爬樓梯,746. 使用最小花費爬樓梯 理論基礎什么是動態規劃動態規劃的解題步驟動態規劃應該如何debug 509. 斐波那契數遞歸解法 70. 爬樓梯746. 使用最小花費爬樓梯 理論基礎 視…

計蒜客T1170——人民幣支付

超級水&#xff0c;不解釋&#xff0c;代碼的處理方式減低了繁瑣程度&#xff0c; #include <iostream> using namespace std;int main(int argc, char** argv) {int num0;cin>>num;int money[6]{100,50,20,10,5,1};for(int i0;i<5;i){int count0;countnum/mone…

SkyWalking 部署(包含ES)

SkyWalking安裝 結構 首先SkyWalking主要需要oapService、webApp、Elasticsearch&#xff08;可選存儲&#xff09;三個&#xff0c;接下來講一下這三個的安裝步驟&#xff0c;安裝過程中出現了一些細小的配置錯誤&#xff0c;導致用了快兩天才弄好&#xff0c;麻木了&#x…

C++超基礎語法

&#x1f493;博主個人主頁:不是笨小孩&#x1f440; ?專欄分類:數據結構與算法&#x1f440; C&#x1f440; 刷題專欄&#x1f440; C語言&#x1f440; &#x1f69a;代碼倉庫:笨小孩的代碼庫&#x1f440; ?社區&#xff1a;不是笨小孩&#x1f440; &#x1f339;歡迎大…

IDEA常用工具配置

IDEA常用工具&配置 如果發現插件市場用不了&#xff0c;可以設置Http Proxy&#xff0c;在該界面上點擊”Check connection“并輸入的地址&#xff1a;https://plugins.jetbrains.com/ 。 一、常用插件 1、MybatisX Mybaits Plus插件&#xff0c;支持java與xml互轉 2、F…

Vue-10.集成.env

.env、.env.development 和 .env.preview .env、.env.development 和 .env.preview 文件是用于配置環境變量和應用程序設置的文件&#xff0c;它們在項目開發和部署過程中起到關鍵作用。這些文件用于在不同的環境中設置不同的變量值&#xff0c;以滿足不同環境下的配置需求。 …

日志系統——日志格式化模塊設計

一&#xff0c;模塊主要成員 該模塊的主要作用是對日志消息進行格式化&#xff0c;將日志消息組織成制定格式的字符串。 該模塊主要成員有兩個&#xff1a;1.格式化字符串。 2.格式化子項數組 1.1 格式化字符串 格式化字符串的主要功能是保存日志輸出的格式字符串。其格式化字…

WPF 界面結構化處理

文章目錄 概要一、xaml界面結構化處理二、邏輯樹與視覺樹 概要 WPF 框架是開源的&#xff0c;但是不能跨平臺&#xff0c;可以使用MAUI&#xff0c;這個框架可以跨平臺&#xff0c;WPF源碼可以在github上下載&#xff0c;下載地址&#xff1a;https://gitbub.com/dotnet/wpf。…

【C++ 記憶站】命名空間

文章目錄 命名空間概念命名空間的定義1、正常的命名空間定義2、命名空間可以嵌套3、同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中 命名空間的使用1、加命名空間名稱及作用域限定符2、使用using將命名空間中某個成員引入3、使用using namespac…

初試時間官宣!研招網發布下半年重要時間節點!今日速報來了

距24考研初試還有127天&#xff0c;今天給大家帶來初試和報名時間官宣消息、考研報名注意事項、研招網發布的2024考研“保姆級”下半年重要時間節點。有用記得收藏 24考研報名和初試時間官宣 已有學校在招生簡章中明確24考研初試時間 初試時間預計為&#xff1a;2023年12月23…

初試rabbitmq

rabbitmq的七種模式 Hello word 客戶端引入依賴 <!--rabbitmq 依賴客戶端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生產者 imp…

邀請函|澎峰科技邀您參加CCF HPC China2023

一年一度的全球超算盛會&#xff01; 以“算力互聯智領未來”為主題的第十九屆全國高性能計算學術年會&#xff08;CCF HPC China 2023&#xff09;將于8月24-26日&#xff08;展覽23-25日&#xff09;在青島紅島國際會議展覽中心舉辦。 九大院士領銜 打造頂級超算盛會 力邀…

《離散數學及其應用(原書第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 樹的性質 節 第664頁的例9說明

《離散數學及其應用&#xff08;原書第8版&#xff09;》ISBN978-7-111-63687-8 第11章 11.1.3 樹的性質 節 第664頁的定理3的引申 定理3 帶有i個內點的m叉樹含有nmi1個頂點 見本人博文 內點定義不同的討論 如果對于一個m叉正則樹&#xff0c;即任意分支節點的兒子恰好有m個&am…

談談IP地址和子網掩碼的概念及應用

個人主頁&#xff1a;insist--個人主頁?????? 本文專欄&#xff1a;網絡基礎——帶你走進網絡世界 本專欄會持續更新網絡基礎知識&#xff0c;希望大家多多支持&#xff0c;讓我們一起探索這個神奇而廣闊的網絡世界。 目錄 一、IP地址的概念 二、IP地址的分類 1、A類 …

長勝證券:散戶可以隨大流嗎?怎么做才好?

在我國的股市里邊&#xff0c;最不缺的或許便是散戶了&#xff0c;一方面&#xff0c;散戶促進了股市的活潑&#xff0c;可一方面又特容易望風而動&#xff0c;追漲殺跌。因此&#xff0c;散戶能夠隨大流嗎&#xff1f;該怎么做才好&#xff1f;對于這些&#xff0c;長勝證券為…

IntelliJ IDEA熱部署:JRebel插件的安裝與使用

熱部署 概述JRebel 概述 熱部署&#xff0c;指修改代碼后&#xff0c;無需停止應用程序&#xff0c;即可使修改后的代碼生效&#xff0c;其有利于提高開發效率。 熱部署方式&#xff1a; 手動熱部署&#xff1a;修改代碼后&#xff0c;重新編譯項目&#xff0c;然后啟動應用程…

Springboot項目啟動后按順序加載自定義類 (demo)

1. 實現ApplicationRunner接口, 重寫run方法 import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframewor…

IDEA啟動報錯java.nio.charset.MalformedInputException: Input length=2

IDEA啟動報錯java.nio.charset.MalformedInputException: Input length2 問題解決后記 問題 原本系統運行好好得&#xff0c;一段時間沒打開&#xff0c;再次打開重啟 IDEA啟動報錯java.nio.charset.MalformedInputException: Input length2。 解決 百度了 https://blog.csd…

使用 Qt 生成 Word 和 PDF 文檔的詳細教程

系列文章目錄 文章目錄 系列文章目錄前言一、安裝 Qt二、生成 Word 文檔三、生成 PDF 文檔四、運行代碼并查看結果五、自定義文檔內容總結前言 Qt 是一個跨平臺的應用程序開發框架,除了用于創建圖形界面應用程序外,還可以用來生成 Word 和 PDF 文檔。本文將介紹如何使用 Qt …

【C語言】const修飾普通變量和指針

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家了解const修飾普通變量和指針&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 文章目錄 一.const修飾普通變量二.const修飾指針1.const 放在 * 左邊2.const 放在…