Press "Enter" to skip to content

58黄页标签提取及海量多分类优化

导读

 

58黄页是一个用户找服务的平台,主要靠商家发帖,用户通过帖子找服务。但商家的帖子标题描述及用户的评价等都是纯文本的,不是结构化的数据。用户检索时无法对帖子核心内容进行突出展示,召回等。由此,需要从文本里提取标签,标签是通过对帖子内容分析得到的高度精炼的特征词或短语,将帖子内容标签化可以突出帖子特性,实现帖子内容结构化,帮助用户更快定位到所需要的服务,提升用户体验。

 

背景

 

帖子的标签通常是几个词或者短语,作为对该文档主要内容的提要。标签是人们快速了解文档内容、把握主题的重要方式。标签作为帖子的核心内容广泛应用于检索召回,帖子智能摘要,及作为结构化的筛选内容(虚拟类目),以方便人们高效地检索自己需要的服务。

 

由于58黄页的类目众多,总共有200多个类目,每个类目都有自己的标签,比如搬家的类目标签是“居民搬家”,“箱货搬家”等,而宠物类目的标签内容是“金毛”、”泰迪“等宠物名,导致总的标签数量有10w多个,标签数量过多的时候模型会变得庞大且需要更多的标注样本,如何对这个问题进行优化是本文介绍的难点。

 

本文主要介绍两个内容:

1,如何对文本(帖子标题描述及评价内容)进行标签提取。

2,标签数量过多时(10万)导致模型过大,如何对模型进行优化,使其变小。

 

帖子打标签

 

1、候选词获取

 

并不是所有的词都有可能成为关键词,本文选取候选词的过程如下:

 

首先对文本进行分词,去掉停用词,然后计算词语的凝固度与自由度,设置一个阈值,大于这个阈值的词语做为候选词的初步召回,最后再进行人工校验做最终的候选词确认。在很多研究中,候选关键词还可以通过n-gram发现。

 

2. 帖子标签提取流程

 

训练模型提取关键短语 -> 归一化获取标签词 -> 打分排序

 

3.系统架构

 

 

4.模型流程

 

 

5.建模

 

1). 传统方法

 

关键词提取传统有很多方法,无监督的有:tf-idf,textrank,lda,翻译模型ibm model[1],有监督的:抽象为分类模型(多标签分类模型)。经试验 无监督的模型提取能力很有限,而且不易优化。这也是可以理解的因为不同的无监督只能提取到某一类型的特征信息,比如tfidf提取的是总体文本的频率及稀有程度综合排序,textRank只会考虑一个待抽取文本里的单词频率及单词建相互关联指向关系等。

 

但标签提取的场景往往复杂多变,因为对不同领域有对关键词不同的定义,比如58同城 搬家类目(厢货车等是关键词),但宠物类目(厢货车不是关键词,而是金毛等宠物名),所以这种复杂的提取场景还是需要有监督的算法针对解决。

 

2). 使用分类打标签

 

58黄页类目很多200+,每个类目都有不同的标签,总体的标签量很大。

直接使用多分类,需要海量的样本,比如现在黄页标签库有10w个标签,每个标签标注10条样本,需要100w条的标注。这个标注样本是海量的,人工成本太高,不可行。

 

3). 使用序列列标注

 

把关键词提取建模为序列标注模型的好处:

 

1,标签很多时样本量并不大

 

2,可以对新标签进行发现

 

3,有监督,可以随时通过不同的标注样本应对不同的提取场景

 

4,可以对提取标签的文本内容进行飘红,知道打标签的文本来源

 

6.模型步骤

 

1). 序列标注提取关键短语

 

标签提取可以抽象为两个步骤,

 

1,进行关键内容的提取

 

2,归一化

 

当前的有字构词的序列标注有多种实现。

 

深度学习:

 

robert+crf

 

bert+crf

 

transformer+crf

 

idcnn+crf

 

rnn+crf

 

还有传统的实现:

 

自己编写特征提取函数,然后使用crf进行标注。已有的较好的开源实现有

crf++等

 

实验效果对比:

 

该实验效果是在我标注的1000条样本上实做的,900条作为训练集,100条作为测试集,使用k折交叉检验对结果进行平均。评测有用了两种方法,一种是

精确的评测:关键词位置内容全部正确才判断为正确。

比如:

北京居民搬家,欢迎来电。
样本ner标记为“居民搬家”

只有提取出”居民搬家“ 而且位置也完全正确才算正确。

 

软评测:关键词有一部分正确也会计算再内。

比如:

北京居民搬家,欢迎来电。
样本ner标记为“居民搬家“

如果提取出”北京居民搬家“ 也会计算计算一部分精确率,这时候的TP是通过每个字的标签正确(但不能是非ner的标签比如未识别标记O)来计算。

 

