使用LSTM进行文本情感分析实例(2)

2023-05-16

数据集下载https://github.com/renjunxiang/Text-Classification

其他文本分析数据及数据处理代码https://github.com/renjunxiang/Text-Classification

一.流程分析

 1、创建train reader 和 test_reader

 2、创建lstm模型

 3、定义 words、label 张量

 4、优化函数、损失函数

 5、训练 & 保存模型

 6、使用模型进行预测

 

import os
from multiprocessing import cpu_count
import numpy as np
import paddle
import paddle.fluid as fluid
class classify():
    data_root_path = ""
    dict_path = "data/data9045/dict.txt"
    model_save_dir = "work/model_baseline/"
    test_data_path = "data/data9045/Test_IDs.txt"
    save_path = 'work/result.txt'
    # 获取字典长度
    def get_dict_len(d_path):
        with open(d_path, 'r', encoding='utf-8') as f:
            line = eval(f.readlines()[0])

        return len(line.keys())

    # 1、创建train reader 和 test_reader

    def data_mapper(sample):
        data, label = sample
        data = [int(data) for data in data.split(',')]
        return data, int(label)

    # 创建数据读取器train_reader
    def train_reader(train_data_path):
        def reader():
            with open(train_data_path, 'r') as f:
                lines = f.readlines()
                np.random.shuffle(lines)
                for line in lines:
                    # print (line)
                    data, label = line.split('\t')
                    yield data, label

        return paddle.reader.xmap_readers(classify.data_mapper, reader, cpu_count(), 1024)

    #  创建数据读取器val_reader
    def val_reader(val_data_path):
        def reader():
            with open(val_data_path, 'r') as f:
                lines = f.readlines()
                np.random.shuffle(lines)
                for line in lines:
                    data, label = line.split('\t')
                    yield data, label

        return paddle.reader.xmap_readers(classify.data_mapper, reader, cpu_count(), 1024)
    def test_reader(test_data_path):
        def reader():
            with open(test_data_path, 'r') as f:
                lines = f.readlines()
                # 打乱
                np.random.shuffle(lines)
                for line in lines:
                    data = line
                    yield data.strip(), -1
    # 创建lstm网络
    def lstm_net(data,
                   dict_dim,
                   class_dim=14,
                   emb_dim=128,
                   hid_dim=128,
                   hid_dim2=96,
                   ):
        """
        Lstm net
        """
        # embedding layer
        emb = fluid.layers.embedding(
            input=data,
            size=[dict_dim, emb_dim])
        fc0 = fluid.layers.fc(input=emb, size=hid_dim * 4)
        lstm_h, c = fluid.layers.dynamic_lstm(
            input=fc0, size=hid_dim * 4, is_reverse=False)
        # extract last layer
        lstm_last = fluid.layers.sequence_last_step(input=lstm_h)
        # full connect layer
        fc1 = fluid.layers.fc(input=lstm_last, size=hid_dim2, act='tanh')
        # softmax layer
        prediction = fluid.layers.fc(input=fc1, size=class_dim, act='softmax')
        return prediction

    def train(self):
        # 获取训练数据读取器和测试数据读取器
        train_reader = paddle.batch(reader=self.train_reader(os.path.join(self.data_root_path, "data/data9045/shuffle_Train_IDs.txt")),
            batch_size=128)
        val_reader = paddle.batch(reader=self.val_reader(os.path.join(self.data_root_path, "data/data9045/Val_IDs.txt")),
                                  batch_size=128)
        # 定义输入数据, lod_level不为0指定输入数据为序列数据
        words = fluid.layers.data(name='words', shape=[1], dtype='int64', lod_level=1)
        label = fluid.layers.data(name='label', shape=[1], dtype='int64')

        dict_dim = self.get_dict_len(self.dict_path)

        # 获取分类器
        model = self.lstm_net(words, dict_dim)

        # 获取损失函数和准确率
        cost = fluid.layers.cross_entropy(input=model, label=label)
        avg_cost = fluid.layers.mean(cost)
        acc = fluid.layers.accuracy(input=model, label=label)
        # 获取预测程序
        val_program = fluid.default_main_program().clone(for_test=True)
        # 定义优化方法
        optimizer = fluid.optimizer.AdagradOptimizer(learning_rate=0.0001)
        opt = optimizer.minimize(avg_cost)

        # 创建一个执行器,CPU训练速度比较慢,此处选择gpu还是cpu
        #place = fluid.CPUPlace()
        place = fluid.CUDAPlace(0)
        exe = fluid.Executor(place)
        # 进行参数初始化
        exe.run(fluid.default_startup_program())

        # 定义数据映射器
        feeder = fluid.DataFeeder(place=place, feed_list=[words, label])

        EPOCH_NUM = 1

        # 开始训练

        for pass_id in range(EPOCH_NUM):
            # 进行训练
            for batch_id, data in enumerate(train_reader()):
                # print(batch_id,len(data))
                train_cost, train_acc = exe.run(program=fluid.default_main_program(),
                                                feed=feeder.feed(data),
                                                fetch_list=[avg_cost, acc])
                if batch_id % 100 == 0:
                    print('Pass:%d, Batch:%d, Cost:%0.5f, Acc:%0.5f' % (pass_id, batch_id, train_cost[0], train_acc[0]))
                    # 进行测试
                    val_costs = []
                    val_accs = []
                    for batch_id, data in enumerate(val_reader()):
                        val_cost, val_acc = exe.run(program=val_program,
                                                    feed=feeder.feed(data),
                                                    fetch_list=[avg_cost, acc])
                        val_costs.append(val_cost[0])
                        val_accs.append(val_acc[0])
            # 计算每个epoch平均预测损失在和准确率
            val_cost = (sum(val_costs) / len(val_costs))
            val_acc = (sum(val_accs) / len(val_accs))
            print('Test:%d, Cost:%0.5f, ACC:%0.5f' % (pass_id, val_cost, val_acc))
            # 保存预测模型
            if not os.path.exists(self.model_save_dir):
                os.makedirs(self.model_save_dir)
            fluid.io.save_inference_model(self.model_save_dir,
                                          feeded_var_names=[words.name],
                                          target_vars=[model],
                                          executor=exe)
        print('训练模型保存完成!')
        self.test(self)
        print('测试输出已生成!')
    

    # 获取数据
    def get_data(self, sentence):
        # 读取数据字典
        with open(self.dict_path, 'r', encoding='utf-8') as f_data:
            dict_txt = eval(f_data.readlines()[0])
        dict_txt = dict(dict_txt)
        # 把字符串数据转换成列表数据
        keys = dict_txt.keys()
        data = []
        for s in sentence:
            # 判断是否存在未知字符
            if not s in keys:
                s = '<unk>'
            data.append(int(dict_txt[s]))
        return data

    def test(self):
        data = []
        # 获取预测数据
        with open(self.test_data_path, 'r', encoding='utf-8') as test_data:
            lines = test_data.readlines()
        print('test start')
        for line in lines:
            tmp_sents = []
            for word in line.strip().split(','):
                tmp_sents.append(int(word))
            data.append(tmp_sents)
        '''
        a=self.get_data(self, 'w我是共产主义接班人!')
        data=[a]
        '''
        print(len(data))
        def load_tensor(data):
            # 获取每句话的单词数量
            base_shape = [[len(c) for c in data]]
            # 创建一个执行器,CPU训练速度比较慢
            #place = fluid.CPUPlace()
            #GPU
            place = fluid.CUDAPlace(0)
            print('loading tensor')
            # 生成预测数据
            tensor_words = fluid.create_lod_tensor(data, base_shape, place)
            #infer_place = fluid.CPUPlace()
            infer_place = fluid.CUDAPlace(0)
            # 执行预测
            infer_exe = fluid.Executor(infer_place)
            # 进行参数初始化
            infer_exe.run(fluid.default_startup_program())
            # 从模型中获取预测程序、输入数据名称列表、分类器
            print('load_model')
            [infer_program, feeded_var_names, target_var] = fluid.io.load_inference_model(dirname=self.model_save_dir,
                                                                                          executor=infer_exe)
            print('getting_ans')
            result = infer_exe.run(program=infer_program,
                                   feed={feeded_var_names[0]: tensor_words},
                                   fetch_list=target_var)
    
            names = ["财经", "彩票", "房产", "股票", "家居", "教育", "科技",
                     "社会", "时尚", "时政", "体育", "星座", "游戏", "娱乐"]
            print('output')
            # 输出结果
            for i in range(len(data)):
                lab = np.argsort(result)[0][i][-1]
                # print('预测结果标签为:%d, 名称为:%s, 概率为:%f' % (lab, names[lab], result[0][i][lab]))
                with open(self.save_path, 'a', encoding='utf-8') as ans:
                    ans.write(names[lab] + "\n")
            ans.close()
        print('loading 1/4 data')
        load_tensor(data[:int(len(data)/4)])
        print('loading 2/4 data')
        load_tensor(data[int(len(data)/4):2*int(len(data)/4)])
        print('loading 3/4 data')
        load_tensor(data[2*int(len(data)/4):3*int(len(data)/4)])
        print('loading 4/4 data')
        load_tensor(data[3*int(len(data)/4):])
        print('测试输出已生成!')
    
