自然语言处理(NLP):08 TextCNN在短文本分类应用介绍

TextCNN 短文本分类案例分享,学习更多工业界案例:数据分析可视化技术、TextCNN论文原理、词向量技术、tensorboardx效果可视化工具、TextCNN 短文本分类案例分享总结,让大家彻底掌握TextCNN 在文本分类领域应用,有任何问题请留言或者加入交流群:NLP技术交流群 ,让我们一起学习NLP。

自然语言处理(NLP):08 TextCNN在短文本分类应用介绍
自然语言处理(NLP):08-01 数据分析和文本分类效果对比
自然语言处理(NLP):08-02 CNN文本分类论文讲解及TextCNN原理
自然语言处理(NLP):08-03 词向量word2vec
自然语言处理(NLP):08-04 tensorboardx 可视化
自然语言处理(NLP):08-05 TextCNN短文本分类案例分享

文本分类应用场景

文章分类服务对文章内容进行深度分析,该技术在个性化推荐、文章聚合、文本内容分析等场景具有广泛的应用价值.
这里列举几个工业界常用的几个文本案例
在这里插入图片描述

新闻分类

根据文本描述的内容方向,针对新闻媒体的文章做自动分类,例如军事类、农业类、体育类、娱乐类等多种类别方向.
在这里插入图片描述

文本审核

定制训练文本审核的分类模型,如判断文本中是否有交易、涉黄涉赌小广告等违规描述类型的内容

电商评论分类

电商业务可根据用户对商品的评价内容维度,做物流类、服务类、产品类等问题描述方向的自动分类

舆情监控

通过对需要舆情监控的实时文字数据流进行情感倾向性分析,把握用户对热点信息的情感倾向性变化

外卖智能客服场景

在这里插入图片描述

  • 数据特点:用户的 query 比较短,大概在 15 个汉字
  • 实验效果分析:不同分类模型效果分析
    在这里插入图片描述

用 TextCNN 模型在 10ms 以内就可以解决,如果用 BERT 模型的话可能需要 70ms 左右,这个时间还是比较长的,实际上线的时候选择了 TextCNN 模型。

智能语音平台语义理解

在这里插入图片描述

业界通用型的 NLU 一般会先过意图识别模型,再将识别出的意图传给槽位识别模型进行判断。整个 Pipeline 如下。其中: 意图识别是一个典型的短文本分类问题,可以使用 TextCNN 来进行文本分类.
在这里插入图片描述

注:语义理解中意图识别和槽位识别一般两个思路进行演进

  • 意图识别:分类问题;槽位填充:序列标注问题
    分别采用单独的模型进行推测,不足之处:意图和槽位是相互影响的
  • 意图识别和序列标注问题联合训练(这里不详细进行介绍,大家可以关乎后续更多内容)

文本分类技术方案以及挑战

文本分类作为文本理解的基本任务、能够服务于大量应用(如文本摘要、情感分析、推荐系统等等),更是长期以来学术界与工业界关注的焦点.

针对长文本信息我们可以很容易挖掘信息,但是对于短文本来说的花,很难。

文本分类处理方案

在这里插入图片描述

针对传统的机器学习文本分类,推荐个人博客:https://wenjie.blog.csdn.net/category_2379719.html

短文本处理难点

短文本由于内容简短,易于阅读和传播,被民众广泛使用,在新闻标题、社交媒体信息和短信、智能客服搜索、智能音箱语音交互等随处可见,但是内容简短、缺失会引起数据稀疏,与段落或者文章不同,短文本并不总能观察出句法,且短文本存在的多义和错误往往使内容不清楚,难以理解语义,导致模型分类没有足够特征进行类别判断,分类任务困难。

技术方案整体介绍

在这里插入图片描述

本课程我们重点来学习下TextCNN 在文本分类中应用。

分类器选择

对于多分类问题,可以使用softmax函数作为分类器,最小化交叉熵(Cross Entropy)

  • 传统机器学习文本分类算法

  • 深度学习文本分类算法

特征提取

