机器学习思维在ERP系统中的意外应用

前言

这是去年底碰到的一个有趣的需求,当时因缘巧合,开发经理刚刚动了手术,不方便出差,而那个模块刚好是我开发的,所以项目初始化就由我顶替 “冒充” 了一把开发经理,去了北京的项目现场,”顶” 了一个月

尴尬的需求与现实情况的冲突

我们公司的产品是一套面对企业管理的 ERP 系统,ERP 系统对人员管理,数据采集有非常严格的要求和控制,系统上线前需要做初始化,符合规则的数据才允许录入系统,不符合的需要反馈给用户需要用户修改后然后才录入系统

数据包括人员数据,附件数据,人员数据对人有不同纬度的划分和考量,因此分为了许多个不同的子集,比如,教育维度,工作经历维度,等等。每个维度的子集都有自己的附件数据,附件按照要求的规则来命名,这样可以保证数据100%被录入

实际情况是各个单位的附件命名质量良莠不齐,如果按照规则只有 20% 不到的数据能录入,非常混乱,非常混乱,非常混乱!尴尬的事情的说三遍,作为开发这是个头疼的问题,想到了三个办法处理:

1.要求客户把 700g+ 的附件数据重新整理核对——工作量太大,客户会怨声载道

2.丢弃附件数据——实在不行再考虑

3.出个技术方案把这批数据处理掉,质量实在太低的配合手工处理

机器学习思维处理流程

看到这批数据我的第一想法是能否用机器学习的思维来处理这批数据,需要提前有几个预判

1
2
3
1.要有数据无法100%录入的心理预期
2.错误匹配率尽量低
3.在错误匹配率足够低的情况尽可能录入更多数据

核心流程如下:

1.分词

2.去噪

3.不同维度数据单独设置阈值

4.文本相似度匹配算法

5.阈值校验

分词

这里的分词我采用了结巴分词 https://github.com/fxsjy/jieba,结巴分词是一个 python 编写的开源分词项目,评价还不错,有了分词工具只是有了一把瑞士军刀,剩下的工作依然很重要

去噪

分词后我们会得到一个字符串的数组,但是里面会有很多噪音,去噪的思路就是过滤掉那些特征不明显的特征项

我们需要预先针对不同的子集数据设定一些噪音的过滤项。比如教育信息中,学校,专业,这些关键词就是噪音项,需要过滤掉,因为很多不同学校都有该关键词,特征不明显,再比如一些特殊的字符串,比如 #_ 等等

不同维度数据单独设置阈值

1.不同的维度的数据差别可能非常大,所以需要针对性的设置阈值,比如有的是 0.3,有的需要为 0.45,超过这个阈值的数据项才算匹配上,如果同时匹配上多条记录,选最大的

2.特征数目不一样的,阈值不一样,特证数比较少的,需要设定的阈值高一点,特证数比较多的阈值会相对低一点

文本相似度匹配算法

这一步算是很核心的,怎么去分词,怎么去匹配

1.根据附件的命名字符串用结巴分词处理(细节上参数还可以调,可以控制你提取特征的数目),然后去噪得到具体特征条目

2.db里面会有一条教育信息的记录,把这些数据作为字符串拼接起来,然后查看里面包含了多少个特征信息

3.一些特定字符串如果匹配上权重应该高一点,比如时间

阈值校验

和阈值设定是关联的

总结

技术方案原理实际上很简单,核心思想如下

1.采用了结巴分词

2.去噪思想

3.数据库数据拼接

4.特征匹配算法的设定

5.根据特征数目不一样,分别设定不同阈值

6.根据不同维度信息设定不同阈值

7.根据特殊关键词设定不同阈值

测试效果

程序编写到自测,再到上线,花了 2-3 天时间,实际上的测试效果还行,满足了我当时的期望,错误率低到一定层度的情况下保证数据尽可能的被录入,数据录入率由 20% 不到,提升到了70%+,错误率不足 2%,节约了重新手工整理重命名 700g 附件数据的人工成本

坚持原创技术分享,您的支持将鼓励我继续创作!