基于PaddlePaddle实现文本分类

2,281 阅读8分钟

0.前言

写在最前, 最近2年AI很火,各行各业都想学,本文主要分享的是一个利用神经网络对英文文本分类的介绍,这是笔者的一个大学的作业,在此开放出来给大家学习,讨论。

仓库地址:github.com/guanjiangta… 喜欢的请给个小星星吧~

1.实现一个AI的步骤

接下来我要将的就是AI八股文,怎么实现一个AI。如有冒犯请多担待~不足之处请多多指教。

1.1 确定需要做啥

这次就拿我之前实现猫狗分类来说。做事情第一步我们需要明确目标,本次目标是对猫狗进行识别分类,那么就只存在猫或者狗,不会突然冒出来猪,牛,羊这些,如果有我们统一归类为其他。

那么我们就确定了,本次我们要做的范围就是猫,狗,其他。

1.2 选取框架

在各种眼花缭乱的框架中选取一份适合你的,我选择了PaddlePaddle

1.3 实操-数据预处理

针对不同的场景,对数据进行不同的处理,这里猫狗分类的话,我们就是针对猫,狗和其他奇怪的动物进行特征提取,对初始数据集做一些基础的标注功能,我们俗称教机器认字。

1.4 实操-生成训练数据集

这里就按照本身的数据集条件进行划分了,诸位可以随意,不过建议不要少于5k张图片~

1.5 实操-其余部分

1)选择网络模型:根据不同的需求,选取不同的模型进行训练。我这次是做图像类的,就随便选了一个图像类的模型,CNN吧(巨佬可以选择自己配置)。

2)配置算法,训练出结果,看loss这三步我们俗称调参。

科普一下,调参侠就是由此而来。

3)经过我们艰苦卓绝的努(调)力(参),终于得出了结果。

4)最后运行test进行验证。

5)如果还需要部署,就得具备一定的编程能力了~

1.6 介绍一下本次文章

本次是做一个文本分类,英文的,所有的数据来自国外某社交媒体网站,我们要对这些做一定的分类。

这里涉及到因为是来自国外媒体网站,所以用户说话就比较随意,老外交流也可能发简写单词,所以为了提高准确度,我还是做了一些小小的处理的。

2.文件介绍

create_data_start.py 文本处理方法

create_data_utils.py 文本处理工具

model.py 模型文件1

多模态学习文件,这是针对不规则数据集的处理方法。算法不是很完善,有待优化。

net.py 主要的模型文件

主要采用的是cnn,之前那个版本是bilstm现在换成了CNN。主要还是依靠大型稀疏矩阵进行学习。

read_config.py 读取配置文件

pre_create_data.py 数据预处理文件

主要包括的操作有

1,单词分词,因为我发现数据集里面有部分单词分词效率过低。所以我对于此类单词,利用wordninja库进行了再一次分词,效果优于之前的文件。

2,单词纠正,因为文本中存在,因为的口语描述,比如u == you ,这类单词对于数据训练来说效果是非常差的,所以这些我利用了workcheck进行纠正,思路就是正则替换。其中wordcheck.txt是含有12w行《老友记》台词的数据集。(其实纠正效果还是不是很明显,但是相比之前已经好多了)

text_reader.py 数据集读取文件

trian.py 训练文件

utils.py 这个是之前版本的工具文件

valid_model_acc.py 模型准确率验证文件

valid.py 预测输出,并得到accuary文件

wordcheck.py 单词纠正算法文件

3.核心算法

3.1 cnn算法

代码:

import paddle.fluid as fluid

def cnn_net(data,label,dict_dim,emb_dim=128,hid_dim=128,hid_dim2=96,class_dim=10,
            win_size=3,is_infer=False):
    """
    Conv net
    """
    # embedding layer
    emb = fluid.layers.embedding(input=data, size=[dict_dim, emb_dim])
    # convolution layer
    conv_3 = fluid.nets.sequence_conv_pool(
        input=emb,
        num_filters=hid_dim,
        filter_size=win_size,
        act="tanh",
        pool_type="max")
    # full connect layer
    fc_1 = fluid.layers.fc(input=[conv_3], size=hid_dim2)
    # dropout layer
    dropout_1 = fluid.layers.dropout(x=fc_1,dropout_prob=0.5,name="dropout")
    # softmax layer
    prediction = fluid.layers.fc(input=[dropout_1], size=class_dim, act="softmax")
    return prediction