精确评测:

 

 

模型accuracyrecallf值平均性能(ms)
crf++78.35%71.96%75.02%9
idcnn+crf80.03%82.76%81.37%79
transformer+crf70.69%80.87%75.44%252
rnn+crf82.62%84.65%83.62%323
bert+crf72.18%87.5%79.10%885
robert+crf77.31%88.44%82.50%945

 

软评测:

 

 

模型accuracyrecallf值
crf++85.89%78.92%82.26%
idcnn+crf90.57%89.36%89.96%
transformer+crf88.98%84.37%86.61%
rnn+crf92.68%86.89%89.69%
bert+crf90.82%92.37%91.59%
robert+crf93.19%91.31%92.24%

 

因为58同城的关键词提取是对帖子的描述进行提取,文本很长,1000+都很正常,bert+crf等深度模型准确率虽然较好,但对bert文本不能超过512(虽然有些方法可以优化,但当文本很长的时候性能急剧下降),深度学习的推理速度比较慢,为了平衡速度与准确率,最后我们生产环境选择的是idcnn+crf

 

文本内容:

 

全市连锁、就近派车、一条龙服务、上门估价、正规发票、绝 不加价、预约有优惠 【专业承接】居民搬家、公司搬家、空调移机,长短途搬家、搬厂、搬仓库、各企事业单位搬迁、起重吊装、精品搬运、拆装家具、箱货车搬家、金杯车搬家、尾板车搬家、长途搬家、个人搬家、小型搬家、人力搬运、钢琴搬运、红木家私搬运、打包、装卸货柜、搬公司、搬仓库、搬写字楼、公司搬迁、仓库搬迁 、设备搬迁移位、吊沙发、吊大件家私拆装空调等一条龙服务 【公司简介】北京 捷易搬家 从事搬家行业20年,专业搬家、搬厂、搬写字楼、拆装空调、起重吊装的有限责任制公司,现有厢货车、尾板车、平板车、金杯车、面包车、1.5吨货车、3吨货车、等10多辆和10几年工作经验的师傅,所有工作人员经过严格的专业培训,都能够熟练掌握物品包装,装卸、搬运、高难度家具拆卸,大型机器搬运,高空吊装等高难度技能 【公司优势】亲、感谢您对我公司的信任,首先恭贺亲乔迁新禧!工作顺利!全家幸福!身体健康!搬新家是一个高兴而繁琐的事情,同时选择搬家公司更重要,为了不负亲所托、感谢亲能根据您的实际情况,在搬家过程中,只要您描述搬运的信息和事实相符,(希望您尽量详细描述搬家出发点和目的地,两边的楼层情况和物品及中间是否需要中转还有两边停车的距离情况等) 我们会根据您的情况就近派车、也会给您合理的报价,坚决不会有中途加价现象,如果您选择了我们,我们会给您书面合同或微信留言为凭。坚决杜绝二次收费!为了方便客户和节省我们的资源,我们随约随到、24小时为您提供正规、专业、服务好、价格低的优质服务,让你省心!省时!省力!省金!感谢您的来电!【公司承诺】诚实守信、准时到达、随叫随到、24小时服务、价格合理、中途不加价、合理摆放、不尅不碰、不损坏、不丢失、如有破损、折旧赔偿、满意后付款 【服务项目】 1、居民搬家;个人搬家、家庭搬家、别墅搬迁、小型搬家、人工搬运、面包车搬家、金杯车搬家、箱货车搬家、尾板车搬家、红木家私搬运、贵重物品搬运 2、长途搬家;异地搬家、长途搬运,跨市搬家 3、搬厂搬货:专业大型设备搬迁、移位、搬厂房、厂房搬迁、起重吊装、仓库搬迁、搬机器、装卸货柜 4、公司搬家:专业搬办公室、搬公司、搬仓库、搬写字楼、企事业单位、学校搬迁、公司搬迁、写字楼搬迁、店铺搬迁、钟点工、搬运人力、酒店宾馆搬迁、医院商场搬迁 5、专业包装;提供纸箱、气泡纸、胶带、整理箱等各种打包材料 6、 拆装家具:专业家私拆装、拆装家私、欧式家具拆装、衣柜床拆装、卡座拆装、会议桌拆装、办公桌拆装、货架、文件柜等各类拆装、配有高难度技工 7、钢琴搬运:专业搬运钢琴、各类型三角钢琴、立式钢琴 8、高空吊装:吊大件家私、大件物品、沙发、床垫、红木家私、钢琴、鱼缸、大理石、玻璃、建筑材料、吊一却上下楼有难度的大件物品 9、空调拆装:专业空调拆装、天花机拆装、维修、移机、加雪种、清洗、回收等业务 联系我时,请说是在58同城看到的,谢谢!

 

提取效果:

 

