基于神经网络的文本分类算法

文章目录

    • 1.文件介绍
    • 2.核心算法
      • cnn算法
    • 3.操作步骤
      • 1.预处理数据
      • 2.生成数据集
    • 3.执行训练
    • 4.执行预测
    • 5.框架安装方法
    • 6.代码测试
      • 模型:infer_model
      • 模型:infer_model1
      • 预测图片
    • 7.链接

1.文件介绍

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 单词纠正算法文件

2.核心算法

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

3.操作步骤

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")

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 继续生成,然后得到结果。

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.执行预测

①:选择GPU进行预测输出

②:输出文件为result.txt

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

5.框架安装方法

①:访问网站http://paddlepaddle.org/paddle/GettingStarted

②:选择如图

基于神经网络的文本分类算法_第1张图片

③:输出结果

安装信息:

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版本所适用的安装命令

6.代码测试

环境:

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

软件:Jupyter 笔记本

地址:https://aistudio.baidu.com

模型:infer_model

训练迭代日志输出:

Pass:0, Batch:0, Cost:2.30027, Acc:0.10156
Test:0, Cost:2.26785, ACC:0.19443
Pass:0, Batch:40, Cost:2.00160, Acc:0.21094
Test:0, Cost:1.96510, ACC:0.26152
Pass:1, Batch:0, Cost:1.94542, Acc:0.44531
Test:1, Cost:1.95483, ACC:0.35104
Pass:1, Batch:40, Cost:1.78021, Acc:0.44531
Test:1, Cost:1.77840, ACC:0.40863
Pass:2, Batch:0, Cost:1.68884, Acc:0.55469
Test:2, Cost:1.76447, ACC:0.43449
Pass:2, Batch:40, Cost:1.55811, Acc:0.58594
Test:2, Cost:1.59984, ACC:0.48448
Pass:3, Batch:0, Cost:1.50054, Acc:0.62500
Test:3, Cost:1.58942, ACC:0.47548
Pass:3, Batch:40, Cost:1.39445, Acc:0.61719
Test:3, Cost:1.46806, ACC:0.51233
Pass:4, Batch:0, Cost:1.36574, Acc:0.60938
Test:4, Cost:1.45963, ACC:0.52233
Pass:4, Batch:40, Cost:1.13338, Acc:0.72656
Test:4, Cost:1.36950, ACC:0.56015
Pass:5, Batch:0, Cost:1.13022, Acc:0.69531
Test:5, Cost:1.36396, ACC:0.56405
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
…………
Test:42, Cost:1.33106, ACC:0.61869
Pass:42, Batch:40, Cost:0.09521, Acc:0.97656
Test:42, Cost:1.33917, ACC:0.61700
Pass:43, Batch:0, Cost:0.07278, Acc:0.99219
Test:43, Cost:1.33959, ACC:0.61919
Pass:43, Batch:40, Cost:0.12422, Acc:0.99219
Test:43, Cost:1.34719, ACC:0.62162
Pass:44, Batch:0, Cost:0.08373, Acc:1.00000
Test:44, Cost:1.34702, ACC:0.61895
Pass:44, Batch:40, Cost:0.09269, Acc:0.99219
Test:44, Cost:1.35452, ACC:0.61821
Pass:45, Batch:0, Cost:0.08832, Acc:0.99219
Test:45, Cost:1.35511, ACC:0.61845
Pass:45, Batch:40, Cost:0.08397, Acc:0.99219
Test:45, Cost:1.36335, ACC:0.61895
Pass:46, Batch:0, Cost:0.08041, Acc:0.99219
Test:46, Cost:1.36386, ACC:0.61993
Pass:46, Batch:40, Cost:0.13990, Acc:0.99219
Test:46, Cost:1.37065, ACC:0.62309
Pass:47, Batch:0, Cost:0.08154, Acc:0.99219
Test:47, Cost:1.37091, ACC:0.62212
Pass:47, Batch:40, Cost:0.08119, Acc:0.98438
Test:47, Cost:1.37767, ACC:0.62333
Pass:48, Batch:0, Cost:0.09884, Acc:0.98438
Test:48, Cost:1.37948, ACC:0.62407
Pass:48, Batch:40, Cost:0.06289, Acc:0.99219
Test:48, Cost:1.38637, ACC:0.62090
Pass:49, Batch:0, Cost:0.10498, Acc:0.98438
Test:49, Cost:1.38653, ACC:0.62090
Pass:49, Batch:40, Cost:0.04686, Acc:1.00000
Test:49, Cost:1.39335, ACC:0.62090