4.操作步骤

4.1 预处理数据

①:拆分单词

因为部分文档的单词标识度不是很高,所以我利用的wordninja框架进行再次分词。这样很明显一些单词被再次分割。比如2019years已经被分割成了2019 years。这样的效果比之前好很多了。只要我们人读起来就比较通顺了。

②:单词拼写纠正

因为数据集中是采集的是国外的社交网站发的贴子,说说之类,所以有很多的俚语和外国人说的话,会省略很多单词,或则和用其他的单词代替原有代词(读音相同)。比如:u == you ,c == say等。

③:操作方法

python pre_create_data.py

④:代码

 # 拆分单词
 data = wdja.split(data)
 data1 = []
 for data2 in data:
     # 单词拼写纠正
     data1.append(wordcheck.correct(data2))
 strs = " ".join(list(data1))
 x_train_list.append(strs)
 x_train_file.write(strs + "\n")

4.2 生成数据集

①:生成过程

生成数据字典 -> 根据测试集和验证集的单词,生成一个数据字典,大小根据内容的单词多少决定。文件名称:dict_txt_all.txt。

生成测试集合和训练集合 -> 文件名称:train_list_end.txt/valid_list_end.txt。

过程中使用了词干还原算法,将复数,动名词,完成时等进行了还原。WordNetLemmatizer 是用于取出停止词。

②:操作

先运行:python pre_create_data.py 生成 train.txt,valid.txt文件。

再次运行:python create_data_start.py

选择 1 训练模式。

生成训练集合之后,选择1 继续生成,然后得到结果。

4.3 执行训练

①:使用GPU进行训练

为了提高计算速度所以我采用的是GPU进行运算和训练。

代码如下:

#创建一个执行器
#1:CPU训练速度比较慢,故采用GPU进行训练
#2:为了保证acc,所以请使用GPU。
place = fluid.CUDAPlace(0)

②:输出模型

    # 保存预测模型
    save_path = 'infer_model/'

    # 删除旧的模型文件
    shutil.rmtree(save_path, ignore_errors=True)

    # 创建保持模型文件目录
    os.makedirs(save_path)

    # 保存预测模型
    fluid.io.save_inference_model(save_path, feeded_var_names=[words.name], target_vars=[model], executor=exe)

模型名称为:infer_model

③:使用方式

在完成了1,2流程之后即可进行运行此代码

python train.py

4.4 执行预测

①:选择GPU进行预测输出

②:输出文件为result.txt

其中输出的结果里面就包含了acc。

4.5 框架安装方法

①:访问网站paddlepaddle.org/paddle/Gett…

②:输出结果

安装信息:

pip3 install paddlepaddle-gpu

验证信息:

使用 python3 进入python解释器,输入import paddle.fluid ,再输入 paddle.fluid.install_check.run_check()。 如果出现 Your Paddle Fluid is installed succesfully!,说明您已成功安装。

说明信息:

需要 python 版本高于 3.5.0 且 pip 版本高于 9.0.1。 更多帮助信息请参考 Ubuntu 下使用 pip 安装

注:pip install paddlepaddle-gpu 命令将安装支持CUDA 9.0 cuDNN v7的PaddlePaddle,如果您的CUDA或cuDNN版本与此不同,可以参考 这里 了解其他CUDA/cuDNN版本所适用的安装命令

4.6 代码测试

环境:

显卡NVIDIA Tesla V100
Cores2
内存8GB Memory
系统Ubuntu
显存16G
paddlepaddle版本框架: PaddlePaddle 1.4.1 (Python 3.6)

软件:Jupyter 笔记本

地址:aistudio.baidu.com

模型:infer_model

训练迭代日志输出:

