semvec/pypi-packages huggingface dataset:
aibomc 0.0.3
aibomc
License: Apache 2.0
Requires Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*

# 智能派单说明
[TOC]

- bomc-dept-cnn-model
![img](./images/智能派单流程.png)

## 取数
- oracle.py

执行取数sql生成原始数据文件
```
select b.dept_name, substr(regexp_replace(y.publisher || t.base_summary || y.work_content,'[[:space:]]|(关于)',''),1,3500),b.dept_id from aoc_flow_base_order t,bomc_b_dept_keywork y, bomc_dept b where t.pid=y.pid and t.service_code='DEPT_KEYWORK' and t.handling_group_id=b.dept_id and b.status=1 and t.handling_group_id is not null and t.handling_group_id in (select b.dept_id from aoc_flow_base_order t, bomc_dept b where t.service_code='DEPT_KEYWORK' and t.handling_group_id=b.dept_id and b.status=1 and t.handling_group_id is not null group by b.dept_id having count(1)>20)

```


## 数据清洗
- cnews_loader.py

取数清洗是从数据库采集原始数据和对数据进行预处理的过程，取数的字段包括处理组、工单标题、工单描述、发布人，采集成原始文本文件，经过随机拆分拆成训练集、验证集和测试集，比例为6：2：2
清洗过程主要是去掉停用词，对原始数据进行预处理，从自定义的停用词表中获取停用词集合，包括各种中英文标点和一些无用的介词、形容词等


## 数据增强
- augment.py
- edi.py

数据增强阶段从数据准备阶段获取到原始训练数据，通过EDA数据增强方法放大数据量较少的处理组，具体包括：
1）同义词替换：不考虑停用词，在句子中随机抽取n个词，然后从同义词词典中随机抽取同义词，并进行替换。
2）随机插入：不考虑停用词，随机抽取一个词，然后在该词的同义词集合中随机选择一个，插入原句子中的随机位置。该过程可以重复n次
3）随机交换：句子中，随机选择两个词，位置交换。该过程可以重复n次
4）随机删除：句子中的每个词，以概率p随机删除
经过数据增强后训练数据量从3000变成12370(数据增强能提高模型在验证集上的正确率，但在生产测试中没有作用)


## 模型训练
- run_job.py
- main.py
- cnn_model.py

![img](./images/CNN模型.jpg)
模型训练阶段采用的模型为TextCNN模型，在文本分类任务中，CNN模型已经能够取到比较好的结果，虽然在某些数据集上效果可能会比RNN稍差一点，但是CNN模型训练的效率更高。所以，一般认为CNN模型在文本分类任务中是兼具效率与质量的理想模型。
分类模型中的主要参数有：词向量的维度、卷积核的个数、卷积核的窗口值、L2的参数、DropOut的参数、学习率等。
通过优化训练过程，随机拆分训练集和验证集，已经把智能派单的正确率提升到90%

> https://blog.csdn.net/u010555688/article/details/24487301

### 参数调整
- cnn_model.py

* 学习率

> 学习率可以是恒定的、逐渐降低的、基于动量的或者是自适应的，采用哪种学习率取决于所选择优化算法的类型，如SGD、Adam、Adagrad、AdaDelta或RMSProp等算法

* 迭代次数

> 迭代次数是指整个训练集输入到神经网络进行训练的次数。当测试错误率和训练错误率相差较小时，可认为当前的迭代次数是合适的，否则需继续增大迭代次数，或调整网络结构。

* 批次大小

> 在卷积神经网络的学习过程中，小批次会表现得更好，选取范围一般位于区间[16,128]内。还需要注意的是，CNN网络对批次大小的调整十分敏感 

* 隐含层的数目和单元数

> 增加隐含层数目以加深网络深度，会在一定程度上改善网络性能，但是当测试错误率不再下降时，就需要寻求其他的改良方法。增加隐含层数目也带来一个问题，即提高了训练该网络的计算成本。 当网络的单元数设置过少时，可能会导致欠拟合，而单元数设置过多时，只要采取合适的正则化方式，就不会产生不良影响

* Dropout
> 作为一种常用的正则化方式，加入Dropout层可以减弱深层神经网络的过拟合效应。该方法会按照所设定的概率参数，在每次训练中随机地不激活一定比例的神经单元。该参数的默认值为0.5

## 模型预测
- app.py
- serve.py
- predict.py
使用flask框架提供接口api, 在线预测服务提供模型的在线预测功能，通过读取训练中保存的模型文件，调用模型的预测接口来实现智能派单的过程。对于预测错误的工单，通过每天定时重新训练模型的方法来实现增量学习，训练完成后会调用预测服务的加载接口进行新老模型的更换

### 相似度计算辅助预测
- semblance.py

当前工单和历史工单进行相似度计算，如果最高相似度超过自定义阈值，则预测值取最高相似度所在工单对应的处理组，以这种方式提高模型在某些表现不好的分组的正确率