预测迭代输出(部分):

预测结果标签为:9, 名称为:9, 概率为:0.991497
预测结果标签为:9, 名称为:9, 概率为:0.998278
预测结果标签为:8, 名称为:8, 概率为:0.999672
预测结果标签为:3, 名称为:3, 概率为:0.999713
预测结果标签为:9, 名称为:9, 概率为:0.999951
预测结果标签为:6, 名称为:6, 概率为:0.996646
预测结果标签为:6, 名称为:6, 概率为:0.998817
预测结果标签为:5, 名称为:5, 概率为:0.999460
预测结果标签为:8, 名称为:8, 概率为:0.999365
预测结果标签为:9, 名称为:9, 概率为:0.999858
预测结果标签为:2, 名称为:2, 概率为:0.999043
预测结果标签为:3, 名称为:3, 概率为:0.999792
预测结果标签为:3, 名称为:3, 概率为:0.999733
预测结果标签为:3, 名称为:3, 概率为:0.999399
预测结果标签为:5, 名称为:5, 概率为:0.999431
预测结果标签为:3, 名称为:3, 概率为:0.999643
预测结果标签为:9, 名称为:9, 概率为:0.999906
预测结果标签为:6, 名称为:6, 概率为:0.999160
预测结果标签为:2, 名称为:2, 概率为:0.999324
预测结果标签为:9, 名称为:9, 概率为:0.978567
预测结果标签为:4, 名称为:4, 概率为:0.998770
预测结果标签为:0, 名称为:0, 概率为:0.997624
预测结果标签为:9, 名称为:9, 概率为:0.997769
预测结果标签为:5, 名称为:5, 概率为:0.999236
预测结果标签为:3, 名称为:3, 概率为:0.999817
预测结果标签为:5, 名称为:5, 概率为:0.999514
预测结果标签为:8, 名称为:8, 概率为:0.999878
预测结果标签为:9, 名称为:9, 概率为:0.998768
预测结果标签为:8, 名称为:8, 概率为:0.999859
预测结果标签为:3, 名称为:3, 概率为:0.999808
预测结果标签为:9, 名称为:9, 概率为:0.999706
预测结果标签为:9, 名称为:9, 概率为:0.999841
预测结果标签为:3, 名称为:3, 概率为:0.999711
预测结果标签为:8, 名称为:8, 概率为:0.999848
预测结果标签为:3, 名称为:3, 概率为:0.999552
预测结果标签为:3, 名称为:3, 概率为:0.999582
预测结果标签为:6, 名称为:6, 概率为:0.999731
预测结果标签为:3, 名称为:3, 概率为:0.999796
预测结果标签为:8, 名称为:8, 概率为:0.999836
预测结果标签为:3, 名称为:3, 概率为:0.999681
预测结果标签为:9, 名称为:9, 概率为:0.999633
预测结果标签为:8, 名称为:8, 概率为:0.999442
预测结果标签为:3, 名称为:3, 概率为:0.999427
预测结果标签为:5, 名称为:5, 概率为:0.999276
预测结果标签为:4, 名称为:4, 概率为:0.999500
预测结果标签为:5, 名称为:5, 概率为:0.999688
预测结果标签为:8, 名称为:8, 概率为:0.999826
预测结果标签为:6, 名称为:6, 概率为:0.999643
预测结果标签为:8, 名称为:8, 概率为:0.997779
预测结果标签为:3, 名称为:3, 概率为:0.998990
预测结果标签为:9, 名称为:9, 概率为:0.999868
预测结果标签为:9, 名称为:9, 概率为:0.684625
预测结果标签为:3, 名称为:3, 概率为:0.999650
预测结果标签为:2, 名称为:2, 概率为:0.999265
预测结果标签为:9, 名称为:9, 概率为:0.999849
预测结果标签为:8, 名称为:8, 概率为:0.999760
预测结果标签为:9, 名称为:9, 概率为:0.999800
预测结果标签为:6, 名称为:6, 概率为:0.999826
预测结果标签为:3, 名称为:3, 概率为:0.999832
预测结果标签为:5, 名称为:5, 概率为:0.997896
预测结果标签为:5, 名称为:5, 概率为:0.998601
预测结果标签为:8, 名称为:8, 概率为:0.999821
预测结果标签为:6, 名称为:6, 概率为:0.999287
预测结果标签为:5, 名称为:5, 概率为:0.998484
the accurary is :0.981

