相关文章:
【深度学习项目一】全连接神经网络实现mnist数字识别](https://blog.csdn.net/sinat_39620217/article/details/116749255?spm=1001.2014.3001.5501)
【深度学习项目二】卷积神经网络LeNet实现minst数字识别
【深度学习项目三】ResNet50多分类任务【十二生肖分类】
『深度学习项目四』基于ResNet101人脸特征点检测
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/1994431?contributionType=1

1. NLP知识简介

情感分析,是文本分类任务的经典场景:

  • 输入:一个自然语言句子。
  • 输出:输出这个句子的情感分类,如高兴、伤心
    通常看作一个三分类问题:
  • 正向:表示正面积极的情感,如高兴、喜欢。
  • 负向:表示负面消极的情感,如难过、讨厌。
  • 中性:其他类型的情感。

2. NLP原理介绍

数据处理通用流程 以句子分类为例

  • 词汇表长度5w

  • 词向量纬度: 500

  • 批处理句子数Batch_ size : 128,

  • 统-句子长度num. token: 3

  • 词向量纬度Emb_ dimension : 500

  • 句子向量纬度Emb. size: 200

首先进行切词,将词通过唯一的one-hot向量表示得到唯一ID,再乘以词向量表得到表示矩阵,进行批处理得到[128,3,5]的词向量.长度统一:短补长截

如何刻画句子的语义信息

2.1 序列处理法:

2.1.1 循环神经网络RNN

RNN是两种神经网络模型的缩写,一种是递归神经网络(Recursive Neural Network),一种是循环神经网络(Recurrent Neural Network)。虽然这两种神经网络有着千丝万缕的联系,但是本文主要讨论的是第二种神经网络模型——循环神经网络(Recurrent Neural Network)
RNN网络和其他网络最大的不同就在于RNN能够实现某种“记忆功能”,是进行时间序列分析时最好的选择。如同人类能够凭借自己过往的记忆更好地认识这个世界一样。RNN也实现了类似于人脑的这一机制,对所处理过的信息留存有一定的记忆,而不像其他类型的神经网络并不能对处理过的信息留存记忆。

由上图可以看出:一个典型的RNN网络包含一个输入x,一个输出h和一个神经网络单元A。和普通的神经网络不同的是,RNN网络的神经网络单元A不仅仅与输入和输出存在联系,其与自身也存在一个回路。这种网络结构就揭示了RNN的实质:上一个时刻的网络状态信息将会作用于下一个时刻的网络状态。如果上图的网络结构仍不够清晰,RNN网络还能够以时间序列展开成如下形式:

等号右边是RNN的展开形式。由于RNN一般用来处理序列信息,因此下文说明时都以时间序列来举例,解释。等号右边的等价RNN网络中最初始的输入是x0,输出是h0,这代表着0时刻RNN网络的输入为x0,输出为h0,网络神经元在0时刻的状态保存在A中。当下一个时刻1到来时,此时网络神经元的状态不仅仅由1时刻的输入x1决定,也由0时刻的神经元状态决定。以后的情况都以此类推,直到时间序列的末尾t时刻。

上面的过程可以用一个简单的例子来论证:假设现在有一句话“I want to play basketball”,由于自然语言本身就是一个时间序列,较早的语言会与较后的语言存在某种联系,例如刚才的句子中“play”这个动词意味着后面一定会有一个名词,而这个名词具体是什么可能需要更遥远的语境来决定,因此一句话也可以作为RNN的输入。回到刚才的那句话,这句话中的5个单词是以时序出现的,我们现在将这五个单词编码后依次输入到RNN中。首先是单词“I”,它作为时序上第一个出现的单词被用作x0输入,拥有一个h0输出,并且改变了初始神经元A的状态。单词“want”作为时序上第二个出现的单词作为x1输入,这时RNN的输出和神经元状态将不仅仅由x1决定,也将由上一时刻的神经元状态或者说上一时刻的输入x0决定。之后的情况以此类推,直到上述句子输入到最后一个单词“basketball”。

RNN的神经元结构:

上图依然是一个RNN神经网络的时序展开模型,中间t时刻的网络模型揭示了RNN的结构。可以看到,原始的RNN网络的内部结构非常简单。神经元A在t时刻的状态仅仅是t-1时刻神经元状态与t时刻网络输入的双曲正切函数的值,这个值不仅仅作为该时刻网络的输出,也作为该时刻网络的状态被传入到下一个时刻的网络状态中,这个过程叫做RNN的正向传播(forward propagation)。

2.1.2 长短时记忆网络LSTM

2.1.3 全连接层、线性分类器

# 下载paddlenlp
!pip install --upgrade paddlenlp -i https://pypi.org/simple
import paddle
import paddlenlp print(paddle.__version__, paddlenlp.__version__)

2.2 PaddleNLP和Paddle框架是关系

  • Paddle框架是基础底座,提供深度学习任务全流程API。PaddleNLP基于Paddle框架开发,适用于NLP任务。

PaddleNLP中数据处理、数据集、组网单元等API未来会沉淀到框架paddle.text中。

  • 代码中继承
    class TSVDataset(paddle.io.Dataset)

2.3 使用飞桨完成深度学习任务的通用流程

import numpy as np
from functools import partial import paddle.nn as nn
import paddle.nn.functional as F
import paddlenlp as ppnlp
from paddlenlp.data import Pad, Stack, Tuple
from paddlenlp.datasets import MapDataset from utils import load_vocab, convert_example

3. 数据集和数据处理

3.1 自定义数据集

映射式(map-style)数据集需要继承paddle.io.Dataset

  • __getitem__: 根据给定索引获取数据集中指定样本,在 paddle.io.DataLoader 中需要使用此函数通过下标获取样本。

  • __len__: 返回数据集样本个数, paddle.io.BatchSampler 中需要样本个数生成下标序列。

下面分为两种编写方法:

from paddlenlp.datasets import load_dataset

def read(data_path):
with open(data_path, 'r', encoding='utf-8') as f:
for line in f:
l = line.strip('\n').split('\t')
if len(l) != 2:
print (len(l), line)
words, labels = line.strip('\n').split('\t')
# words = words.split('\002')
# labels = labels.split('\002')
yield {'tokens': words, 'labels': labels} # data_path为read()方法的参数
train_ds = load_dataset(read, data_path='train.txt',lazy=False)
dev_ds = load_dataset(read, data_path='dev.txt',lazy=True) #验证数据集
test_ds = load_dataset(read, data_path='test.txt',lazy=True)
# class SelfDefinedDataset(paddle.io.Dataset):
# def __init__(self, data):
# super(SelfDefinedDataset, self).__init__()
# self.data = data # def __getitem__(self, idx):
# return self.data[idx] # def __len__(self):
# return len(self.data) # def get_labels(self):
# return ["0", "1"] # def txt_to_list(file_name):
# res_list = []
# for line in open(file_name):
# res_list.append(line.strip().split('\t'))
# return res_list # trainlst = txt_to_list('train.txt')
# devlst = txt_to_list('dev.txt')
# testlst = txt_to_list('test.txt') # train_ds, dev_ds, test_ds = SelfDefinedDataset.get_datasets([trainlst, devlst, testlst])
for i in range(20):
print (train_ds[i])
{'tokens': '赢在心理,输在出品!杨枝太酸,三文鱼熟了,酥皮焗杏汁杂果可以换个名(九唔搭八)', 'labels': '0'}
{'tokens': '服务一般,客人多,服务员少,但食品很不错', 'labels': '1'}
{'tokens': '東坡肉竟然有好多毛,問佢地點解,佢地仲話係咁架\ue107\ue107\ue107\ue107\ue107\ue107\ue107冇天理,第一次食東坡肉有毛,波羅包就幾好食', 'labels': '0'}
{'tokens': '父亲节去的,人很多,口味还可以上菜快!但是结账的时候,算错了没有打折,我也忘记拿清单了。说好打8折的,收银员没有打,人太多一时自己也没有想起。不知道收银员忘记,还是故意那钱露入自己钱包。。', 'labels': '0'}
{'tokens': '吃野味,吃个新鲜,你当然一定要来广州吃鹿肉啦*价格便宜,量好足,', 'labels': '1'}
{'tokens': '味道几好服务都五错推荐鹅肝乳鸽飞鱼', 'labels': '1'}
{'tokens': '作为老字号,水准保持算是不错,龟岗分店可能是位置问题,人不算多,基本不用等位,自从抢了券,去过好几次了,每次都可以打85以上的评分,算是可以了~粉丝煲每次必点,哈哈,鱼也不错,还会来帮衬的,楼下还可以免费停车!', 'labels': '1'}
{'tokens': '边到正宗啊?味味都咸死人啦,粤菜讲求鲜甜,五知点解感多人话好吃。', 'labels': '0'}
{'tokens': '环境卫生差,出品垃圾,冇下次,不知所为', 'labels': '0'}
{'tokens': '和苑真是精致粤菜第一家,服务菜品都一流', 'labels': '1'}
{'tokens': '服务不是一般的差,特别是部长那些', 'labels': '0'}
{'tokens': '今天又去了,虽然上次吃完愤愤地说下次再也不去了,可是,今天是客户选被迫就范,两个人最后买单4800元,菜价全广州最贵,部长点菜只建议点最贵,不建议点好吃的,服务态度倒是很好,好态度背后隐藏着一把锋利的刀,出来有种被当水鱼被斩的感觉,有种被侮辱智商的挫败。。。', 'labels': '0'}
{'tokens': '第二次来了,味道不错!!分量还可以', 'labels': '1'}
{'tokens': '上菜慢,价钱偏贵,细路太多不适合情侣!无下次!', 'labels': '0'}
{'tokens': '茶没喝,人已被气饱,谁还会再来!昨晚8:10分,我们一行2人上到二楼,带位领班安排我们就坐窗边位置,周围的几张台都坐满了客人,随后一位服务生对我们说该区域九点结束营业,我们明确表示9点前一定离开,他也同意了;过了5分钟另一位服务生又跟我们说9点要搞卫生(脸色很难看),我们再次强调会按时离开;又过了5分钟,再来了一位服务生语气很不客气的要我们去其他区域,我们一听就来气了,我们从进店开始已整整坐了十几分钟,不但茶没喝,还在受气,说实在话这个时间我要点的东西都已上齐,位置是你们安排的,这是你们内部的管理问题,该区域也没有任何9点停止营业的告示,大厅的营业时间是到22:30分的。喝茶本是愉悦的,但遇上这样的服务态度,这样的管理水平,实在无法忍受,气愤的离开了,以后也不会光顾了。本人从事旅游行业多年,也安排了很多国外入境客人品尝各种广东风味小吃,但像这样的服务态度和服务水平实在不敢恭维,那敢再带国外客人光顾呢?', 'labels': '0'}
{'tokens': '对这次服务满意坏境不错,服务周到。', 'labels': '0'}
{'tokens': '两点来的,说是两点半就不能点点心,催着点了。直接带到25元一位的大厅,坐下开始点菜才知道楼上有几块钱的。先后点的四种点心,都是点完半天来告诉我们没有,实在太扫兴,太扫兴,太扫兴。服务员也很冷淡,冷淡到不行。如果有无星,我一颗星都不给。', 'labels': '0'}
{'tokens': '服务态度超差,真系以后都唔会再去', 'labels': '0'}
{'tokens': '口味不错,消费不贵,可以和朋友们一起来', 'labels': '1'}
{'tokens': '出发前查过点评网营业到04:00,到店00:00左右,见门口写营业到02:00,见里面仲有几台客,就入去坐低,服务员过嚟话开到01:30,都算,坐低咗就快快翠食完走,点知一话要点起片打边炉,服务员就话肯定赶唔切…差在未赶我地走,无语…果断转场…口味五星纯粹就评俾印象中嘅口味', 'labels': '0'}

3.2 数据处理

为了将原始数据处理成模型可以读入的格式,本项目将对数据作以下处理:

  • 首先使用jieba切词,之后将jieba切完后的单词映射词表中单词id。

  • 使用paddle.io.DataLoader接口多线程异步加载数据。

其中用到了PaddleNLP中关于数据处理的API。PaddleNLP提供了许多关于NLP任务中构建有效的数据pipeline的常用API

API 简介
paddlenlp.data.Stack 堆叠N个具有相同shape的输入数据来构建一个batch,它的输入必须具有相同的shape,输出便是这些输入的堆叠组成的batch数据。
paddlenlp.data.Pad 堆叠N个输入数据来构建一个batch,每个输入数据将会被padding到N个输入数据中最大的长度
paddlenlp.data.Tuple 将多个组batch的函数包装在一起

更多数据处理操作详见: https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/data.md

# 下载词汇表文件word_dict.txt,用于构造词-id映射关系。
!wget https://paddlenlp.bj.bcebos.com/data/senta_word_dict.txt # 加载词表
vocab = load_vocab('./senta_word_dict.txt') for k, v in vocab.items():
print(k, v)
break
https://paddlenlp.bj.bcebos.com/data/senta_word_dict.txt
Resolving paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)... 100.64.253.37, 100.64.253.38
Connecting to paddlenlp.bj.bcebos.com (paddlenlp.bj.bcebos.com)|100.64.253.37|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14600150 (14M) [text/plain]
Saving to: ‘senta_word_dict.txt.1’ senta_word_dict.txt 100%[===================>] 13.92M 73.9MB/s in 0.2s 2021-05-25 18:51:53 (73.9 MB/s) - ‘senta_word_dict.txt.1’ saved [14600150/14600150] [PAD] 0
## 3.3构造dataloder

