内容简介:在我们云脑科技最近的一个项目中,需要对文本中提取的实体进行消歧(比如,美国电影《坏女孩》由Myriad Pictures Inc.于2013年出品。讲述雅蕾克丝,一个女同性恋,父母离异,母亲重新找了一个继父,却又早早自杀身亡;父亲也重新找了个继母,继母对她百般刁难。
1.问题的引入
在我们云脑科技最近的一个项目中,需要对文本中提取的实体进行消歧( WSD , W ord S ense D isambiguation),即确定某个实体在当前上下文中是我们期望的一个意义。
比如,
美国电影《坏女孩》由Myriad Pictures Inc.于2013年出品。讲述雅蕾克丝,一个女同性恋,父母离异,母亲重新找了一个继父,却又早早自杀身亡;父亲也重新找了个继母,继母对她百般刁难。
其中 坏女孩、继父、继母、同性恋 都是候选的电影作品名。但结合上下文,如何去掉歧义候选,只保留 坏女孩 ,这就是我们需要解决的消歧问题。
2.解决消歧问题的一般思路
2.1 基线算法
机器学习任务一般需要对效果有简单的基线设置,WSD的基线可以用Lesk算法确定。人类在类似WordNet的词汇释义标注语料上的共识大概75%-80%,这可以作为WSD任务的上限参考。
Lesk是一个经典的算法。它的主要思想是:在词典中,常常需要借助若干其它词汇来对一个词进行解释。因此针对一条语料,我们可以选取它与词典中词汇重叠最多的那条释义。如果词典中的解释太过简单,可以把已标注释义的例句也当做释义内容。
2.2监督学习算法
监督学习算法一般涉及如下步骤:
a.确定 词表 和 释义表 ,eg: 目标词bass, 两个释义:乐器-贝斯、鱼类-鲈鱼;
b.获取 训练语料 :google、crawl;
c. 特征提取 :一般先设定一个窗口(window),只关心这个窗口内的词。常用的两种提取:窗口内每一个位置的词汇、相对位置、词性;以及忽略位置和词性的词袋表示,即词典内词的出现计数;
d. 分类器选择 :朴素贝叶斯、逻辑回归、SVM、KNN、神经网络。
2.3 半监督学习算法
如果对于目标问题没有足够的标注语料,如何启动呢?
一般可以从少量的手动标注启动,按照同一共现释义相同进行标注扩展,例如:bass的鲈鱼解释一般与fish共现;乐器贝斯解释一般与play共现。因此可以标注所有<fish, bass> 和 <play, bass>的语句。
还可以按照同一文章释义相同进行标注扩展,例如利用共现词标注了某个句子,那么可以确定这个文章中其他的目标词的同释义标注。
3.fastText和RNN的组合消歧方法
3.1 选型思路
在本文的应用场景下,我们对于词汇的候选释义集合是固定的。比如候选词坏女孩来说,我们并不关心它的实际解释,只关心它在当前语境中是否代表一个电影名。
因此,与上述一般化的消歧思路不同,我们可以先把问题转化成一个语境分类问题。fastText在这种近乎端到端的文本分类问题上有非常不错的效果,模型尺寸较小而且训练速度也很快。在fastText分类器对候选词的上下文进行领域分类后,基本能够排除掉大部分的非目标领域候选,比如示例语句中的 继父/继母/同性恋 等等。
但是在拿到最终的目标词提取结果后,发现还有一些电影语境中的其他歧义候选词。比如 美国电影《坏女孩》 这个例句,能够通过电影领域上下文分类,但是候选词中有 电影 ,没错, 电影 也是一个影片的候选词。因此,我们还需要更精细化的消歧处理。因此,我们在此处引入了基于RNN的序列标注算法,在确定语境范围后,进一步在语境内标注合理的出现位置。
3.2 fastText语境分类
训练语料
我们的训练语料是来自一些公开网站的影视信息和资讯信息,利用中文标点进行了语句切分。由于我们的语料中绝大多数的作品名是由书名号扩起的,可以利用这一点将语句进一步标注为包含领域关键词的短句。
特征处理
为了简化处理,直接将原始语句做了bigram切分。此时我们去掉了语料中的书名号,因为语料的标注是用书名号这种强规则来标注的,因此模型很可能只学到书名号这个特征。并且在做中文bigram切分时,非中文的数字/英文单词也需要作为一个整体处理。
训练模型
利用官方的源码编译二进制 工具 进行训练,以下是训练调参过程中的一些小tips。
a.使用epoch参数来更好的拟合训练集;
b.使用wordGram参数,让fastText学习到连续的切分嵌入,弥补分词不足和语序的缺失,但是模型大小会飞速增长,我只用到了wordGram=3;
c.使用minCount参数对词表词频进行过滤,避免词表过于庞大。以我们的语料为例,过滤效果是词表从75w减少到7w,我选取的minCount=5;
d.使用quantize命令压缩最终的模型,尺寸会小很多,本例中是300m到7.5m;
e.使用test命令进行验证集验证时,会发现准确P和召回R是相等的,这是因为fastText把分类问题都当做多分类来处理,不会输出针对每个分类的PR,最终会用所有分类的PR进行某种平均。因此需要手动编写一个基于predict命令的验证过程;
f.注意语料的设计,起初只用了电影语料的作品句子和非作品句子,结果发现在普通文本上的表现并不好。因此又加入了一部分的社会新闻语料,让模型能有更好的泛化效果。
3.3 RNN序列标注
训练语料
语料部分还是采用了fastText相同的规则,利用书名号这种强特征标注了作品名部分。由于序列标注的分类不平衡问题非常明显,因此决定用RNN的序列标注作为fastText的一个补充,训练语料中没有添加不含作品名的语句。
特征处理
直接采用字符级别的切分,同时和fastText一样去掉了书名号,此处将连续的字母和英文单词都做了特殊标签的处理,可谓一切从简。同时将训练语料统一在长度30上,超长的截断,不足的补充[eos]。
训练模型
a.采用多层的双向RNN+softmax分类;
b.引入了dropout进行正则化处理;
c.针对序列标注的类不平衡问题,起初尝试了针对分类配置loss权重的方法,但是权重设置过于主观。最终我们使用了 focal loss 。Focal Loss的核心思想是样本因为分类难度的不同对损失函数的贡献是不同的。鼓励模型把难分类的分对,而不是进一步优化易分类的效果。
4.小结
最后回顾一下我们在这项任务中的若干做法。
1.消歧问题的基线可以借助贝叶斯、Lesk等简单算法来设计;
2.语料不足时可以采用一些半监督的方法来扩充标注样本,人为总结标注规则;
3.利用fastText做短句分类,确定候选词所在上下文是否是目标领域;
4.利用RNN在短句中做关键信息标注,过滤掉领域上下文中非关键信息的候选;
5.利用focal loss改善序列标注中的类别不均衡问题,提升模型的召回表现。
欢迎探讨。
作者介绍
Amow,云脑科技机器学习算法工程师,负责开发NLP方向的基础服务。
以上所述就是小编给大家介绍的《技术解读 | 基于fastText和RNN的语义消歧实战》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Pytorch深度学习实战教程(一):语义分割基础与环境搭建
- kafka精确一次语义EOS的原理深入剖析-kafka 商业环境实战
- Kafka 偏移量管理实现精确一次语义在Spark&Flink中的技术实践-kafka商业应用实战
- 消息队列的消费语义和投递语义
- 剑桥构建视觉“语义大脑”:兼顾视觉信息和语义表示
- 新瓶装旧酒:语义网络,语义网,链接数据和知识图谱
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First JavaScript Programming
Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99
This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!