模型:infer_model1

训练输出:迭代次数20

运行输出
运行耗时: 13秒817毫秒
Pass:0, Batch:0, Cost:2.31272, Acc:0.03125
Test:0, Cost:2.24595, ACC:0.19969
Pass:1, Batch:0, Cost:1.81745, Acc:0.45312
Test:1, Cost:1.84772, ACC:0.38608
Pass:2, Batch:0, Cost:1.41308, Acc:0.64844
Test:2, Cost:1.53850, ACC:0.51381
Pass:3, Batch:0, Cost:1.25036, Acc:0.65234
Test:3, Cost:1.34495, ACC:0.55994
Pass:4, Batch:0, Cost:0.88966, Acc:0.80078
Test:4, Cost:1.23029, ACC:0.59277
Pass:5, Batch:0, Cost:0.88889, Acc:0.76562
Test:5, Cost:1.16325, ACC:0.61055
Pass:6, Batch:0, Cost:0.71513, Acc:0.83984
Test:6, Cost:1.12812, ACC:0.61564
Pass:7, Batch:0, Cost:0.69282, Acc:0.83203
Test:7, Cost:1.10100, ACC:0.63450
Pass:8, Batch:0, Cost:0.56466, Acc:0.85156
Test:8, Cost:1.08364, ACC:0.63665
Pass:9, Batch:0, Cost:0.54750, Acc:0.85938
Test:9, Cost:1.07774, ACC:0.63615
Pass:10, Batch:0, Cost:0.47748, Acc:0.91016
Test:10, Cost:1.08290, ACC:0.64241
Pass:11, Batch:0, Cost:0.43657, Acc:0.89844
Test:11, Cost:1.08662, ACC:0.64046
Pass:12, Batch:0, Cost:0.34100, Acc:0.92578
Test:12, Cost:1.09085, ACC:0.63871
Pass:13, Batch:0, Cost:0.32262, Acc:0.92188
Test:13, Cost:1.10559, ACC:0.63860
Pass:14, Batch:0, Cost:0.29162, Acc:0.94922
Test:14, Cost:1.11402, ACC:0.64595
Pass:15, Batch:0, Cost:0.25937, Acc:0.96094
Test:15, Cost:1.12722, ACC:0.64564
Pass:16, Batch:0, Cost:0.21458, Acc:0.96094
Test:16, Cost:1.13567, ACC:0.64487
Pass:17, Batch:0, Cost:0.21839, Acc:0.97266
Test:17, Cost:1.15285, ACC:0.64271
Pass:18, Batch:0, Cost:0.16948, Acc:0.96875
Test:18, Cost:1.16557, ACC:0.64477
Pass:19, Batch:0, Cost:0.18152, Acc:0.96094
Test:19, Cost:1.17665, ACC:0.64682

部分少量预测结果日志