下面的`create_data_loader`函数用于创建运行和预测时所需要的`DataLoader`对象。

* `paddle.io.DataLoader`返回一个迭代器,该迭代器根据`batch_sampler`指定的顺序迭代返回dataset数据。异步加载数据。

* `batch_sampler`:DataLoader通过 batch_sampler 产生的mini-batch索引列表来 dataset 中索引样本并组成mini-batch

* `collate_fn`:指定如何将样本列表组合为mini-batch数据。传给它参数需要是一个callable对象,需要实现对组建的batch的处理逻辑,并返回每个batch的数据。在这里传入的是`prepare_input`函数,对产生的数据进行pad操作,并返回实际长度等。
# Reads data and generates mini-batches.
def create_dataloader(dataset,
trans_function=None, #数据集转换例如:词转换成id
mode='train',
batch_size=1,
pad_token_id=0, #padding的特殊符号的id
batchify_fn=None): #读batch的函数
if trans_function:
dataset_map = dataset.map(trans_function) # return_list 数据是否以list形式返回
# collate_fn 指定如何将样本列表组合为mini-batch数据。传给它参数需要是一个callable对象,需要实现对组建的batch的处理逻辑,并返回每个batch的数据。在这里传入的是`prepare_input`函数,对产生的数据进行pad操作,并返回实际长度等。
dataloader = paddle.io.DataLoader(
dataset_map,
return_list=True,
batch_size=batch_size,
collate_fn=batchify_fn) return dataloader # python中的偏函数partial,把一个函数的某些参数固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
#转换成id序列
trans_function = partial(
convert_example,
vocab=vocab,
unk_token_id=vocab.get('[UNK]', 1),
is_test=False) # 将读入的数据batch化处理,便于模型batch化运算。
# batch中的每个句子将会padding到这个batch中的文本最大长度batch_max_seq_len。
# 当文本长度大于batch_max_seq时,将会截断到batch_max_seq_len;当文本长度小于batch_max_seq时,将会padding补齐到batch_max_seq_len.
#pad pai将句子统一到一定长度
batchify_fn = lambda samples, fn=Tuple(
Pad(axis=0, pad_val=vocab['[PAD]']), # input_ids
Stack(dtype="int64"), # seq len
Stack(dtype="int64") # label
): [data for data in fn(samples)] #调用三次dataloader
train_loader = create_dataloader(
train_ds,
trans_function=trans_function,
batch_size=128,
mode='train',
batchify_fn=batchify_fn)
dev_loader = create_dataloader(
dev_ds,
trans_function=trans_function,
batch_size=128,
mode='validation',
batchify_fn=batchify_fn)
test_loader = create_dataloader(
test_ds,
trans_function=trans_function,
batch_size=128,
mode='test',
batchify_fn=batchify_fn) for i in train_loader:
print(i)
break
[Tensor(shape=[128, 434], dtype=int64, place=CPUPlace, stop_gradient=True,
[[656582 , 666970 , 646434 , ..., 0 , 0 , 0 ],
[724601 , 1250380, 1106339, ..., 0 , 0 , 0 ],
[1 , 1232128, 389886 , ..., 0 , 0 , 0 ],
...,
[653811 , 1225884, 952595 , ..., 0 , 0 , 0 ],
[137984 , 261577 , 850865 , ..., 0 , 0 , 0 ],
[115700 , 364716 , 509081 , ..., 0 , 0 , 0 ]]), Tensor(shape=[128], dtype=int64, place=CPUPlace, stop_gradient=True,
[27 , 13 , 40 , 60 , 22 , 11 , 67 , 20 , 12 , 11 , 10 , 85 , 11 , 15 , 261, 8 , 81 , 10 , 13 , 96 , 32 , 169, 20 , 16 , 25 , 29 , 26 , 107, 12 , 65 , 20 , 20 , 22 , 74 , 124, 207, 16 , 13 , 31 , 205, 28 , 12 , 46 , 68 , 434, 10 , 12 , 61 , 17 , 14 , 19 , 34 , 141, 44 , 135, 293, 39 , 10 , 22 , 41 , 14 , 16 , 185, 24 , 8 , 42 , 36 , 19 , 13 , 9 , 29 , 12 , 61 , 151, 11 , 11 , 20 , 16 , 24 , 104, 12 , 9 , 11 , 72 , 48 , 16 , 317, 57 , 91 , 11 , 278, 37 , 97 , 11 , 12 , 12 , 25 , 58 , 27 , 12 , 205, 23 , 22 , 17 , 10 , 107, 40 , 34 , 9 , 59 , 9 , 26 , 25 , 93 , 14 , 13 , 14 , 20 , 21 , 25 , 13 , 32 , 11 , 24 , 16 , 117, 43 , 11 ]), Tensor(shape=[128], dtype=int64, place=CPUPlace, stop_gradient=True,
[0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1])]