全市连锁|正规发票|不加价|居民搬家|公司搬家|空调移机|长短途搬家|搬厂|搬仓库|企事业单位搬迁|起重吊装|精品搬运|拆装家具|金杯车搬家|尾板车搬家|长途搬家|个人搬家|小型搬家|钢琴搬运|装卸货柜|搬公司|搬仓库|搬写字楼、公司搬迁|仓库搬迁|设备搬迁移位|拆装空调|搬厂|搬写字楼|拆装空调|面包车|物品包装|装卸|高难度家具拆卸|大型机器搬运|高空吊装|二次收费|随约随到|准时到达|随叫随到|24小时服务|中途不加价|折旧赔偿|居民搬家|个人搬家|家庭搬家|别墅搬迁|人工搬运|面包车搬家|金杯车搬家|箱货车搬家|贵重物品搬运|长途搬家|异地搬家|长途搬运|跨市搬家|搬厂搬货|大型设备搬迁、移位|起重吊装|仓库搬迁|搬机器|装卸货柜|公司搬家|搬办公室|搬公司|搬仓库|搬写字楼、企事业单位、学校搬迁|公司搬迁|写字楼搬迁|钟点工|商场搬迁|专业包装|提供纸箱|拆装家具|拆装家私|欧式家具拆装|衣柜床拆装|办公桌拆装|钢琴搬运|搬运钢琴|高空吊装|钢琴|大理石、玻璃、建筑材料|空调拆装|空调拆装|天花机拆装、维修、移机、加雪种、清洗、回收

 

这是第一步的提取关键内容,这一步大部分已经可以直接作为关键词使用了,比如’不加价‘ ’小型搬家‘ 等短文本。

 

之所以提取这幺多关键词内容,是因为提取的关键词会用于搜索召回,所以人工标注的时候尽可能多的进行了关键词标注。

 

7.归一化

 

1). 归一化整体流程

 

这些关键文本提取出来后,需要做归一化处理。比如 ’不加价‘ ’不临时加价‘ ’绝不坐地起价‘ ’不另外收费‘ 等归一为一个’不加价‘。

 

归一化处理方法:

 

通过聚类做归一化处理,通过embedding对文本进行向量化处理(常用的有word2vector或者bert encoding),然后通过向量的距离计算相似度,把相似的文本归一为一个标签。但有时候可能这些短文本聚类效果并不是很好,因为有时候一字之差,含义相差很多,还是用模型来泛化会更好。

 

鉴于聚类的泛化能力很低,我们后期改为了多分类进行归一化处理。

带归一的文本作为输入,候选标签词作为输出,进行多分类训练。

这里有两个需要解决的问题

 

1.如何获取训练样本

 

这里可以使用人工标注,但显然这个成本很高,但优点是准确率更好。

老的标签系统原来归一化处理部分是有写好的很多正则匹配的规则,

 

eg:工商注册类目 ”3年以上转让“这个标签的其中的一个规则为 ”(3年|3年以上).{0,10}?(转让)“

 

这条规则标识 ”3年以上转让“, ”3年以上紧急转让“ 等。

利用这个规则可以对海量的帖子做一个初步的匹配,匹配出构造出多条训练样本。

 

优点:一条规则可以构造很多的样本,历史系统已有这些正则规则,不需要人工从新标注样本

 

缺点:可能会有一些脏数据,导致样本不够准确。eg:预计2023年成立主要从事转让出租业务。这条显然不是”3年以上转让“的意思。

 

但因为有海量的帖子,会匹配出大量的训练样本,只要保证规则生成的正样本比负样本多很多,负样本自然会被稀释,多分类一样能拟合最终的结果。

 

2.标签过多时如何对模型进行优化 由于58黄页的类目众多,200+个类目,每个类目都有自己的标签,总的标签数量有10w多个,直接使用一般的多分类,需要再dnn最后一层需要构造10w的 Dense(100000, activation=‘softmax’)

 

最后一层的的参数量为:

(输入维度+1)*节点数量=7690000

 

这幺大的model 有的很多缺点

 

1,不易训练(参数越多越不易收敛,且需要更多的标注样本)

 

训练模型时10w的参数经常GPU内存溢出

 

2,参数越多越容易过拟合

 

3,在线预测速度变慢(每次预测都需要计算这幺多的softmax)

 

鉴于此对网络进行了改进如下:

 

使用分层softmax(参见word2vector hierarchical softmax)[2]

 

 

这幺改造以后会加快预测速度,因为使用的是二叉树的结构,预测时softmax计算次数会大大减少。但构造复杂,且需要构造动态的计算图,工程也很复杂,总的参数量并没有减少,因为最底层的节点相互独立数量还是10w那幺多。

 

改造后结构如下:

 

 

需要对10w个输出进行hash到2层结构上。

 

