NLP入门-情感分析|paddle
### 任务介绍:
在自然语言处理中,情感分析一般指判断一段文本所表达的情绪状态,属于文本分类问题。
情绪:正面/负面
数据集介绍:
IMDB数据集包含来自互联网的50000条严重两极分化的评论,该数据被分为用于训练的25000条评论和用于测试的25000条评论,训练集和测试集都包含50%的正面评价和50%的负面评价。该数据集已经经过预处理:评论(单词序列)已经被转换为整数序列,其中每个整数代表字典中的某个单词。
1、准备数据:
创建数据读取器train_reader 和test_reader
2、配置网络
定义网络
定义损失函数
定义优化算法
3、训练网络
4、模型评估
5、模型预测
1 | # 导入必要的包 |
1 | !mkdir -p /home/aistudio/.cache/paddle/dataset/imdb/ |
1 | # 获取数据字典 |
加载数据字典中...
完成
数据是以数据标签的方式表示一个句子。
所以每个句子都是以一串整数来表示的,每个数字都是对应一个单词。
数据集就会有一个数据集字典,这个字典是训练数据中出现单词对应的数字标签。
1 | # 获取训练和预测数据 |
加载训练数据中...
加载测试数据中...
完成
- 遗忘门:用来控制记忆消失程度。
- 输入门:决定了当前时刻的输入信息,有多少信息将添加到记忆信息流中,与遗忘门计算公式几乎一致,输入门同样通过一个激活函数来实现。
- 记忆状态:计算当前输入与过去的记忆所具有的信息总量。
- 输出门:控制着有多少记忆信息将被用于下一阶段的更新中。
在防止梯度消失的问题上,LSTM效果比RNN要好,
随着任务难度的加深,文本序列长度的增加,模型后面一部分可能会丢失原始的信息,就出现了RNN的变体LSTM和GRU。
1 | # 定义长短期记忆网络 |
这里可以先定义一个输入层,这样要注意的是我们使用的数据属于序列数据,所以我们可以设置lod_level为1,当该参数不为0时,表示输入的数据为序列数据,默认lod_level的值是0.
1 | # 定义输入数据, lod_level不为0指定输入数据为序列数据 |
接着定义损失函数,这里同样是一个分类任务,所以使用的损失函数也是交叉熵损失函数。这里也可以使用fluid.layers.accuracy()接口定义一个输出分类准确率的函数,可以方便在训练的时候,输出测试时的分类准确率,观察模型收敛的情况。
1 | # 获取损失函数和准确率 |
1 | # 获取预测程序 |
然后是定义优化方法,这里使用的时Adagrad优化方法,Adagrad优化方法多用于处理稀疏数据,设置学习率为0.002。
1 | # 定义优化方法 |
如果读取有GPU环境,可以尝试使用GPU来训练,使用方式是使用fluid.CUDAPlace(0)来创建。
1 | # 定义使用CPU还是GPU,使用CPU时use_cuda = False,使用GPU时use_cuda = True |
[]
定义数据数据的维度,数据的顺序是一条句子数据对应一个标签。
1 | # 定义输入数据的维度 |
现在就可以开始训练了,这里设置训练的循环是2次,大家可以根据情况设置更多的训练轮数。我们在训练中,每40个Batch打印一层训练信息和进行一次测试,测试是使用测试集进行预测并输出损失值和准确率,测试完成之后,对之前预测的结果进行求平均值。
1 | # 开始训练 |
Pass:0, Batch:0, Cost:0.73125
Pass:0, Batch:40, Cost:0.06795
Pass:0, Batch:80, Cost:0.00722
Pass:0, Batch:120, Cost:0.80844
Pass:0, Batch:160, Cost:0.22205
Test:0, Cost:1.12195, ACC:0.50171
Pass:1, Batch:0, Cost:2.13347
Pass:1, Batch:40, Cost:0.48804
Pass:1, Batch:80, Cost:0.21535
Pass:1, Batch:120, Cost:0.81571
Pass:1, Batch:160, Cost:0.33186
Test:1, Cost:0.83362, ACC:0.50191
Pass:2, Batch:0, Cost:1.40742
Pass:2, Batch:40, Cost:0.55047
Pass:2, Batch:80, Cost:0.27269
Pass:2, Batch:120, Cost:0.74456
Pass:2, Batch:160, Cost:0.35957
Test:2, Cost:0.71608, ACC:0.50769
Pass:3, Batch:0, Cost:1.12344
Pass:3, Batch:40, Cost:0.55675
Pass:3, Batch:80, Cost:0.30137
Pass:3, Batch:120, Cost:0.67230
Pass:3, Batch:160, Cost:0.35690
Test:3, Cost:0.63739, ACC:0.54560
Pass:4, Batch:0, Cost:0.98897
Pass:4, Batch:40, Cost:0.55052
Pass:4, Batch:80, Cost:0.29672
Pass:4, Batch:120, Cost:0.59823
Pass:4, Batch:160, Cost:0.35738
Test:4, Cost:0.57975, ACC:0.61902
Pass:5, Batch:0, Cost:0.80312
Pass:5, Batch:40, Cost:0.50581
Pass:5, Batch:80, Cost:0.27092
Pass:5, Batch:120, Cost:0.55160
Pass:5, Batch:160, Cost:0.32211
Test:5, Cost:0.53265, ACC:0.69416
Pass:6, Batch:0, Cost:0.70552
Pass:6, Batch:40, Cost:0.49984
Pass:6, Batch:80, Cost:0.27171
Pass:6, Batch:120, Cost:0.52073
Pass:6, Batch:160, Cost:0.31178
Test:6, Cost:0.49651, ACC:0.74736
Pass:7, Batch:0, Cost:0.69794
Pass:7, Batch:40, Cost:0.50185
Pass:7, Batch:80, Cost:0.27300
Pass:7, Batch:120, Cost:0.46273
Pass:7, Batch:160, Cost:0.35845
Test:7, Cost:0.46813, ACC:0.78116
Pass:8, Batch:0, Cost:0.61882
Pass:8, Batch:40, Cost:0.45831
Pass:8, Batch:80, Cost:0.27965
Pass:8, Batch:120, Cost:0.44373
Pass:8, Batch:160, Cost:0.30215
Test:8, Cost:0.44874, ACC:0.80029
Pass:9, Batch:0, Cost:0.60523
Pass:9, Batch:40, Cost:0.47129
Pass:9, Batch:80, Cost:0.22142
Pass:9, Batch:120, Cost:0.39324
Pass:9, Batch:160, Cost:0.26854
Test:9, Cost:0.43634, ACC:0.80823
save models to /home/aistudio/work/emotionclassify.inference.model
['save_infer_model/scale_0']
我们先定义三个句子,第一句是中性的,第二句偏向正面,第三句偏向负面。然后把这些句子读取到一个列表中。
1 | # 定义预测数据 |
然后把句子转换成编码,根据数据集的字典,把句子中的单词转换成对应标签。
1 | # 获取结束符号的标签 |
获取输入数据的维度和大小。
1 | # 获取每句话的单词数量 |
将要预测的数据转换成张量,准备开始预测。
1 | # 生成预测数据 |
1 | infer_exe = fluid.Executor(place) #创建推测用的executor |
1 | with fluid.scope_guard(inference_scope):#修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。 |
'read the book forget the movie'的预测结果为:正面概率为:0.54671,负面概率为:0.45329
'this is a great movie'的预测结果为:正面概率为:0.62144,负面概率为:0.37856
'this is very bad'的预测结果为:正面概率为:0.37344,负面概率为:0.62656
预测结果显示这个模型的预测较为准确,输出结果符合人类观察的预期;可以继续调整网络参数、结构,使其能够更好的对文本进行情感分类。