基于深度学习方法 (基于word2vec 或者 随机方式 进行实验对比):

  • 将所有词(或词频>阈值的词)组成一个词表,得到word2index字典和index2word字典;
  • 将词映射为index,并且进行padding,然后通过词对应的index对词向量矩阵进行Lookup,得到当前文本对应的word2vec;
  • 使用TextCNN模型在word2vec的基础上进行特征提取

这里并没有使用学术界比较流行的BERT来进行讲解,因为目前很多公司文本分类处理线上系统TextCNN,FastText等用的还是比较普遍。关于BERT方面的学习,欢迎大家关注更多的内容

深度学习工具

这里基于PyTorch深度学习工具,TextCNN 模型训练

模型在线预测

对于大型项目在线服务功能,我们需要使用JAVA或者C++、Go 进行Web 服务部署,对于我们中小型项目我们采用Flask Web 框架进行部署

处理流程

  • 原始文本数据分析以及可视化图表展示
  • 文本预处理:分词、数据离散化表示
  • 构建词表:构建<word,count> 、文本词 统一长度向量化表示
  • Embedding : 根据词index 获取词向量、随机或者预训练词向量初始化单词的Embedding 向量
  • 模型训练:CNN、效果评估
  • 分类器:softmax 获取文本对应类别最大概率
  • 在线服务部署

在线服务预测

http://127.0.0.1:5000/v1/p?q=昆明拟规定乘地铁禁止手机外放声音

CNN 文本分类原理

  • CNN 论文精选

《Convolutional Neural Networks for Sentence Classification.pdf》

《A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification.pdf》

词向量介绍

《词向量word2vec.ipynb》

tensorboardX 分类效果

《tensorboardx 可视化.ipynb》

短文本分类案例

基于新闻领域的数据,完成文本分类项目主要 基于深度学习来完成。这里采用CNN完成短文本的分类,采用PyTorch 深度学习工具。

$ tree -L 2
.
├── api.py
├── config_file
├── data
│   ├── ckpts
│   ├── data
│   ├── log
├── data_processing.py
├── dataset.py
├── docs
├── images
├── main.py
├── models
│   ├── TextCNN.py
├── notebook
├── static
│   ├── css
│   ├── img
│   └── js
├── templates
│   └── index.htm
└── utils.py
  • data 训练数据、模型存储以及日志记录、词向量
  • data_processing.py 数据预处理
  • notebook 技术方案、数据分析jupyter-notebook 文件以及词向量生成
  • dataset.py 自定义PyTorch数据集类
  • docs 深度学习文本分类论文以及课件
  • notebook 数据分析
  • config_file 训练参数文件
  • models 定义模型文件,例如:TextCNN,RCNN 等
  • main.py 程序入口
  • api.py static,templates 在线服务程序

数据可视化分析

详见: 《 02-文本数据分析以及短文本分类技术选型.ipynb》

针对文本数据分析,目的是了解业务数据。重点关注的内容如:

  • pandas数据加载介绍
  • pandas 函数使用
  • 通过pyecharts,seaboard,matplotlib进行数据可视化
  • 文本分类深度学习模型工业界效果对比

关于数据可视化大家如果不熟悉,可以上网搜索学习

《Python数据可视化 pyecharts实战》
《Python数据可视化 matplotlib实战》
《Python数据可视化 seaborn实战》

预处理

构建词表

Embedding

模型训练

CPU环境 vs GPU环境下短文本分类运行结果

  • 在CPU环境下训练 过程