4.模型搭建

使用LSTMencoder搭建一个BiLSTM模型用于进行句子建模,得到句子的向量表示。

然后接一个线性变换层,完成二分类任务。

  • paddle.nn.Embedding组建word-embedding层
  • ppnlp.seq2vec.LSTMEncoder组建句子建模层
  • paddle.nn.Linear构造二分类器

图1:seq2vec示意图

  • 除LSTM外,seq2vec还提供了许多语义表征方法,详细可参考:seq2vec介绍
class LSTMModel(nn.Layer):
def __init__(self,
vocab_size, #词汇长度
num_classes,
emb_dim=128, #词向量纬度
padding_idx=0, #补齐句子特殊符号
lstm_hidden_size=198, #隐藏层
direction='forward', #从前往后读句子
lstm_layers=1,
dropout_rate=0, #随机丢弃一下网络,增强网络泛化能力
pooling_type=None,
fc_hidden_size=96):
super().__init__() # 首先将输入word id 查表后映射成 word embedding
self.embedder = nn.Embedding(
num_embeddings=vocab_size,
embedding_dim=emb_dim,
padding_idx=padding_idx) # 将word embedding经过LSTMEncoder变换到文本语义表征空间中
self.lstm_encoder = ppnlp.seq2vec.LSTMEncoder(
emb_dim,
lstm_hidden_size,
num_layers=lstm_layers,
direction=direction,
dropout=dropout_rate,
pooling_type=pooling_type) # LSTMEncoder.get_output_dim()方法可以获取经过encoder之后的文本表示hidden_size
self.fc = nn.Linear(self.lstm_encoder.get_output_dim(), fc_hidden_size) # 最后的分类器
self.output_layer = nn.Linear(fc_hidden_size, num_classes) def forward(self, text, seq_len):
# text shape: (batch_size, num_tokens)
# print('input :', text.shape) # Shape: (batch_size, num_tokens, embedding_dim)
embedded_text = self.embedder(text)
# print('after word-embeding:', embedded_text.shape) # Shape: (batch_size, num_tokens, num_directions*lstm_hidden_size)
# num_directions = 2 if direction is 'bidirectional' else 1
text_repr = self.lstm_encoder(embedded_text, sequence_length=seq_len)
# print('after lstm:', text_repr.shape) # Shape: (batch_size, fc_hidden_size)
fc_out = paddle.tanh(self.fc(text_repr))
# print('after Linear classifier:', fc_out.shape) # Shape: (batch_size, num_classes)
logits = self.output_layer(fc_out)
# print('output:', logits.shape) # probs 分类概率值
probs = F.softmax(logits, axis=-1)
# print('output probability:', probs.shape)
return probs model= LSTMModel(
len(vocab),
2,
direction='bidirectional',
padding_idx=vocab['[PAD]'])
model = paddle.Model(model)

