导读
58同城是国内最大的生活服务类信息平台,有着数百万的商家,其中不乏有资质的商家可以参与投标,为了给这些商家提供更多的有效商机和更大的订单量,我们整合了全网招标资源,30+服务行业的招标采购项目至58同城商家版APP平台,在招标服务模块中提供及时有效的本地生活服务领域标书,帮助商家获得最新商机。
背景
招标行为是招标人(政府/企业)寻找合适供应商承接项目的一种方式,通常在有财政预算支撑的单位内使用,项目金额普遍在20w以上。招标行为本身是一种竞卖的贸易方式,需在指定的时间和指定的地点进行,并事先规定了一些具体的条件,因此,投标人必须根据其规定的条件方可参与投标。
整个招标流程从招标人发布标书开始,依次完成招标、投标、开标、评标和定标五个环节,我们将发布的最新标书收集至招标服务模块,并通知商家参与投标,若商家竞标成功将服务于招标人,同时商家也多了一条商机途径。具体流程如下
图1: 招投标流程示意图
怎样帮助商家更方便快捷的找到自己需要的信息,促进竞标成功,是我们所优化的目标。为了完成这个目标,我们根据项目特点拆分为2个任务进行,一是分类任务,细化标书的分类,二是实体提取任务,提取了标书中的重要信息,在每个任务中,依据项目场景进行模型的调整和适配。
招标算法侧项目实现
整个招标项目从爬虫开始,爬虫侧将爬取的标源推送给APP后端,经过后端筛选后进入算法侧进行处理,因我们获取到的标书源为非格式化数据(标书内容包含HTML标签,数据格式杂乱不统一),所以需要算法模型介入。算法侧项目流程如下图所示,从APP后端拿到标书数据后,首先判断所传入的数据是否为标书(因数据源中存在非标书文本),然后预测标书所属的类目,对被打上类目的标书进行命名实体识别,提取标书中的人名、电话、公司名称、时间、招标方式等关键信息,最后将处理完的数据传回APP后端。
图2: 招标算法 侧 流程图
从上游拿到数据后,我们会先通过关键字判断该数据是否属于标书;
将通过判断为标书的数据送入标书分类模型中(7分类模型:6个标书类目与一个’其他‘类目),将模型分类为’其他‘的类目继续通过24分类的规则模型中,为所有标书打上分类标签后与模型中的分类结果数据整合;
对2中整合完毕的数据进行数据挖掘获取标书内的人名、电话、开标时间、文件获取时间、代理机构等信息;
将模型预测结果与规则策略预测结果整合并发送给应用方。
技术实现
标书分类实现
标书分类是通过使用标书的标题对标书进行分类来实现的。最开始运用规则的方式对标书进行分类,分类部分准确率在85%左右,但召回率不高。由于规则模型整体准确率没有达到产品预期,标书召回量较低,且规则优化困难,在后续的分类模型优化过程中,我们采用算法模型代替规则模型。
在算法模型的搭建过程中,由于招标数据类目分布不均(大小类目数据量相差悬殊),数据标注耗时耗力,我们选择对项目中TOP6类目(工装服务、建房/翻建改造、保洁清洗、财务会计/评估、建材、网络布线/维护)+‘其他’使用分类模型,剩余类目继续使用规则处理的方式,从而代替原有的规则模型。
在模型选取过程中,传统的文本分类模型(fasttext、textcnn、bilstm 等)虽然有着模型结构简单,运行速度快等优点。但在当前任务中,由于产品对精确度与召回率有较高的要求,以及标书样本标注数据量少,使得这些模型难以胜任当前任务。BERT在样本数据少的时候表现优异而且广泛运用于工业界,为了在有限的标注样本数据里保证高精确度与高召回率,我们采用BERT做为基础模型同时,根据招标项目的特点,对模型做了一些调整。
BERT使用了Transformer作为算法的主要框架,Transformer能更彻底的捕捉语句中的双向关系;使用了Mask Language Model(MLM) 和 Next Sentence Prediction(NSP) 的多任务训练目标;使用更强大的机器训练更大规模的数据,使BERT的结果达到了全新的高度,并且Google开源了BERT模型,用户可以直接使用BERT作为Word2Vec的转换矩阵并高效的将其应用到自己的任务中。
图3: BERT模型结构
首先我们尝试了BERT+softmax来进行标书类目的分类,相比较与规则模型,准确率提升到了90%+,同时召回率也有了大幅的提升。
分类难点
在对BERT的调优过程中,我们发现,在分类过程中由于部分标书所属类目较为模糊(例如标书:新疆温宿县人民医院疫苗接种室改造项目的询价采购公告,对于属于‘建房/翻建改造’类目与‘工装服务’类目的判定就会比较模糊),传统多分类可能会出现‘错杀’现象,如何在有限的训练数据下,进一步提升模型的泛化能力是我们本次模型构建与优化过程中主要的难点。
模型结构
首先针对标书分类中的‘错杀’问题,我们做了以下探究与改进:
softmax: 如果当前标书同时属于2个类目,softmax会导致它在这2个类目下的数值非常相近(因为softmax得出的多分类结果值相加等于1,如果多个类目相似,那幺这几个类目的值都会非常的低),这样就会导致分类的值也会非常的低,被误认为是错误分类而被删除。
BERT softmax(single model)
图4: BERT + softmax(single model)
为解决上述问题,我们将softmax换成了sigmoid做为最后一层的输出层
sigmoid: ,从sigmoid公式中可以发现,sigmoid在计算向量中的某一个值的时候不会相互影响,sigmoid 对每个类目进行计算,相互之间不会影响,如果一个标书同时属于2个类目则这2个类目的分值都会很高(0.9+)。
BERT sigmoid(single model)
图5: BERT + sigmoid(single model)
通过将softmax改为sigmoid后提升了模型的召回率,解决了部分标书被‘错杀’的问题。
在后续优化过程中,为增强模型的泛化能力,进一步提升模型效果,引入随机森林的思想,用3个模型每个模型随机取原train_data 的80%(这里可以让每一个模型相对于单一模型训练时可以偏向与某一个方向)数据量进行训练,然后平均模型结果和(这里可以让3个侧重方向不同的模型去取出个共同认为正确的结果,结果更具有说服力)。
BERT sigmoid(3 模型)
图6: BERT sigmoid(3 模型)
数据构建及结果
train_data数量: 1w+数据(算法侧手工标注:招标标书6类目每个类目约1.5k,’其他‘约1.5k 数据)
train_data结构: 标书标题 + t + 标书所属类目
1,BERT softmax(single model)模型
train_data(标注的所有数据)
2,BERT sigmoid(single model)模型
train_data(标注的所有数据)
3,BERT sigmoid(3 模型)模型
train_data随机取80% 取3次分为train_data_1、train_data_2、train_data_3 训练3个BERT_sigmoid 模型 3个结果相加后取平均值最大的为分类结果。
4,BERT + normalzation + sigmoid (3 模型)模型
train_data随机取80% 取3次分为train_data_1、train_data_2、train_data_3 训练3个BERT _normalzation_sigmoid 模型 3个结果相加后取平均值最大的为分类结果。
下表为以上模型自评效果(随机抽取2000条数据)
model | acc(自评) | recall(自评) | precision(自评) |
BERT softmax(single model) | 93.58% | 98.63% | 87.0% |
BERT sigmoid(single model) | 93.9% | 98.96% | 89.17% |
BERT sigmoid(3 模型) | 98.1% | 98.82% | 96.32% |
表1: 3个模型自评效果
其中,为比较BERT softmax(single model)与BERT sigmoid(single model)模型效果差异,我们通过调节阈值让BERT softmax(single model)模型的precision与BERT sigmoid(single model)相等比较2者recall值:
model | recall(自评) | precision(自评) |
BERT softmax(single model) | 95% | 89.13% |
BERT sigmoid(single model) | 98.96% | 89.17% |
表2: softmax与sigmoid对模型结果影响对比
当调节阈值达到控制BERT softmax(single model)与BERT sigmoid(single model)precision相同时(89.15%) BERT softmax(single model)的recall达到95%,比BERT sigmoid(single model)recall低3个点,BERT sigmoid(single model)在卡阈值的情况下可以获取比BERT softmax(single model)更多的标书。
例如:
标书:贵阳市轨道交通3号线一期工程PPP项目站后工程造价咨询服务项目2标中标公示
BERT softmax识别为‘其他’类目;
BERT sigmoid识别为‘财务会计/评估’类目。
通过上图对比可以看出BERT sigmoid(3 模型)在accurately 和 precision 上都是4个模型中效果最优,4个模型的recall值也都在98%-99%波动,所以选取BERT sigmoid(3 模型)为上线模型。
线上效果
标书分类模型上线前,小帮侧评审结果,类目分类准确率85%,整体准确率83%;标书分类模型上线后,小帮侧评审结果,类目分类准确率93%,整体准确率90%,标书召回率也相比较与规则有大幅提升。
标书实体提取
通过标书正文提取出所需要的实体内容,首先运用规则的方式提取所需实体(人名,电话等),规则准确率70%左右,后使用算法模型代替规则,目前准确率已基本平稳在95%+。
由于BERT_CRF在业界命名实体任务中的广泛使用,决定采用此模型提取标书内实体。BERT是非常优质的预训练模型,包含了很多预训练语料中蕴含的外部知识和信息。我们以此为基础,训练BERT_CRF模型。CRF是序列标注的经典方法,其核心思想是在进行序列标注时,把序列上的各个点当做一个整体来处理,而不是一个个独立的点,各个点的标注结果是有一定依赖关系的,以路径为单位进行训练。因此,通过训练,模型能在理解文本以外,还能理解输出序列的规则性知识。
图7: BERT _CRF
难点
在对标书中人名与电话号码匹配过程中,由于标书的结构复杂,标书中人名和电话位置有多种情况:
1.人名电话都在表格里的
人名 | 张三 |
电话 | 18900000000 |
人名 | 电话 |
张三 | 18900000000 |
2.人名在电话号码前或人名在电话号码后
联系人:张三 ……(50字内) 联系方式:18900000000
联系方式:18900000000 …….(50字内) 联系人:张三
3.人名电话所在段落过长
联系方式:18900000000 ……(150字以上) 联系人:张三
等等情况,导致在人名和电话匹配上有一定难度。
人名电话匹配 整体架构
为处理人名和电话匹配问题,先是通过规则的方式,将人名和电话号码匹配起来,但是由于标书内容多样,结构复杂导致规则效果并不理想(准确率70%以下),后续优化过程中,决定引入深度学习模型解决这个问题。
尝试使用命名实体识别的方式解决人名和电话匹配问题:
先通过人名识别找到所需人名,然后将人名放在包含此人名的这句话的前面(如图7),对拼接后对语句做命名实体识别,尝试识别出此人名对应的电话号码,但是由于标书原文内容不确定性,部分电话号码的最后一个字符距离人名超过了BERT做命名实体识别长度的极限,导致此模型效果不是很理想。
图8: BERT NER模型
single sentence = 人名 + 包含所需找寻电话人名的一句话
B-PER、I-PER = 电话号码的起始位与电话号码的其他位
为解决对输入字符串的长度限制问题,在新一版的优化中,引入当下流行的BERT的阅读理解(MRC)模型将人名和电话联系起来后准确率有了大幅的提升(准确率95%)。BERT在处理阅读理解任务时,输入的文字长度最大为512远高于做命名实体识别的长度,可以解决电话号码可能会没有完全包含或者不包含在句子中的问题。BERT首先在问题前面添加special classification token[CLS]标记,然后问题和段落连在一起,中间使用special tokens[SEP]分开。序列通过token embedding、segment embedding 和 positional embedding输入到BERT。最后,通过全连接层和softmax函数将BERT的最终隐藏状态转换为答案跨度的概率。
图9: BERT 阅读理解模型
原BERT阅读理解模型的问题部分无用信息过多(张三的电话号码是多少),为突出问题特征,我们这里直接使用人名做为问题,模型结构不变。通过人名命名实体识别模型找到人名,然后在标书中的人名里找到最关键的人名。在这个人名index往前数20个字,往后数300个字截断这句话做为paragraph。将我们想要得到电话号码的人的人名当作问题,即question。start是人名对应电话号码第一个字符在paragraph中的index,end是最后一个字符对应的index。
模型1:
paragraph:包含人名的一句长字符串
question:张三的电话号码是多少
start:电话号码起始位置
end:电话号码结束位置
模型2:
paragraph:包含人名的一句长字符串
question:张三(人名)
start:电话号码起始位置
end:电话号码结束位置
model | F1 | EM |
BERT阅读理解 | 91.75% | 87.68% |
BERT阅读理解(数据修改) | 92.75% | 89.73% |
表3:训练数据优化效果对比
可以看出删除问句中的多余文字可以提升模型效果。
BERT的阅读理解模型大大提升了人名-电话的匹配准确率(99%+),同时阅读理解模型在预测时花费时间也远低于命名实体识别所花费时间。
实体提取模块线上效果
标书实体提取模型上线前,小帮侧评审结果,实体准确率70%左右;标书实体提取模型上线后,小帮侧评审结果,实体准确率97%以上。
总结
以上我们依次介绍了招标项目在分类任务与实体提取任务中的优化,在技术指标上,标书整体准确率由刚开始使用规则的50%左右提到现如今的90%以上,其中分类任务有8个点的提升(85%->93%),实体提取任务提升了27%(70%->97%)。在业务指标上,上线了30个类目,日均标书量4000+。项目上线后,招标服务的访问用户稳定在每日2300左右,截止目前为止nps邀请用户数量为一万以上,提升了58同城商家版APP的VIP人数。
目前招标项目的标书量与准确率已基本稳定,但是在招标分类模块中还有多个类目是通过规则提取出的,依然存在维护困难的问题;在算法模型提取数据阶段使用大模型耗时过长。在后续的优化中,计划通过模型预测标书所属的30个类目;在保证召回准确率的情况下,使用轻量级模型,缩减时间上的消耗。
参考文献:
1.Devlin, Jacob, et al. “BERT: Pre-Training of Deep Bidirectional Transformers for Language Understanding.” ArXiv.org, 24 May 2019, arxiv.org/abs/1810.04805v2.
2.Strubell, Emma, et al. “Fast and Accurate Entity Recognition with Iterated Dilated Convolutions.” ACL Anthology, www.aclweb.org/anthology/D17-1283/.
3.Vaswani, Ashish, et al. “Attention Is All You Need.” ArXiv.org, 6 Dec. 2017, arxiv.org/abs/1706.03762.
4.Huang, Zhiheng, et al. “Bidirectional LSTM-CRF Models for Sequence Tagging.” ArXiv.org, 9 Aug. 2015, arxiv.org/abs/1508.01991.
5.“IDCNN-CRF-Based Domain Named Entity Recognition Method.” IEEE Xplore, ieeexplore.ieee.org/document/9368795.
作者简介:
岳鹏涛,58同城LBG算法策略部 算法工程师;
项文,58同城LBG算法策略部 算法工程师。
Be First to Comment