$ python main.py --model TextCNN  --dataset data --embedding pre_trained
data_path =  data/data/data.txt
0it [00:00, ?it/s]Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/y4/m077y_dj1pd7blyvjrx9y30w0000gn/T/jieba.cache
Loading model cost 0.859 seconds.
Prefix dict has been built succesfully.
200000it [00:26, 7614.50it/s]
total_examples =  200000
label count =  10
sentences samples =  [['词汇', '阅读', '是', '关键', ' ', '08', '年', '考研', '暑期', '英语', '复习', '全', '指南'], ['中国', '人民', '公安大学', '2012', '年', '硕士', '研究生', '目录', '及', '书目']]
lables samples =  [3, 3]
max_seq_len =  21
vocab size= 100002
device =  cpu
pre_trained init embedding 
models =  Model(
  (embedding): Embedding(100002, 300)
  (convs): ModuleList(
    (0): Sequential(
      (0): Conv1d(300, 256, kernel_size=(2,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=20, stride=20, padding=0, dilation=1, ceil_mode=False)
    )
    (1): Sequential(
      (0): Conv1d(300, 256, kernel_size=(3,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=19, stride=19, padding=0, dilation=1, ceil_mode=False)
    )
    (2): Sequential(
      (0): Conv1d(300, 256, kernel_size=(4,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=18, stride=18, padding=0, dilation=1, ceil_mode=False)
    )
  )
  (fc): Linear(in_features=768, out_features=10, bias=True)
)
Epoch[1/10]
Iter:      0,  Train Loss:   2.4,  Train Acc:  7.81%,  Val Loss:   2.4,  Val Acc: 10.94%,  Time: 0:00:38 *
Iter:    100,  Train Loss:  0.55,  Train Acc: 82.81%,  Val Loss:  0.52,  Val Acc: 83.78%,  Time: 0:02:11 *
Iter:    200,  Train Loss:  0.33,  Train Acc: 90.62%,  Val Loss:  0.41,  Val Acc: 87.03%,  Time: 0:03:44 *
Iter:    300,  Train Loss:  0.32,  Train Acc: 88.28%,  Val Loss:  0.37,  Val Acc: 88.26%,  Time: 0:05:17 *
Iter:    400,  Train Loss:  0.36,  Train Acc: 89.84%,  Val Loss:  0.35,  Val Acc: 89.14%,  Time: 0:06:50 *
Iter:    500,  Train Loss:  0.41,  Train Acc: 88.28%,  Val Loss:  0.35,  Val Acc: 89.07%,  Time: 0:08:19 *
Iter:    600,  Train Loss:  0.31,  Train Acc: 92.97%,  Val Loss:  0.34,  Val Acc: 89.49%,  Time: 0:09:51 *
Iter:    700,  Train Loss:  0.46,  Train Acc: 87.50%,  Val Loss:  0.32,  Val Acc: 89.84%,  Time: 0:11:31 *
Iter:    800,  Train Loss:  0.18,  Train Acc: 92.97%,  Val Loss:  0.31,  Val Acc: 90.14%,  Time: 0:13:12 *
Iter:    900,  Train Loss:  0.28,  Train Acc: 89.06%,  Val Loss:  0.32,  Val Acc: 89.95%,  Time: 0:14:54 
Iter:   1000,  Train Loss:  0.37,  Train Acc: 90.62%,  Val Loss:   0.3,  Val Acc: 90.68%,  Time: 0:16:37 *
Epoch[2/10]
Iter:   1100,  Train Loss:  0.34,  Train Acc: 89.06%,  Val Loss:  0.29,  Val Acc: 90.89%,  Time: 0:18:27 *
Iter:   1200,  Train Loss:  0.17,  Train Acc: 93.75%,  Val Loss:   0.3,  Val Acc: 90.91%,  Time: 0:20:18 
Iter:   1300,  Train Loss:  0.25,  Train Acc: 94.53%,  Val Loss:   0.3,  Val Acc: 90.95%,  Time: 0:22:08 
Iter:   1400,  Train Loss:   0.2,  Train Acc: 92.19%,  Val Loss:  0.29,  Val Acc: 90.92%,  Time: 0:23:59 
Iter:   1500,  Train Loss:  0.24,  Train Acc: 92.19%,  Val Loss:   0.3,  Val Acc: 90.89%,  Time: 0:25:50 
Iter:   1600,  Train Loss:  0.18,  Train Acc: 93.75%,  Val Loss:  0.29,  Val Acc: 91.20%,  Time: 0:27:41 *
Iter:   1700,  Train Loss: 0.088,  Train Acc: 97.66%,  Val Loss:  0.29,  Val Acc: 91.09%,  Time: 0:29:31 
Iter:   1800,  Train Loss:  0.22,  Train Acc: 93.75%,  Val Loss:   0.3,  Val Acc: 91.10%,  Time: 0:31:16 
Iter:   1900,  Train Loss:   0.2,  Train Acc: 92.97%,  Val Loss:  0.29,  Val Acc: 91.27%,  Time: 0:33:06 *
Iter:   2000,  Train Loss:  0.25,  Train Acc: 92.97%,  Val Loss:  0.29,  Val Acc: 91.37%,  Time: 0:34:58 *
Iter:   2100,  Train Loss:  0.17,  Train Acc: 96.09%,  Val Loss:  0.29,  Val Acc: 91.33%,  Time: 0:36:40 
Epoch[3/10]
Iter:   2200,  Train Loss:  0.16,  Train Acc: 96.09%,  Val Loss:  0.29,  Val Acc: 91.32%,  Time: 0:38:22 
Iter:   2300,  Train Loss: 0.049,  Train Acc: 99.22%,  Val Loss:  0.31,  Val Acc: 91.27%,  Time: 0:40:03 
Iter:   2400,  Train Loss:  0.18,  Train Acc: 93.75%,  Val Loss:   0.3,  Val Acc: 91.31%,  Time: 0:41:48 
Iter:   2500,  Train Loss: 0.038,  Train Acc: 99.22%,  Val Loss:  0.31,  Val Acc: 91.16%,  Time: 0:43:32 
Iter:   2600,  Train Loss: 0.077,  Train Acc: 98.44%,  Val Loss:  0.32,  Val Acc: 91.16%,  Time: 0:45:15 
Iter:   2700,  Train Loss: 0.079,  Train Acc: 98.44%,  Val Loss:  0.32,  Val Acc: 91.04%,  Time: 0:46:58 
Iter:   2800,  Train Loss:  0.18,  Train Acc: 95.31%,  Val Loss:  0.32,  Val Acc: 91.30%,  Time: 0:48:40 
Iter:   2900,  Train Loss: 0.088,  Train Acc: 98.44%,  Val Loss:  0.33,  Val Acc: 90.93%,  Time: 0:50:22 
Iter:   3000,  Train Loss:  0.17,  Train Acc: 96.09%,  Val Loss:  0.34,  Val Acc: 90.90%,  Time: 0:52:05 
No optimization for a long time, auto-stopping...
Test Loss:  0.29,  Test Acc: 91.38%
Precision, Recall and F1-Score...
               precision    recall  f1-score   support

      finance     0.9052    0.8966    0.9009      5986
       realty     0.9383    0.9245    0.9313      6024
       stocks     0.8487    0.8679    0.8582      6057
    education     0.9328    0.9653    0.9488      6053
      science     0.8871    0.8476    0.8669      6018
      society     0.9169    0.9012    0.9090      6023
     politics     0.8878    0.9034    0.8955      5893
       sports     0.9732    0.9577    0.9654      5999
         game     0.9144    0.9306    0.9224      5966
entertainment     0.9349    0.9435    0.9392      5981

  avg / total     0.9139    0.9138    0.9138     60000

Confusion Matrix...
[[5367   62  366   22   28   38   54    7   23   19]
 [  62 5569  144   27   33   74   55   11   22   27]
 [ 324  117 5257   15  160    8  120   14   24   18]
 [   4    6   11 5843   22   68   57   10   11   21]
 [  52   35  220   57 5101   85  128    9  289   42]
 [  39   58    8  141   69 5428  167   11   25   77]
 [  44   43  142   73   89  125 5324   10   18   25]
 [   7   10   17   19   10   20   23 5745   49   99]
 [  12   13   25   16  203   12   29   39 5552   65]
 [  18   22    4   51   35   62   40   47   59 5643]]
  • 在GPU训练过程执行日志
$ python main.py --model TextCNN  --dataset data --embedding pre_trained
data_path =  data/data/data.txt
0it [00:00, ?it/s]Building prefix dict from the default dictionary ...
Loading model from cache /var/folders/y4/m077y_dj1pd7blyvjrx9y30w0000gn/T/jieba.cache
Loading model cost 0.859 seconds.
Prefix dict has been built succesfully.
200000it [00:26, 7614.50it/s]
total_examples =  200000
label count =  10
sentences samples =  [['词汇', '阅读', '是', '关键', ' ', '08', '年', '考研', '暑期', '英语', '复习', '全', '指南'], ['中国', '人民', '公安大学', '2012', '年', '硕士', '研究生', '目录', '及', '书目']]
lables samples =  [3, 3]
max_seq_len =  21
vocab size= 100002
device =  cuda
pre_trained init embedding 

models =  Model(
  (embedding): Embedding(100002, 300)
  (convs): ModuleList(
    (0): Sequential(
      (0): Conv1d(300, 256, kernel_size=(2,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=31, stride=31, padding=0, dilation=1, ceil_mode=False)
    )
    (1): Sequential(
      (0): Conv1d(300, 256, kernel_size=(3,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=30, stride=30, padding=0, dilation=1, ceil_mode=False)
    )
    (2): Sequential(
      (0): Conv1d(300, 256, kernel_size=(4,), stride=(1,))
      (1): ReLU()
      (2): MaxPool1d(kernel_size=29, stride=29, padding=0, dilation=1, ceil_mode=False)
    )
  )
  (fc): Linear(in_features=768, out_features=10, bias=True)
)
Epoch[1/10]
Iter:      0,  Train Loss:   2.4,  Train Acc:  7.81%,  Val Loss:   2.4,  Val Acc: 11.23%,  Time: 0:00:03 *
Iter:    100,  Train Loss:  0.58,  Train Acc: 79.69%,  Val Loss:   0.5,  Val Acc: 84.18%,  Time: 0:00:08 *
Iter:    200,  Train Loss:  0.46,  Train Acc: 85.94%,  Val Loss:  0.41,  Val Acc: 87.05%,  Time: 0:00:12 *
Iter:    300,  Train Loss:  0.38,  Train Acc: 88.28%,  Val Loss:  0.37,  Val Acc: 88.56%,  Time: 0:00:16 *
Iter:    400,  Train Loss:  0.25,  Train Acc: 91.41%,  Val Loss:  0.36,  Val Acc: 88.75%,  Time: 0:00:20 *
Iter:    500,  Train Loss:   0.4,  Train Acc: 88.28%,  Val Loss:  0.34,  Val Acc: 89.34%,  Time: 0:00:24 *
Iter:    600,  Train Loss:  0.38,  Train Acc: 88.28%,  Val Loss:  0.33,  Val Acc: 89.65%,  Time: 0:00:28 *
Iter:    700,  Train Loss:  0.44,  Train Acc: 82.81%,  Val Loss:  0.32,  Val Acc: 90.08%,  Time: 0:00:32 *
Iter:    800,  Train Loss:  0.31,  Train Acc: 86.72%,  Val Loss:  0.31,  Val Acc: 90.39%,  Time: 0:00:35 *
Iter:    900,  Train Loss:  0.32,  Train Acc: 89.06%,  Val Loss:   0.3,  Val Acc: 90.62%,  Time: 0:00:39 *
Iter:   1000,  Train Loss:  0.28,  Train Acc: 89.06%,  Val Loss:   0.3,  Val Acc: 90.65%,  Time: 0:00:43 
Epoch[2/10]
Iter:   1100,  Train Loss:  0.12,  Train Acc: 97.66%,  Val Loss:  0.29,  Val Acc: 91.02%,  Time: 0:00:47 *
Iter:   1200,  Train Loss:  0.13,  Train Acc: 96.09%,  Val Loss:   0.3,  Val Acc: 90.77%,  Time: 0:00:50 
Iter:   1300,  Train Loss:  0.14,  Train Acc: 94.53%,  Val Loss:  0.29,  Val Acc: 91.25%,  Time: 0:00:54 *
Iter:   1400,  Train Loss:  0.27,  Train Acc: 92.19%,  Val Loss:   0.3,  Val Acc: 90.99%,  Time: 0:00:57 
Iter:   1500,  Train Loss:  0.16,  Train Acc: 94.53%,  Val Loss:  0.29,  Val Acc: 91.25%,  Time: 0:01:01 
Iter:   1600,  Train Loss:  0.23,  Train Acc: 96.09%,  Val Loss:  0.29,  Val Acc: 91.13%,  Time: 0:01:04 
Iter:   1700,  Train Loss:  0.16,  Train Acc: 95.31%,  Val Loss:  0.29,  Val Acc: 91.38%,  Time: 0:01:07 
Iter:   1800,  Train Loss:  0.39,  Train Acc: 89.06%,  Val Loss:  0.29,  Val Acc: 91.26%,  Time: 0:01:11 
Iter:   1900,  Train Loss:  0.15,  Train Acc: 95.31%,  Val Loss:  0.29,  Val Acc: 91.23%,  Time: 0:01:14 
Iter:   2000,  Train Loss:  0.16,  Train Acc: 97.66%,  Val Loss:  0.29,  Val Acc: 91.11%,  Time: 0:01:18 
Iter:   2100,  Train Loss: 0.099,  Train Acc: 97.66%,  Val Loss:  0.29,  Val Acc: 91.23%,  Time: 0:01:21 
Epoch[3/10]
Iter:   2200,  Train Loss:  0.12,  Train Acc: 96.09%,  Val Loss:  0.29,  Val Acc: 91.37%,  Time: 0:01:25 
Iter:   2300,  Train Loss:  0.12,  Train Acc: 94.53%,  Val Loss:   0.3,  Val Acc: 91.50%,  Time: 0:01:28 
No optimization for a long time, auto-stopping...
Test Loss:  0.29,  Test Acc: 91.16%
Precision, Recall and F1-Score...
               precision    recall  f1-score   support

      finance     0.8914    0.9015    0.8964      5818
       realty     0.9416    0.9176    0.9294      5969
       stocks     0.8400    0.8616    0.8506      5988
    education     0.9594    0.9419    0.9506      6046
      science     0.8873    0.8451    0.8657      5945
      society     0.8812    0.9274    0.9037      6022
     politics     0.8752    0.9108    0.8927      5885
       sports     0.9656    0.9632    0.9644      5998
         game     0.9352    0.9134    0.9242      5959
entertainment     0.9448    0.9328    0.9388      5969

  avg / total     0.9123    0.9116    0.9118     59599

Confusion Matrix...
[[5245   64  340    7   22   61   48    8   10   13]
 [  77 5477  173   18   26   84   64   15   13   22]
 [ 350   95 5159   10  140   11  171   12   20   20]
 [  16    7   16 5695   31  146   93   14    6   22]
 [  66   29  242   27 5024  117  151   11  235   43]
 [  33   54   13   80   46 5585  139   16   13   43]
 [  43   39  131   51   67  164 5360   15    5   10]
 [  15   13   21    9   11   24   24 5777   26   78]
 [  15   16   40   11  256   31   33   40 5443   74]
 [  24   23    7   28   39  115   41   75   49 5568]]
Time usage: 0:00:02

tensorboardX 可视化

$tensorboard --logdir 06-26_16.32
在这里插入图片描述

在线服务

启动后端服务,python api.py
最后,上述内容每个环节我们都将通过代码的方式实现,希望通过本章节的学习,可以让大家实际工业届如何使用深度学习进行短文本分类的。

curl http://localhost:12345/predict \
-H "Content-Type:application/json" \
-X POST \
--data '{"q": "妮可-里奇网上分享美发心得 推出自家品牌首饰","lang":"en"}'

参考资料

[1] all kinds of text classification models and more with deep learning

非常重要

https://github.com/brightmart/text_classification

[2] 2018达观杯长文本分类智能处理挑战赛 18解决方案

https://github.com/nlpjoe/daguan-classify-2018

[3] 知乎看山杯 第二名 解决方案

https://github.com/Magic-Bubble/Zhihu

[4] tensorboardX 使用

https://github.com/lanpa/tensorboardX

[5] 百度NLP

https://ai.baidu.com/tech/nlp_apply/topictagger

[6] 文章标签

https://ai.baidu.com/tech/nlp_apply/doctagger

[7] 词向量表示

https://ai.baidu.com/tech/nlp_basic/word_embedding

[8] 自然语言处理 NLP

https://cloud.tencent.com/product/nlp

[9] 中文文本分类 pytorch实现

https://zhuanlan.zhihu.com/p/73176084

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页