5.模型配置和训练

5.1模型配置

optimizer = paddle.optimizer.Adam(
parameters=model.parameters(), learning_rate=5e-5) loss = paddle.nn.CrossEntropyLoss()
metric = paddle.metric.Accuracy() model.prepare(optimizer, loss, metric)
# 设置visualdl路径
log_dir = './visualdl'
callback = paddle.callbacks.VisualDL(log_dir=log_dir)

5.2模型训练

训练过程中会输出loss、acc等信息。这里设置了10个epoch,在训练集上准确率约97%。

model.fit(train_loader, dev_loader, epochs=10, save_dir='./checkpoints', save_freq=5, callbacks=callback)

5.3 启动VisualDL查看训练过程可视化结果

启动步骤:

  • 1、切换到本界面左侧「可视化」
  • 2、日志文件路径选择 ‘visualdl’
  • 3、点击「启动VisualDL」后点击「打开VisualDL」,即可查看可视化结果:
    Accuracy和Loss的实时变化趋势如下:
results = model.evaluate(dev_loader)
print("Finally test acc: %.5f" % results['acc'])
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 10 - loss: 0.3913 - acc: 0.9414 - 90ms/step
step 20 - loss: 0.3812 - acc: 0.9445 - 74ms/step
step 30 - loss: 0.3584 - acc: 0.9464 - 72ms/step
step 40 - loss: 0.3487 - acc: 0.9480 - 71ms/step
step 50 - loss: 0.3882 - acc: 0.9473 - 70ms/step
step 60 - loss: 0.3747 - acc: 0.9478 - 70ms/step
step 70 - loss: 0.3802 - acc: 0.9467 - 69ms/step
step 80 - loss: 0.3563 - acc: 0.9471 - 67ms/step
Finally test acc: 0.94776

