内容简介:背景移动互联网蓬勃发展的时代,随着互联网服务提供商竞争的加剧,国家对重点行业服务水平要求的不断提高,促使信息服务提供商对其业务质量、用户体验越来越关注,进而提升客户满意度,减少投诉,增加核心竞争力和品牌价值。58同城作为国内最大的生活服务平台,拥有招聘、房产、二手车、本地服务、金融等业务板块和庞大的用户群体,每天业务信息发布数据量高达数亿,文字作为内容信息的主要载体,承载着人们表达、沟通的需求,严格控制文本信息质量,具有重要的意义。
导语
为了识别业务数据中存在的随机字、语义不连贯、不符合常用规范的语言现象,本文提出了一种利用大规模无监督语料,训练语言模型计算语句困惑度的方法,将低质文本识别问题转化为阈值判定问题。实际应用效果表明,该方法具有无数据标注成本、识别准确率高、领域迁移性强等特点,可以快速有效地推广到其他业务场景。
背景
移动互联网蓬勃发展的时代,随着互联网服务提供商竞争的加剧,国家对重点行业服务水平要求的不断提高,促使信息服务提供商对其业务质量、用户体验越来越关注,进而提升客户满意度,减少投诉,增加核心竞争力和品牌价值。
58同城作为国内最大的生活服务平台,拥有招聘、房产、二手车、本地服务、金融等业务板块和庞大的用户群体,每天业务信息发布数据量高达数亿,文字作为内容信息的主要载体,承载着人们表达、沟通的需求,严格控制文本信息质量,具有重要的意义。
由于用户基数大,信息覆盖范围广,网民素质参差不齐,难免存在劣质用户发布虚假、涉黄、涉政、广告、灌水等违规帖子数据。如在招聘业务场景中,存在一些生僻字、随机字、语义不连贯等语言现象,如:“30/小时招聘日结小时工假期兼职-荡贸”、“淄博桓台县萍敢诙捞环胁恫有限公司”。
58同城坚持用户至上的原则,坚决杜绝这种降低数据信息质量、影响用户体验的行为发生,海量的数据给信息审核工作带来了巨大的挑战。我们从低质文本的特点分析入手,利用大规模的无监督文本数据,训练神经概率语言模型,通过计算困惑度的方式进行识别,为做好发帖质量优化、违禁信息过滤、信息质量监控提供了落地方案。
低质文本特点分析
1. 低质文本的定义
低质文本:是指在具体业务场景下,句子中出现无意义文字或符号,语义表达不连贯,不符合常用规范的语言现象。
2. 低质文本的特点
2.1 对抗性强,变化快
黑产通过发帖机短时间内生成大量的低质文本,在被业务线发觉拦截后,会不断的变化生成的方式,绕过风控的策略,表现出较强的对抗性。
目前,业务线主要是通过寻找字面上的规律,制定规则,对文本进行匹配的方式进行拦截,这种做法主要有三个问题:
a) 滞后性,只能识别已经被发觉的低质文本,时间上表现为滞后性,此时低质文本已经对用户体验产生了伤害。
b) 只能识别特定模式的低质文本,对于对抗后变换规则的低质文本,识别方法失效。
c) 覆盖率低,很难覆盖线上所有类型的低质文本。
2.2 数据稀疏性,收集成本高
低质文本虽然类型繁多,变化多端,特定类型的低质文本数据,表现出较强的数据稀疏性,通过人工筛选的方式耗时耗力,实施成本高。
2.3 数据量大,人工推审效率低
业务场景低质文本数据量大,风控难度高。目前,各业务线主要是通过规则的方式,拦截低质文本,然后通过人工推审的方式做相应的处理,效率低下。
低质文本识别方案设计
那么有没有一种方式,可以只利用正常的线上业务数据或网络上公开的百科数据、新闻类数据训练模型,对某一条语句从语义连贯性、符合规范性上进行度量,根据度量的大小来识别低质文本呢?
本文通过利用正常数据训练语言模型,计算某个单词在上文环境下出现的概率,再去计算整个语句的困惑度得分score,如果得分score大于特定阈值的情况下,该语句就是低质文本。识别流程如图1所示:
图1:低质文本识别流程图
1. 困惑度的定义
困惑度(Perplexity):是自然语言处理领域衡量一条语句是否符合已知某种语言概率分布的度量,计算公式如(1)所示:
2. 模型结构设计v1
模型结构基于Transformer Block,结构设计如图2所示:
图2:语言模型结构图
对比与传统的RNN,Transformer有4个优势:
a) 解决长程依赖性的问题;虽然RNN可以通过LSTM引入长期记忆的方式缓解梯度消失、梯度爆炸等问题,但依然无法从根本上解决长程依赖性的问题。Transformer通过引入Self-Attention机制,把任意两个字符之间的距离缩减为1,有效解决了长程依赖性的问题。
b) 可以并行计算,解决RNN计算速度慢的问题;RNN的序列结构决定了其计算过程只能串行,计算速度慢。Transformer取消了不同时间步的依赖关系,计算量主要体现在矩阵乘法计算上,更适合用GPU等并行计算单元来提速。
c) 提取特征能力更强;大量研究论文已经表明,Transformer提取特征的能力更强。
d) 可以通过堆叠的方式叠加N层,更适合捕获深层的语义特征。
本文把语言模型建模看成一个Seq2Seq的模型,针对每条训练本,输入输出的关系如图3所示:
图3:语言模型输入输出关系
在Transformer Block的计算过程中,考虑到语言模型要计算单词基于上文环境下出现的概率,在Self-Attention的计算出匹配得分矩阵M后,需要对矩阵M取下三角,抹掉该词及其下文环境的信息。
3. 模型v1遇到的问题
3.1 被平均问题
由公式(1)可知,困惑度PPL的计算涉及到若干词概率的对数的平均值,如果文本长度n特别大,文本中只有个别几个位置出现了生僻字,概率值较小,通过平均值的计算,对局部概率值变化大的地方起到了平滑的作用,可能会导致无法识别出低质文本。
对于这个问题,我们可以通过移动平均(Moving Average)的方式解决。设置合适窗口宽度w,分别计算滑动窗口内语句的困惑度,然后取困惑度的最大值作为整个语句的得分。
3.2 定长截断问题
在训练模型时,模型都对样本有最大序列长度MaxLength的限制,如果直接对于小于MaxLength的样本进行填充处理,样本中充斥的大量无意义的PAD字符,会导致训练模型过程中无法收敛的问题。我们应用了大量论文中提到的定长截断的Trick,即把所有样本拼接成一个长字符串,然后按照最大序列长度进行截取,然而这也会引入一定的噪声。截取操作如图4所示:
图4:定长截断Trick操作示意
通过定长截取,第二条样本会以“,”开始,这也不符合我们的语言习惯,也就是说,在训练过程中引入了噪声。
3.3 语料规模问题
我们收集了大概500M的语料数据后,对模型进行训练,模型上线后,遇到了一些误召回的问题,误召回的原因主要是:
a) 地名问题,主要是出现次数少或没有出现过的地名;
b) 命名实体,比如快餐店招工广告中出现“油条”“豆沙包”等命名实体,训练数据中没有出现过类似数据
c) 专业词汇、简称等
归根结底,主要原因是收集的语料规模不够大,导致模型的泛化性能不足所致。
4. 模型结构设计v2
2018年10月,Google推出了NLP的里程碑式的模型BERT,受到了广泛的关注。主要思想是:通过Masked Language Model和Next Sentence Prediction的方式进行预训练,获取句子的表征,然后再通过Fine-Tuning的方式训练上游模型参数。
那么我们能不能通过Masked Language Model来计算句子的困惑度呢?对比于模型v1, Google推出的预训练模型有以下优点:
a) 训练语料规模大,语料跨领域、跨行业,通用性更强;
b) 更深层的网络,可以捕获更深层的语义特征;
c) 没有定长截断带来的误差,通过mask可以过滤掉无意义的pad信息,解决了短样本的PAD问题,也就不需要定长截断的Trick;
d) 基于上下文环境预测单词出现的概率更精准;
如果应用Google的Masked Language Model,计算困惑度的公式应该修改如(2)所示:
对比公式(1),由基于上文环境单词出现的概率修改为基于上下文环境单词出现的概率。
模型结构设计如下图所示:
图5:Masked Language Model模型结构
对比于模型v1,主要有2个方面的修改:
a) 要计算某单词出现的概率,需要对该位置进行MASK,
b) 通过n层Transformer计算后,根据Masked Position获取该位置的表示,然后输入到全连接网络中计算单词出现的概率。
5. 性能优化
对比与模型v1,模型v2的计算量有了大幅度的增长,主要有两方面原因:
a) 模型更深,参数更多
b) 模型v1计算句子中每个单词基于上文环境出现的概率,只需要计算一次;模型v2计算句子中每个单词基于上下文环境出现的概率,需要计算n次,n为句子的长度。
所以,我们需要在保证模型准确性的前提下,提高服务的QPS,主要基于以下3个措施:
5.1 MASK位置个数自适应
对于输入样本,可以在保证保留足够上下文信息预测该词出现的概率的情况下,根据文本的长度调整MASK位置的个数,同时预测多个位置,减少预测的次数。
5.2 MASK位置均匀采样
MASK位置的选择,不能太集中太稠密,否则会丢失该单词的N-Gram环境信息,降低预测该单词概率的精度。因此,要采用合理的间距,对MASK的位置进行均匀采样。
5.3 Redis 缓存计算结果
对于已经通过模型计算的文本,利用Redis保存模型的计算结果,减少重复计算。
6. 线上数据评测效果
6.1 调用量、命中量、QPS、准确率
低质文本识别服务上线后,平均每日的调用量、命中量、准确率情况如表1所示:
表1:低质文本识别服务性能指标
日期 |
调用量 |
命中量 |
准确率 |
2019/4/26 |
11,990,226 |
37445 |
98.53% |
2019/5/17 |
20,705,285 |
26153 |
98.21% |
2019/5/24 |
33,048,004 |
23874 |
97.50% |
2019/8/9 |
39,929,396 |
21569 |
96.65% |
2019/8/28 |
41,672,416 |
26415 |
97.10% |
图6为2019年8月23日服务的耗时情况,90%的服务调用耗时小于31.1毫秒,99%的服务调用耗时 91.4毫秒。
总结、展望与规划
本文利用无监督的预训练语言模型,计算文本语句的困惑度,通过阈值判定识别出业务场景下的低质文本,具有计算速度快、识别准确率高、领域适应性强等优点,但仍存在长短文本敏感度设置不一致、缩略语误识、一句话多语义转折误识等问题,规划拟通过以下几个方面提高模型识别效果:
1. 更换预训练模型,使计算单字在上下文环境下的概率更精准。
2. 困惑度计算时为长短文本设置不同的窗口宽度,或动态自适应的方式调整窗口宽度。
3. 领域性针对性优化,引入业务线数据,对预训练模型进行微调。
4. 结合句法分析,识别语句词语之间的结构关系,调整困惑度计算方法。
作者简介(必填)
赵忠信 / 负责舆情聚类、低质文本识别等文本内容安全算法能力建设,研究Neural Topic Model、Memory Network等NLP领域相关方向。
阅读推荐
1. 基于git submodule的增量项目源码自动化管理探索实践
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 低代码==低质量?
- [译] 虚构问题,低质量软件的根源
- 消息队列的消费语义和投递语义
- 剑桥构建视觉“语义大脑”:兼顾视觉信息和语义表示
- 新瓶装旧酒:语义网络,语义网,链接数据和知识图谱
- 超强语义分割算法!基于语义流的快速而准确的场景解析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Mastering Flask
Jack Stouffer / Packt Publishing / 2015-9-30 / USD 49.99
Work with scalable Flask application structures to create complex web apps Discover the most powerful Flask extensions and learn how to create one Deploy your application to real-world platforms......一起来看看 《Mastering Flask》 这本书的介绍吧!