运行输出
运行耗时: 32秒806毫秒
预测结果标签为:9, 名称为:9, 概率为:0.998335
预测结果标签为:8, 名称为:8, 概率为:0.997243
预测结果标签为:1, 名称为:1, 概率为:0.974011
预测结果标签为:8, 名称为:8, 概率为:0.997754
预测结果标签为:9, 名称为:9, 概率为:0.938332
预测结果标签为:8, 名称为:8, 概率为:0.992840
预测结果标签为:9, 名称为:9, 概率为:0.906592
预测结果标签为:5, 名称为:5, 概率为:0.998645
预测结果标签为:9, 名称为:9, 概率为:0.995915
预测结果标签为:3, 名称为:3, 概率为:0.893067
预测结果标签为:9, 名称为:9, 概率为:0.999800
预测结果标签为:5, 名称为:5, 概率为:0.999970
预测结果标签为:5, 名称为:5, 概率为:0.999953
预测结果标签为:3, 名称为:3, 概率为:0.949420
预测结果标签为:4, 名称为:4, 概率为:0.975957
预测结果标签为:5, 名称为:5, 概率为:0.999858
预测结果标签为:5, 名称为:5, 概率为:0.948048
预测结果标签为:9, 名称为:9, 概率为:0.991910
预测结果标签为:1, 名称为:1, 概率为:0.978594
预测结果标签为:9, 名称为:9, 概率为:0.996044
预测结果标签为:8, 名称为:8, 概率为:0.935919
预测结果标签为:9, 名称为:9, 概率为:0.804322
预测结果标签为:6, 名称为:6, 概率为:0.978003
预测结果标签为:5, 名称为:5, 概率为:0.996343
预测结果标签为:6, 名称为:6, 概率为:0.941220
预测结果标签为:5, 名称为:5, 概率为:0.897283
预测结果标签为:3, 名称为:3, 概率为:0.852642
预测结果标签为:3, 名称为:3, 概率为:0.999675
预测结果标签为:3, 名称为:3, 概率为:0.966107
预测结果标签为:6, 名称为:6, 概率为:0.987612
预测结果标签为:8, 名称为:8, 概率为:0.999760
预测结果标签为:3, 名称为:3, 概率为:0.981871
预测结果标签为:3, 名称为:3, 概率为:0.972782
预测结果标签为:3, 名称为:3, 概率为:0.809394
预测结果标签为:1, 名称为:1, 概率为:0.965925
预测结果标签为:3, 名称为:3, 概率为:0.996171
预测结果标签为:3, 名称为:3, 概率为:0.992061
预测结果标签为:4, 名称为:4, 概率为:0.764386
预测结果标签为:0, 名称为:0, 概率为:0.355728
预测结果标签为:5, 名称为:5, 概率为:0.933631
预测结果标签为:8, 名称为:8, 概率为:0.465576
预测结果标签为:1, 名称为:1, 概率为:0.964662
预测结果标签为:3, 名称为:3, 概率为:0.974428
预测结果标签为:4, 名称为:4, 概率为:0.695865
预测结果标签为:2, 名称为:2, 概率为:0.976151
预测结果标签为:2, 名称为:2, 概率为:0.705707
预测结果标签为:8, 名称为:8, 概率为:0.865111
预测结果标签为:1, 名称为:1, 概率为:0.805396
预测结果标签为:3, 名称为:3, 概率为:0.966817
预测结果标签为:9, 名称为:9, 概率为:0.933152
预测结果标签为:9, 名称为:9, 概率为:0.999612
预测结果标签为:9, 名称为:9, 概率为:0.947917
预测结果标签为:5, 名称为:5, 概率为:0.997199
预测结果标签为:8, 名称为:8, 概率为:0.786440
预测结果标签为:8, 名称为:8, 概率为:0.974956
预测结果标签为:6, 名称为:6, 概率为:0.999848
预测结果标签为:8, 名称为:8, 概率为:0.999662
预测结果标签为:9, 名称为:9, 概率为:0.937772
预测结果标签为:3, 名称为:3, 概率为:0.983039
预测结果标签为:8, 名称为:8, 概率为:0.991293
预测结果标签为:8, 名称为:8, 概率为:0.983372
预测结果标签为:5, 名称为:5, 概率为:0.994179
预测结果标签为:4, 名称为:4, 概率为:0.974319
预测结果标签为:3, 名称为:3, 概率为:0.999181
预测结果标签为:5, 名称为:5, 概率为:0.999173
预测结果标签为:3, 名称为:3, 概率为:0.903661
预测结果标签为:8, 名称为:8, 概率为:0.969651
预测结果标签为:9, 名称为:9, 概率为:0.982604
预测结果标签为:9, 名称为:9, 概率为:0.997458
预测结果标签为:6, 名称为:6, 概率为:0.967349
预测结果标签为:2, 名称为:2, 概率为:0.606989
预测结果标签为:2, 名称为:2, 概率为:0.671729
预测结果标签为:4, 名称为:4, 概率为:0.995273
预测结果标签为:4, 名称为:4, 概率为:0.986422
预测结果标签为:4, 名称为:4, 概率为:0.966105
预测结果标签为:3, 名称为:3, 概率为:0.717699
预测结果标签为:5, 名称为:5, 概率为:0.894837
预测结果标签为:9, 名称为:9, 概率为:0.970747
预测结果标签为:2, 名称为:2, 概率为:0.950979
预测结果标签为:3, 名称为:3, 概率为:0.891249
the accurary is :0.984

预测图片

基于神经网络的文本分类算法_第2张图片

7.链接

github仓库:https://github.com/guanjiangtao/python_work/tree/master/课程设计

百度平台地址(已经公开):https://aistudio.baidu.com/aistudio/projectdetail/71554

paddlepaddle安装文档:http://paddlepaddle.org/documentation/docs/zh/1.4/beginners_guide/install/index_cn.html?from=paddlefooter

对应代码git地址:https://github.com/guanjiangtao/cnn_text_classification (请使用GPU进行运算)

你可能感兴趣的:(基于神经网络的文本分类算法)