6.预测结果

print(type(test_ds))
label_map = {0: 'negative', 1: 'positive'}
results = model.predict(test_loader, batch_size=128)[0]
predictions = [] for batch_probs in results:
# 映射分类label
idx = np.argmax(batch_probs, axis=-1)
idx = idx.tolist()
labels = [label_map[i] for i in idx]
predictions.extend(labels)
# 看看预测数据前5个样例分类结果
for i in test_ds:
print(i)
break for idx, data in enumerate(test_ds):
if idx < 10:
print(type(data))
print('Data: {} \t Label: {}'.format(data[0], predictions[idx]))
([440695, 768730, 810400, 371677, 1106339, 995733, 237834, 891203, 1211275, 686770, 1106339, 440695, 117037, 830171, 475327, 1093154], array(16), array(0))
<class 'tuple'>
Data: [440695, 768730, 810400, 371677, 1106339, 995733, 237834, 891203, 1211275, 686770, 1106339, 440695, 117037, 830171, 475327, 1093154] Label: negative
<class 'tuple'>
Data: [471791, 807117, 823116, 1, 891564, 1057229, 1, 1106326, 653811, 176187, 877695, 958129, 173188, 986608, 1106339, 781255, 830165, 213378, 1211275, 1057229, 36026, 1106326, 1106328, 1033199, 877695, 749968, 1106339, 147848, 830171, 489131, 958129, 1106339, 898857, 1131492, 930707, 173188, 399212, 1, 1222901, 508478, 823066, 1106326, 1106328, 651025, 781255, 252859, 860530, 681075, 1106339, 453143, 1, 650296, 173188, 681075, 173401, 830171, 997375, 819627, 283810, 1106326, 1106328] Label: negative
<class 'tuple'>
Data: [451938, 696658, 940533, 1150076, 936106, 308649, 157793, 718272, 660347, 40882, 86562, 510099, 1106339, 1050713, 1188905, 711114, 69882, 686776, 961609, 1, 1106339, 178687, 1106328, 1057229, 511894, 1103825, 1106328, 606478, 703976, 823066, 1113416, 1152575, 1211275, 364716, 1092505, 877695, 1106339, 979319, 1106326, 1175853, 4783, 267842, 173188, 297759, 1106339, 786065, 1106339, 795996, 270281, 797371, 179568, 974589, 974589, 1, 1093512, 578978, 420194, 668761, 4783, 738354, 836929, 52172, 1106328, 713424, 830171, 35393, 898857, 472344, 1106339, 157793, 47104, 1191873, 718272, 389733, 738354, 952595, 1106339, 306239, 898857, 616980, 1106326, 1106328, 1106326, 1106328, 789340, 696658, 711103, 859353, 202379, 472344, 179582, 1106326, 26156, 1093873, 830171, 8885, 395173, 1106339, 592501, 202370, 1107855, 823066, 974589, 974589, 940533, 254014, 145550, 453139, 1193342, 940533, 1050739, 1106339, 1135123, 1, 602020, 179568] Label: negative
<class 'tuple'>
Data: [1086178, 173188, 1188905, 650296, 389733, 1188905, 823116, 669226, 1106339, 669226, 604466, 836929, 52172, 1106339, 311074, 881196, 1044637, 690740, 1, 1106339, 766694, 1050713, 823066, 511894, 1, 1, 173188, 690740, 224268, 257857, 240658, 1106339, 874019, 1238094, 1057229, 220620, 173188, 1106339, 1238700, 758560, 1208182, 823066, 1106339, 975313, 1232128, 836929, 567563, 936106, 237795, 282921, 282921, 282921, 282921, 282921, 282921] Label: negative
<class 'tuple'>
Data: [365921, 932416, 663024, 388662, 1106328, 1106328, 1106328, 1083318, 823066, 1216915, 819627, 453139, 1216915, 960087, 159950, 173188, 753452, 1106328] Label: positive
<class 'tuple'>
Data: [384261, 305803, 173188, 1183540, 823116, 1106339, 847645, 389733, 563178, 1053035, 666970, 81913, 475331, 1203115, 991057, 1106339, 479740, 88185, 859353, 1111556, 347427, 283810, 169379, 769807, 305838, 322845, 218407, 955960, 1106339, 693836, 686770, 4782, 724601, 686770, 4782, 107509, 553338, 1, 1042186, 1110722, 544943, 4782, 881173, 1183540, 823116, 173188, 1173300, 4782, 881173, 1183540, 769807, 173188, 1173300, 4783] Label: negative
<class 'tuple'>
Data: [376180, 639231, 261577, 656622, 894574, 1106328, 977151, 905376, 137984, 1057229, 250355, 173188, 629586, 876228, 1106339, 418471, 283810, 1211275, 799171, 1106339, 724601, 261577, 165869, 935402, 1106339, 860985, 261577, 1093154, 1106339, 820003, 543370, 894574, 1106328, 7215, 690740] Label: positive
<class 'tuple'>
Data: [1066901, 1083318, 877695, 979812, 1173329, 173188, 514629, 1106321, 1083318, 859353, 1083318, 1096990, 1083318, 263393, 818554, 1110721, 475371, 1192261, 173188, 326984, 837335, 659913, 832658, 832658, 491743, 1106328, 1173329, 1106328, 1106328, 1106328, 1066901, 1083318, 877695, 979812, 1, 173188, 514629, 68233, 1106321, 473329, 1, 1, 1106339, 957006, 823153, 930660, 794154, 183395, 382678, 1, 105959, 173188, 726352, 1106339, 166181, 473329, 928384, 453139, 4777, 1053978, 4778, 1, 1106339, 1093157, 645827, 224268, 534222, 1, 1022416, 1, 1084561, 1, 1106339, 1, 668587, 457118, 1, 1204878, 651025, 1, 656594, 696404, 66941, 742636, 416380, 832658, 832658, 1, 1106328, 1, 1106328, 1106328, 876258, 1106328, 1106328, 1106328, 386946, 1, 353572, 400234, 173188, 709767, 1106321, 1066901, 1083318, 877695, 396639, 173188, 514629, 1106321, 453971, 1121397, 522245, 1211275, 1, 823066, 1106339, 684489, 802932, 1, 1106339, 767021, 69882, 823066, 768905, 1, 1152574, 1106322, 1, 686770, 1106328, 1106328, 1066901, 1083318, 877695, 396639, 173188, 514629, 1106321, 917345, 1, 4782, 917345, 726358, 1140069, 976571, 312864, 4782, 917345, 726358, 1, 4782, 917345, 726358, 1095073, 1, 173188, 560962, 1034586, 4782, 917345, 726358, 1, 173188, 1, 1087481, 853920, 938841, 961609, 743669, 107691, 1106322, 1, 244170, 1106328, 1106328, 1155475, 599615, 890242, 954040, 1, 242649, 173188, 298309, 1057229, 803636, 4782, 1, 173188, 298309, 1106339, 177893, 4782, 1, 173188, 1211275, 1084488, 602020, 1093154, 881196, 1, 1106328, 1106328, 242649, 173188, 298309, 1057229, 453148, 881196, 803636, 173188, 1071540, 1106328, 1106328, 1106328] Label: negative
<class 'tuple'>
Data: [401981, 738738, 884754, 881187, 261577, 237795, 1106339, 497327, 690740, 297759, 261577, 1250380, 1106328, 810400, 429786, 686770, 1106328, 323771, 518954, 173188, 230599, 4782] Label: negative
<class 'tuple'>
Data: [169379, 52794, 173188, 504130, 440821, 977875, 552526, 282092, 823066, 1106339, 867512, 163653, 768547, 436269, 25065, 4783, 178053, 1057229, 261577, 1250380, 1106339, 1121661, 663813, 898857, 254013, 40261, 173188, 650322, 179568, 4783, 860985, 237834, 693836, 806474, 1057229, 759049, 560962, 231110, 283810, 833337, 389733, 830171, 939335, 1106339, 312183, 284408, 453172, 1006966, 231110, 173188, 284408, 1106339, 830172, 389733, 261577, 1225280, 823066, 4783, 4783, 724601, 224268, 1057229, 23432, 318302, 4783] Label: negative