比如每层320个节点,合起来合计支持320*320=102400个输出

比如输入的编号98000

 

第一个输出值=98000%320=80

 

第二个输出值=(98000/320)%320=306

 

预测的时候对上门的预算求逆运算即可:

 

比如预测时

 

第一个输出(outPut1)=80

 

第二个输出(outPut2)= 306

 

每层数量=320

 

num=306*320+80=98000

 

这个过程类似于十进制转化为二进制,只不过使用的320进制,这样的话2位320进制就能表示320*320=102400个输出。

 

但参数量大大减少,因为最后一层总的节点数量为 320+320=640个相比10w大大减少。

 

改造前后对比:

 

 

模型多分类hierarchical   softmax多输出hash
模型大小较大较大较小
工程复杂度简单复杂简单
在线预测

 

keras textCnn的实现如下:

 

 

使用多头输出,输入2个并排的softmax层。每层320个,即可完成10w的原始输出,

 

最后一层的参数量:320 2 769=492160 相比 7690000 参数量大大减少。

 

而且不需要够着动态图,只需要一个多输出(一个640输出也可以),损失函数还是categorical_crossentropy 。

 

不管是模型构造还是训练预测都简单易行。

 

实验效果:

 

直接softmax 准确率:0.757

 

多层softmax 准确率:0.742

 

可以看到准确率稍有下降,但差别不大。整体准确率低的一个原因是因为正则匹配出的样本本身有很多噪音。

 

8. 对关键词排序

 

提取的关键词可能很多,比如”全市连锁|正规发票|不加价|居民搬家|公司搬家“,需要对关键词进行排序,然后把重要的放前面。

 

对关键词取多个因子进行加权,然后计算一个分数,最后进行排序。

 

经试验最终选择的2个效果效果比较好的因子,

 

1,tf-idf

 

2, 标签与标题的相似度

 

有很多方法,我们使用的方法是

 

分别用标签,和帖子的标题(如果没有标题使用内容的第一句话),因为它一般代表核心内容,然后进行bert的encoding,最后对两个向量进行欧式距离相似度计算。

 

9. 扩展

 

同样的基于序列标注的这个思路同样适用于摘要提取(抽取式),只需要把训练样本标注关键词,改为标注句子即可。

 

帖子评价内容标签提取

 

1. 模型架构

 

 

2. 整体流程

 

特点:评价内容相较于帖子内容较短。总的标签数量不多,都是服务类评价类的标签,种类有限,比如:

“准时上门”,“服务态度好”,“服务态度好”等。

 

使用bert 等预训练模型进行多分类可以有效的提高准确率。[3]

因为每个评价内容可以打多个标签,所以这是一个多标签分类的问题。

 

相比于正常的多分类稍作修改即可:

 

多分类:

 

损失函数:categorical_crossentropy

 

监控指标:categorical_accuracy

 

多标签分类:

 

损失函数:binary_crossentropy

 

监控指标:binary_accuracy

 

3. 最终效果:

 

 

精确率:0.9714

 

召回率:0.9437

 

f1值:0.9574

 

4. 问题及解决

 

开始准确率很高,但泛化不足,有很多badcase是遇到差评的时候也会打一些好评类型的标签。经观察样本发现产品同学标注的样本里大部分都是好评的样本,而且标签几乎都是好评的标签,几乎没有差评样本和标签,样本偏差较大。

解决办法:添加差评(评价里有星际,筛选星级为1的即可),然后把差评样本的label设置为空,因为都是要打的几乎都是好评的标签,重新训练评测正常。

 

总结

 

当标签量不多时可以使用多标签分类进行打标,但如果需要飘红(获取打标签的内容来源),或者标签量很多时可以尝试使用序列标注+归一化处理来进行打标。

 

多分类时如果类别过多可以可以使用类似于二进制的方法把类别映射到多个较小的数字上,不同输出共享参数,从而减小模型大小。这个方法有效进一步说明了充分大的dnn可以拟合任意函数的能力。因为相较于优化前的模型优化后的模型是再优化前模型的基础上再次映射为进制的输出,同时对前面几层的模型参数进行共享。

 

参考文献:

 

[1]研究生:刘知远. 基于文档主题结构的关键词抽取 方法研究.

[2] T. Mikolov, I. Sutskever, K. Chen, G. Corrado, and J. Dean. Distributed Representations of Words and Phrases and their Compositionality. NIPS 2013

[3] Devlin J , Chang M W , Lee K , et al. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J]. 2018.

 

作者简介:

 

朱东昌,五八同城算法工程师,在校期间曾经获得河南省acm竞赛银奖。2015年加入五八本地服务并设计研发 配置中心,abtest系统,智库日志及监控系统,服务升降机系统等。专注后端架构并对AI算法、数学等有浓厚兴趣。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注