if __name__ == "__main__":
    classify.train(classify)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用LSTM进行文本情感分析实例(2) 的相关文章

随机推荐

  • 数据结构之串和数组基本知识和问题

    串 1 串 xff08 又称字符串 xff09 是一种特殊的线性表 xff0c 它的每个结点仅由一个字符组成 从数据结构的观点来说 xff0c 串是一种特殊的线性表 但就数据类型而言 xff0c 串不是线性表 串 xff08 String
  • 计算机考研复试之C语言简答题 开放题目

    为考研准备整理 xff0c 参考网络资料课本资料 xff0c 主要是c的简答开放题目有用的话可以点个赞 xff0c 可以看着目录尝试自己回答后在进行往下看 目录 特点 c 语言的主要用途 xff1a c语言为什么要规定 xff0c 对所有使
  • 复试数据结构之排序知识点+简答题

    排序方法的选用一般考虑的原则有 xff1a xff08 1 xff09 待排序的记录个数n xff0c xff08 2 xff09 记录的大小 xff08 3 xff09 关键字的分布情况 xff1b 4 对排序稳定性的要求等 平均时间性能
  • 数据结构之图 和问答题

    数据结构之图 和问答题 目录 数据结构之图 和问答题 图的定义和术语 图的存储结构 图的遍历 连通网的最小生成树 单源最短路径 拓扑排序 关键路径 广义表 图的定义和术语 邻接点 度 入度 出度 路径 路径长度 简单路径 简单回路 连通图
  • 复试口语常见话题整理以及华师18 19年topic

    报考华师已经上岸整理往年英语topic和一些常考话题 以及2020复试口语 xff0c 今年问题比较常规问了家乡 xff0c 喜欢的书 电影 规划报考学校等 辛苦整理 xff0c 有用记得点赞 目录 针对于自己不熟悉的话题的时候 xff1a
  • Vim配置

    1 比较全的Vim配置 34 Vim通用配置 set nocompatible 34 be iMproved required syntax on set confirm 34 在处理未保存或只读文件的时候 xff0c 弹出确认 set a
  • 知识追踪理论入门

    what 知识追踪 xff08 Knowledge Tracing xff09 是根据学生过去的答题情况对学生的知识掌握情况进行建模 xff0c 从而得到学生当前知识状态表示的一种技术 便我们能准确地预测学生对于各个知识概念的掌握程度 xf
  • 多媒体集成课程设计要求

    学 院 数计学院 出卷教师 XX 系主任签名 制卷份数 专 业 计算机科学与技术 班级编号 B14082021 41 51 XX大学2018 2019学年第 2 学期 考 核 要 求 课程编号 xff1a 400802003 课程名称 xf
  • 多媒体课程设计详细文档+

    目录 一 目的与要求 2 二 作品简介 2 三 素材的收集与制作 10 四 设计步骤 11 4 1整体的流程图 11 4 2导入声音文件 12 4 3首页的设计 12 4 4密码输入和用户登录页面 13 4 5按钮交互相应设计 16 4 6
  • 编译原理期末考点

    题型 单选5个 10分 填空10个 20分 简答2个 10分 解答9个 60分 最后3题 xff0c 每个10分 目录 第一章 第二章 第三章 第四章 第五章 第六章 第一章 什么是编译程序 把某一种高级语言程序等价的转换成另一种低级语言的
  • 数据挖掘之航空公司客户价值分析

    课程设计选题 xff1a 详细文档项目见https download csdn net download sereasuesue 12050550 题目 xff1a 航空公司客户价值分析 目录 一 任务背景 2 二 数据挖掘目标 2 三 数
  • RNN 循环/递归神经网络入门

    目录 RNN 循环 递归神经网络 RNN概述 RNN模型 LSTM长短记忆网络 LSTM结构 细胞状态 xff1a 决定丢弃信息 确定更新的信息 更新细胞状态 输出信息 GRU算法 值得学习的博客记录 RNN 循环 递归神经网络 RNN概述
  • 神经网络、图像分类、卷积网络等,论文推荐附论文地址

    喜欢收集资源 xff0c 一起分享交流 具体见https www tinymind cn articles 4265 循环神经网络部分 No33 QRNN模型论文 xff1a 在RNN模型的cell里 xff0c 如果还只知道LSTM和GR
  • jupyter notebook使用教程初学者必备

    目录 安装与打开 jupyter notebook常见命令 更改工作路径亲测成功 方法一 方法2 方法3 快捷键 Jupyter Notebook如何导入代码 安装与打开 安装Anaconda会一起打包安装 或者pip然后打开jupyter
  • 《面向对象程序设计》课程设计

    一 课程设计题目 结合实际 xff0c 用面向对象程序设计的思想设计一个应用实例 xff0c 要求用到下面设计要求中提到的知识点5个以上 二 设计要求 通过此次课程设计 xff0c 更好地掌握面向对象程序设计的基本概念及编程方法 xff0c
  • 深度知识追踪(Deep Knowledge Tracing)论文学习(简要归纳)

    深度知识追踪 xff08 Deep Knowledge Tracing xff09 Chris Piech Jonathan Spencer Jonathan Huang Surya Ganguli Mehran Sahami Leonid
  • Build  tools  for  Visual Studio  2015 / 2017 / 2019  cannot be found ,Windows10环境 OpenVINO 运行demo例子

    1 问题描述 xff1a 在windows10 环境下 配置安装完成OpenVINO xff0c 在进入demo目录 xff0c 验证环境是否配置成功时 在下载完各项依赖 xff0c 出现如下问题 xff1a vswhere 不是内部或外部
  • 机器学习&深度学习资料计算机视觉等汇总的链接(1)

    机器学习 amp 深度学习资料汇总的链接记录 xff0c 方便以后查询 https bbs cvmart net articles 1316 https bbs cvmart net Github page 61 1 计算机视觉知识点总结
  • 使用LSTM进行情感分析学习实例一含数据和代码分析

    使用LSTM进行情感分析 原理见https mp csdn net console editor html 108697113 数据集见下文https pan baidu com s 1SctPmfFlq6ilY2bxcXHIFA 使用ke
  • 使用LSTM进行文本情感分析实例(2)

    数据集下载https github com renjunxiang Text Classification 其他文本分析数据及数据处理代码https github com renjunxiang Text Classification 一