这里只采用了一个基础的模型,就得到了较高的的准确率。

可以试试预训练模型,能得到更好的效果!参考如何通过预训练模型Fine-tune下游任务

【深度学习项目五】:利用LSTM网络进行情感分析(NLP)的更多相关文章

  1. [深度学习]理解RNN, GRU, LSTM 网络

    Recurrent Neural Networks(RNN) 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义 ...

  2. GitHub 上 57 款最流行的开源深度学习项目

    转载:https://www.oschina.net/news/79500/57-most-popular-deep-learning-project-at-github GitHub 上 57 款最 ...

  3. GitHub 上 57 款最流行的开源深度学习项目【转】

    GitHub 上 57 款最流行的开源深度学习项目[转] 2017-02-19 20:09 334人阅读 评论(0) 收藏 举报 分类: deeplearning(28) from: https:// ...

  4. github上热门深度学习项目

    github上热门深度学习项目 项目名 Stars 描述 TensorFlow 29622 使用数据流图进行可扩展机器学习的计算. Caffe 11799 Caffe:深度学习的快速开放框架. [Ne ...

  5. 纯干货:深度学习实现之空间变换网络-part2

    https://www.jianshu.com/p/854d111670b6 纯干货:深度学习实现之空间变换网络-part1 在第一部分中,我们主要介绍了两个非常重要的概念:仿射变换和双线性插值,并了 ...

  6. NLP入门(十)使用LSTM进行文本情感分析

    情感分析简介   文本情感分析(Sentiment Analysis)是自然语言处理(NLP)方法中常见的应用,也是一个有趣的基本任务,尤其是以提炼文本情绪内容为目的的分类.它是对带有情感色彩的主观性 ...

  7. 深度学习原理与框架-RNN网络框架-LSTM框架 1.控制门单元 2.遗忘门单元 3.记忆门单元 4.控制门单元更新 5.输出门单元 6.LSTM网络结构

    LSTM网络是有LSTM每个单元所串接而成的, 从下面可以看出RNN与LSTM网络的差异, LSTM主要有控制门单元和输出门单元组成 控制门单元又是由遗忘门单元和记忆门单元的加和组成. 1.控制门单元 ...

  8. 深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)

    一.CNN卷积神经网络的经典网络综述 下面图片参照博客:http://blog.csdn.net/cyh_24/article/details/51440344 二.LeNet-5网络 输入尺寸:32 ...

  9. PyTorch中使用深度学习(CNN和LSTM)的自动图像标题

    介绍 深度学习现在是一个非常猖獗的领域 - 有如此多的应用程序日复一日地出现.深入了解深度学习的最佳方法是亲自动手.尽可能多地参与项目,并尝试自己完成.这将帮助您更深入地掌握主题,并帮助您成为更好的深 ...

  10. Github上Stars最多的53个深度学习项目,TensorFlow遥遥领先

    原文:https://github.com/aymericdamien/TopDeepLearning 项目名称 Stars 项目介绍 TensorFlow 29622 使用数据流图计算可扩展机器学习 ...

