背景
数据分类是数据安全和数据合规体系建设的基石。无论是数据安全策略制定、数据合规性评估,还是事件响应处置和员工数据安全意识引导,都离不开对数据进行有效的标记和分类。通常所说的数据分类其实包括两部分事情,首先是数据识别,即需要知道数据是什么,如姓名、手机号、证券代码、金额、药品名称等;然后才是结合业务进行的分类,例如,进一步将姓名区分为用户信息,员工信息,或公开的企业信息等,药品名称区分为公开的药物说明信息、医嘱信息、个人疾病信息等。为了进行区分,我们把数据识别的结果称为标识,而数据分类的结果才称为类别。
数据识别的方法主要有三种方式:
1、正则匹配,适用于固定格式的数据,识别数据内容,比如手机号,邮箱地址等; 2、文本分类模型,适用于简短的自然语言构成的数据,比如姓名,产品名称等; 3、针对元数据的匹配,如数据库的表名、字段名、字段备注等;
这几种方式做好了都能达到不错的效果,也各有优缺点。正则匹配能以很高的召回率应对各类ID或code,但是准确率存在一些问题。通过一定优化后,文本分类模型准召能达到不错的平衡,但是通常运行所需成本也更高。而如果企业的数据治理水平较高,且相关人员已经对数据有清楚的认识,针对元数据进行匹配是效率非常高的手段。
数据分类则几乎只有通过元数据一种手段:基于企业的数据模型,以及表名、列名中出现的一些关键词等,判断数据来自于什么业务系统。为了增加分类的准确率,同一张表是其他列的数据识别结果,也是一个有用的信息。但总的说来,技术可选择的方案不算太多。
我们的实践
1、统一的数据识别框架
如上文所说,已有的数据识别方案需要根据数据的情况,在三种方法选择其一,这在设计上就不够优雅,而且我们很难融合不同信息以提高准确率和召回率。因此,我们不得不将三种做法进行抽象和融合,以形成统一的方案。
在我们的方案中,正则匹配和针对元数据的方法的结果将会被视为特征,并且我们会通过‘特征工程’来进一步的加工、处理这些特征;即使对于姓名、地址等原本使用文本分类的方法进行识别的数据,我们也暂时放弃了昂贵的端到端的模型(如LSTM),而是提取特征和开发传统机器学习模型,如逻辑回归、随机森林、支持向量机。做出这些调整的主要观察在于,我们是针对数据库某列进行数据识别,而非单条数据,一列数据意味着可以抽样很多条样本,这些样本中不少都是属于同一标识的数据,因此我们没必要对每一条数据都做出非常准确的判断,而是更多考虑性能的问题。我们选择相信概率论,只要我们抽样了足够多(例如300条),大数定理会保证结果足够准确。
我们还需要处理同一列存储了多种标识的情况,如证件列中可能存储了身份证号和护照号,投资人可能存储了个人的姓名和机构的公司名称,因此我们首先会使用一个较为‘宽泛’的正则表达式对采样数据进行‘过滤’。当列中有足够的样本通过率某标识的过滤条件,那么就会进入到该标识的识别逻辑——特征计算和模型预测。使用宽泛的正则表达式进行过滤的一个更大好处在于:很接近的负样本也会参与到特征计算中,这对于开发出更加鲁棒的模型,从而提升识别的准确率,有非常大的帮助。最终,我们为每个数据标识建立一个模型,来判别某个字段是否属于该标识。
我们可以看一个简化后的例子,来理解我们的数据识别是如何工作的。(需要注意的是,这只是一个方便展示的例子,并非真实的识别逻辑,在落地时,我们还考虑了各种复杂的情况)
例子:识别某列数据中存储了姓名
1)采样的某列数据中,如果2-4个汉字组成的字符串达到了一定比例,就会进入姓名的识别逻辑;
2)以下列举了姓名识别使用的几个特征:
a.该列采样的符合过滤条件的数据中,字符串第一个字属于百家姓的比例(百家姓覆盖了全国83% 的人口);
b.该列采样的符合过滤条件的数据中,2-3个汉字的字符串占比;
c.该列采样的符合过滤条件的数据中,包含常见top100取名用字的字符串占比;
d.该列采样的符合过滤条件的数据中,包含不常用,但是取名较常见汉字top100的字符串占比;
e.该列采样的符合过滤条件的数据中,不重复的字符串的数量与总数量的比值;
f.列名中是否包含一些关键词,如name、user、customer等;
这些特征计算可以通过正则匹配、求平均值完成等,在我们实际落地中,这几类特征抽取算子时使用频率最高的。
3)这些特征的指将作为姓名识别模型的输入,最终产出姓名的分数,分数越高,该列为姓名的置信度也越高; 在工程侧,我们对正则匹配进行了优化,无论正则表达式的数量是多少,我们也做到了只分析一遍字符串。而整个特征抽取和模型预测,用九智汇则凭借核心团队成员们此前在某大厂设计和开发实时风控平台的经验,通过合理的任务调度、内置规则引擎、生成计算图等方式,极大的提升了执行效率。我们做到了设置100个标识识别逻辑,只使用一台4核8G的普通机器的情况下,对触发识别逻辑的列,平均在200-300ms 内完成识别。
2、理解数据库的命名方式
上文中提到我们在数据识别中,暂时放弃了端到端的模型(即深度学习),主要是出于运行效率的考虑。如果一定要在数据识别中使用深度学习的话,除了代替我们目前使用的传统机器学习模型外,将采样的数据输入直接作为输入,得到嵌入(embedding), 作为一组特征使用也是不错的方式。当然,出于实际运行效率的考虑,我们并没有这么做。但是在数据分类中,我们则有了使用这种高成本方式的理由:数据库中数据会变,但是表名、列名、表备注、列备注、库名等是几乎不会经常变化的,因此如果我们使用元数据信息的话,即使成本高,也基本只是预测一次的投入。
不同于备注本来就是写给人看的内容,数据库中表、字段的命名方式则通常不说‘人话’,带有很强的个人风格和业务熟悉。虽然如此,只要不是刻意隐藏,或者实现过于糟糕,也有很强的规律性,对于人类,稍微熟悉之后一眼就能看懂其含义。那AI有没有可能也能‘看懂’,而不是只去简单匹配一些关键词呢?
当然,直接训练一个是用表名、列名的进行分类模型是不现实的,因为如果预测本身也是一次性的,完成了数据标注就几乎完成了这整件事情,在标注了足够多的数据之后,再开发模型就是画蛇添足。
因此控制所需的有标注数据的数量是最重要的一步。由于涉及商业机密,这里只介绍基本思想:我们将表名、列名,去与备注进行对齐,从而获取一个性能较好的基础模型,用于提取表名、列名的特征,这样只需少量样本即可进行数据分类模型的训练。利用这种方式,我们减少了对训练需要标注的数据量,并且能够在落地时对模型进行微调,以适配企业实际的数据模型。
结语
在数据分类分级领域,用九智汇致力于推出标准化产品,以最低的成本来保障数据分类的效果,并且通过与律师合作,让更多企业可以在负担得起的情况下进行数据分类,从而推进数据安全与数据合规的建设与落实。 特别声明:本文中介绍的结构化敏感数据识别、数据库命名方式理解方法均已申请专利保护,分类分级平台已经申请软著。