Pass:5, Batch:40, Cost:1.07034, Acc:0.67969
Test:5, Cost:1.30199, ACC:0.58453
Pass:6, Batch:0, Cost:1.01823, Acc:0.73438
Test:6, Cost:1.29810, ACC:0.57989
Pass:6, Batch:40, Cost:1.02507, Acc:0.67969
Test:6, Cost:1.25205, ACC:0.58379
Pass:7, Batch:0, Cost:0.92054, Acc:0.76562
Test:7, Cost:1.24948, ACC:0.58575
Pass:7, Batch:40, Cost:1.03106, Acc:0.74219
Test:7, Cost:1.21637, ACC:0.59475
Pass:8, Batch:0, Cost:1.00770, Acc:0.75000
Test:8, Cost:1.21415, ACC:0.59182
Pass:8, Batch:40, Cost:0.84253, Acc:0.83594
Test:8, Cost:1.19011, ACC:0.60232
Pass:9, Batch:0, Cost:0.87655, Acc:0.77344
Test:9, Cost:1.18894, ACC:0.59915
Pass:9, Batch:40, Cost:0.88950, Acc:0.74219
Test:9, Cost:1.17149, ACC:0.60451
Pass:10, Batch:0, Cost:0.81905, Acc:0.77344
Test:10, Cost:1.16931, ACC:0.60939
Pass:10, Batch:40, Cost:0.70325, Acc:0.84375
Test:10, Cost:1.15738, ACC:0.61428
Pass:11, Batch:0, Cost:0.71462, Acc:0.81250
Test:11, Cost:1.15619, ACC:0.61525
Pass:11, Batch:40, Cost:0.68220, Acc:0.84375
Test:11, Cost:1.14702, ACC:0.61795
Pass:12, Batch:0, Cost:0.43453, Acc:0.96094
Test:12, Cost:1.14599, ACC:0.61428
Pass:12, Batch:40, Cost:0.66188, Acc:0.84375
Test:12, Cost:1.14097, ACC:0.61697
Pass:13, Batch:0, Cost:0.58125, Acc:0.85156
Test:13, Cost:1.14213, ACC:0.61916
Pass:13, Batch:40, Cost:0.64012, Acc:0.85938
Test:13, Cost:1.13701, ACC:0.62721
Pass:14, Batch:0, Cost:0.63643, Acc:0.82031
Test:14, Cost:1.13649, ACC:0.62697
Pass:14, Batch:40, Cost:0.50114, Acc:0.87500
Test:14, Cost:1.13436, ACC:0.62819
Pass:15, Batch:0, Cost:0.49957, Acc:0.90625
Test:15, Cost:1.13572, ACC:0.63014
Pass:15, Batch:40, Cost:0.47065, Acc:0.85938
Test:15, Cost:1.13555, ACC:0.62990
Pass:16, Batch:0, Cost:0.39780, Acc:0.91406
Test:16, Cost:1.13521, ACC:0.62869
Pass:16, Batch:40, Cost:0.37418, Acc:0.94531
Test:16, Cost:1.13725, ACC:0.63038
Pass:17, Batch:0, Cost:0.42288, Acc:0.92969
省略了一些

预测迭代输出(部分):

预测结果标签为:3, 名称为:3, 概率为:0.999515
预测结果标签为:8, 名称为:8, 概率为:0.999912
预测结果标签为:3, 名称为:3, 概率为:0.999656
预测结果标签为:5, 名称为:5, 概率为:0.999305
预测结果标签为:3, 名称为:3, 概率为:0.999532
预测结果标签为:9, 名称为:9, 概率为:0.999810
预测结果标签为:9, 名称为:9, 概率为:0.993418
预测结果标签为:9, 名称为:9, 概率为:0.999761
预测结果标签为:8, 名称为:8, 概率为:0.999687
预测结果标签为:1, 名称为:1, 概率为:0.995791
预测结果标签为:8, 名称为:8, 概率为:0.999731
预测结果标签为:5, 名称为:5, 概率为:0.995905
预测结果标签为:5, 名称为:5, 概率为:0.997542
预测结果标签为:9, 名称为:9, 概率为:0.999930
预测结果标签为:2, 名称为:2, 概率为:0.998152
预测结果标签为:9, 名称为:9, 概率为:0.999630
预测结果标签为:5, 名称为:5, 概率为:0.999668
预测结果标签为:5, 名称为:5, 概率为:0.999181
预测结果标签为:8, 名称为:8, 概率为:0.999770
预测结果标签为:9, 名称为:9, 概率为:0.998988
预测结果标签为:9, 名称为:9, 概率为:0.999110
预测结果标签为:3, 名称为:3, 概率为:0.999672
预测结果标签为:3, 名称为:3, 概率为:0.999675
省略了一些
the accurary is :0.981

最后准确率在0.981。

5.总结

其实大部分人做这块还是面向算法模型和框架做事情~所以我们所需要掌握的就是如何正确使用框架,输出目标结果即可。没必要去搞一些花里胡哨的。差不多就到这里吧,码字好累啊~~~~~