随机推荐

  1. AtCoder Beginner Contest 167 (A~F,DEF Good)

    比赛链接:https://atcoder.jp/contests/abc167/tasks AB水题, C - Skill Up 题意: 初始时 \(m\) 个算法的能力均为 \(0\),\(n\) ...

  2. Manjaro 上手使用简明教程

    Manjaro 是一个非常好用的系统,在被很多朋友介绍过很多次以后,我终于试着开始使用这个系统了,今天就简单记录一下,方便从别的系统来的移民,尤其是听说过 Arch 大名,也曾向往之,然而因为它的安装 ...

  3. svg组件封装

    svg图标优点 文件体积小,能够被大量的压缩 图片可无限放大而不失真(矢量图的基本特征) 在视网膜显示屏上效果极佳 能够实现互动和滤镜效果 svg图标使用 1.安装相应的npm包: yarn add ...

  4. shell 脚本之 disk_monitor

    编写脚本实现监测指定文件夹的磁盘空间.   =========================================================== ## 脚本逻辑介绍 用户通过 --p ...

  5. python中BeautifulSoup库使用小结

    转载请注明出处: BeautifulSoup是一个用于解析HTML和XML文档的Python库,它提供了一些简单但强大的API,让你可以从文档中提取数据.以下是一些BeautifulSoup的主要特性 ...

  6. 08-避免Latch的产生

    1.Latch简介 Latch就是锁存器,是一种在异步电路系统中,对输入信号电平敏感的单元,用来存储信息 锁存器在数据未锁存时,输出端的信号随输入信号变化,就像信号通过一个缓冲器,一旦锁存信号有效,数 ...

  7. WebApi允许跨域

    services.AddCors(options => { options.AddPolicy("abc", builder => { //App:CorsOrigin ...

  8. Linux-分区-fdisk-mkfs-mount

  9. Python学习之十五_不同类型数据库表内容比较

    Python学习只十五_不同类型数据库表内容比较 前言 最近学习力总结了很多Python相关的内容 本次想继续学习一下不同数据库之间的数据比较. 这样理论上可以极大的缩减不同数据库测试成本. 感谢Py ...

  10. [转帖]FIO 存储性能压测

    一. FIO简介 FIO 是一个多线程IO生成工具,可以生成多种IO模式(随机.顺序.读.写四大类),用来测试磁盘设备的性能.GFIO是FIO的图形监测工具,它提供了图形界面的参数配置,和性能监测图像 ...