Fork me on GitHub

ModelScope社区基础NLP模型简介

以下文章来源于 https://zhuanlan.zhihu.com/p/646787576

导读 本文将介绍达摩院创建的ModelScope社区基础NLP模型。主要内容包括以下几大部分:

全文目录:

  1. 基础NLP任务
  2. 中⽂分词/词性
  3. 实体识别
  4. 文本表征
  5. 后续计划

分享嘉宾|蒋勇 阿里巴巴达摩院 算法专家

编辑整理|王超

内容校对|李瑶

出品社区|DataFun


01/基础NLP任务

首先来介绍一些基础NLP任务中的概念。



这里给了两个例子,左边是电商中的一个中文标题,右边是一个常见的英文句子,对于这两种不同语言的文本,分别对其进行分词、词性标注、词权重、中心词、实体识别、实体链接等各种任务的处理。

  • 分词,是把文章切成词组的一个个序列,英文叫chunk。
  • 词性标注,指的是对分好的词进行POS的打标,比如它是一个名词、动词或形容词等等。
  • 词权重,一个句子中不同词的权重会不一样,比如在电商场景下的句子中,因为商品卖的是童装,所以童装的权重会更大一些,其他词的权重相对小一些。
  • 中心词,顾名思义,就是权重最大的词。
  • 实体识别,例如在电商标题的场景下,主要是去识别品牌、产品以及一些修饰词等;在英文通用场景下,可能会去识别一些人名或地名等实体。
  • 实体链接,即把实体链接到一个知识库,比如电商例子中的品牌,可以链接到一个韩国的服饰服装设计品牌;英文例子中的Barack Obama,也可以链接到一个人名知识库里。

在ModelScope里面,目前已经上线了50基础NLP模型,主要覆盖分词词性、NER和文本表征三大类。分词词性上线了6个模型;NER上线的模型比较多,有40个模型;文本表征,一共上线了4个模型。



介绍完这些NLP基础任务之后,来看一下NLP基础任务在各种应用场景下有哪些作用。

  • 首先,最基础的作用就是做一些文本的分析,比如可以去做一些句子级别或篇章级别的分词或实体抽取的分析。上图中的第一个例子,就是基于金庸的小说《天龙八部》,尝试把小说中所有的招式名称做了一个识别,把识别结果通过词云的方式去展示,方便对文本有更好的理解。
  • NLP模型可以去赋能搜索,因为搜索主要是对给定一个query,去访问相关的一些document。举个例子,比如搜"阿里达摩院"和"少林寺达摩院",肯定返回的结果是不一样的,虽然他们都有一个"达摩院",但如果能够对这个query以及document有更好的结构化理解,就能够把搜索结果做得更好。
  • NLP基础任务还可以支持一些电商场景,比如商品的理解,因为一个商品,它可能包括一些图片以及标题详描等等。如果能够对这个商品很准确的识别出其品牌、型号、品类信息等,可以方便商家的上货以及后续的搜索推荐等各种场景。

接下来详细介绍一些ModelScope中的基础NLP任务。

02/中文分词/词性

首先来介绍一下中文分词和词性。



比如上图中的例子,"什么是中文分词"这样一个句子,可以做中文分词切成四个词。目标就是把它识别成一个独立且有语言语义学意义的一些词汇的组合。

其应用场景之一是中文的搜索。比如淘宝这种电商搜索,如果只是把字作为搜索,一般会基于倒排索引来构建这个商品的挂载,基于字的准确率和召回率肯定是不够的,如果能够把这个商品的标题、描述,通过分词处理成词组,可以更好地去搜索。又比如右侧的例子,是对周杰伦的歌词进行分词,然后通过词云展示,这样可以帮助去了解周杰伦的歌词在创作时的主要考虑因素。



上图是中文分词在ModelScope上的例子。左边是一个demo,输入一句话,点击执行,可以得到句子中的各种词,把每个词以不同颜色表述出来。分词这个模型,其实是一个比较经典的encoder+head的架构。比如可以基于Bert或阿里自研的StructBERT作为底座,上面接一个Softmax,对每个字做一个bi-directional的预测,就可以得到一个分词的结果。接下来把这个分词转成一个输出序列就可以了。



在最基础的分词模型基础之上,我们提出了一套基于边界感知的预训练策略,这个方法目前已经发表在2022年的EMNLP上。其核心思想是,在中文数据里面,都是基于字的,很多字之间有相关的关系,这些边际信息对很多中文的基础任务,比如分词、词性、NER都有一定作用,所以首先基于raw corpus无监督的方式挖掘了一大批词组数据,接下来把一大批的N-Gram信息注入到预训练模型的训练里面。在预训练过程中主要有两个loss,一个是最传统的MLM的loss,另一个是span边界映射的loss。基于这两种loss,可以去continue训练language model,最终使得language model对中文数据的感知更强。通过在中文的分词、词性标注、NER上的实验,可以看到我们的方法比Bert以及ERNIE等一些模型更优。基于这种预训练范式,我们也在ModleScope上线了不同行业的分词以及NER模型,主要包括两块,一个是新闻领域的分词模型和词性标注模型,一个是电商领域的分词模型和词性标注模型。

03/实体识别

接下来介绍实体识别。



实体识别主要的目标是给定一个文本,比如新闻领域的一段文本"国正先生在我心中就是这样的一位学长",可以去识别出这个文本中的人名 "国正"。在其它不同的场景下,可能想识别的实体类型是不一样的,比如右边是一个简历领域的数据,可以识别出文本中的人名、国籍、民族、学历、组织以及头衔等等。基于信息抽取的能力,可以在很多下游场景去提升任务的性能。



再来看一下实体识别模型,基本上也是一个Encoder+Head的架构。在实体识别里面,经常会发现,基于序列标注的CRF层一般效果可能会比Softmax效果要好。给定一个输入,它的输入法如果是中文,那么可能是一个字序列,如果是英文或者多语言,则会是一个词序列,给定一串序列后,我们可以基于Transformer的Embedding,比如用Bert模型给每对序列做一个编码,得到每一个token的新表征,在这个表征基础上,会接一个CRF层去建模词字或词之间的关系,通过CRF层最后来得到bioes的结果。整体来看,把实体识别问题转换成一个序列标注问题,通过Transformer+CRF方式就可以得到一个比较不错的结果。

这里介绍的主要是一个flat NER的模型,如果是像nested或者discontinuous,它的head会有所不同,目前来说flat NER用的场景会稍微多一点。

有了这样一个模型后,可以把句子作为一个输入,送到这个模型里,可以对这个句子进行一个很好的结构化,识别出句子中的人名、国籍、 民族、学历、组织、职业等信息,这样可以对原始数据有更好的理解。实体识别模型也可以赋能很多下游其它场景,比如搜索场景、对话场景、文本分析等等。



接下来介绍一下达摩院NLP在实体识别方向技术方面的探索和贡献。最早是2020年的时候,提出了ACE方案,它是一套动态知识融合技术,发表在ACL 2021上。它是基于一套自动组合不同词箱的方案。当前有很多预训练语言模型,但是当我们面临下游任务的时候,可能会不知道用哪些预训练语言模型,不同的语言模型之间,性能也是有一定差别的,我们希望能以自动化的方式来自动组合不同预训练模型中的一些优点,使下游任务能够达到一个较大的性能提升,尽可能去到达性能的天花板。

基于这一套范式,在24个结构预测的数据上达到了SOTA的结果,比如在CoNLL NER数据集(NER任务上、学术界用的最多的一个数据集),至今仍然是保持SOTA水平。在做完这个方案,我们发现引入额外的一些信息对性能提升有很大帮助,因此思考能否去显示检索一些额外知识、信息,可能会对实体抽取的任务有更明显的提升。因为实体抽取的核心是我们所关注的知识,这些知识很多时候在一个文本下信息是不足够的,如果能够引入更多的一些额外的信息、知识,可能对任务有更明显的提升。沿着这个方案我们又发表了一系列的文章,在各个实体抽取任务上都达到了比较好的效果。

以上两个技术方案,在SemEval国际语义竞赛的一个榜单上,在13个track中有10个拿到了第一。在NLPCC的语音NER+EL的任务上也拿到了一个第一。

在此基础上,一共在实体抽取、结构预测这个大方向上,在EMNLP等国际顶级的NLP会议上发表论文接近30篇,还获得了SemEval Best system paper的奖项。

在尝试考虑一些更细粒度实例的时候,发现在很多场景下,只是识别一些10类或20类以内的类型不足以满足实际业务的需求,于是尝试了识别更多种类型,比如百类、千类、万类,也做了一些模型,在UFET和Ontonotes上得到了SOTA的结果。

接下来会详细介绍前两部分,给定NER任务、NER数据,怎么能拿到一个SOTA的结果。



最开始在2020年,我们提出了这种动态知识增强、知识注入的一套方案,叫ACE。这套方案,达到了一个6大任务、24个数据SOTA的结果。在此基础之上,尝试去检索额外的信息,去提升原始文本的语义理解,从而提升文本NER识别的性能。

在此基础之上,进一步的去尝试检索一些知识库,比如说像维基百科这种通用的知识库,基于这种知识型的技术增强,在SemEval的国际竞赛,可以拿到10个子项的第一。同时这个方案也拿到了best system paper的奖项。在下半年,我们把这个方案广泛应用到各种各样的场景上,比如用到一些行业级的NER上,效果也不错。同时我们也把这个方法应用到了语音的实体理解的任务上,达到一个榜单第一。也把这个方案尝试用到了多模态NER,有图片信息的问题上,也达到了一个SOTA的结果,项目论文发表在NAACL2022上。除此之外,进一步把这个方案用到了多模态的另一个信息抽取任务(多模态关系抽取)上,达到了一个新的SOTA,论文发表在EMNLP2022上。现在正在把这套范式用在更多的任务上,大家有兴趣可以关注后续的一些研究成果。



这里简单介绍一下这套范式是怎么做的。主要包括两个模型,一个模型叫Retriever,给定一个文本,然后可以通过这个来获得一些其他的文本。另外一个模型是Reader,可以把检索得到的文本,追加到原始文本后面,去提升原始文本信息的能力,在此基础之上,可以提升Reader的性能。

整体上,任务可以抽象成如何去设计Retriever和Reader,是否可学习,Retriever背后的系统该如何设计。比如在最早的NAACL2021论文上,Retriever是用谷歌的Retriever来检索一些文本。因为当人不了解一些信息的时候,会把文本送到谷歌里去搜一搜额外的知识,计算机也是一样,我们发现在谷歌里搜一些相关文本,把它追加到句子后面,性能就可以得到提升。在SemEval2022榜单上,我们尝试把Wikipedia作为一个检索的文本,通过BM25这种无监督的检索方式去获得一些相关的文本。

同时像NER+EL实体抽取+实体链接任务,我们也是基于BM25这种方式来做一个检索,区别在于这是Retriever跟Reader联合学习的一个方案,因为在做很多任务时,我们发现比如说谷歌检索或者通过BM25这种无监督的方式做检索,检索出来的数据跟下游任务很多时候并不相关,但如果下游任务的性能能够反馈到检索模型的优化,可能最后可以使得下游任务优化得更好。在2021的ACL做一个初步的尝试,可以达到第一名的结果。

另外,在多模态的场景下,基于Dense的方式,比如图片这种数据是没办法通过BM25这种方法去做检索,可以在高维空间把它Encode成一个向量,然后再通过向量的相似度来检索出相关的文本去提升模型的性能。

除此之外,我们也提出了一套范式。因为在最终去使用的时候,可能会觉得检索module会比较重,也不可能最终去给业务方使用,或者部署一个模型上线,也不想去挂接一个检索的模块,因此提出了多视角学习的方案。



这一方案的核心思想是,原始文本需要拼接检索文本的一个新的文本,如果把原始文本v1,和拼接新文本的文本v2,同时输入模型,希望它最终的输出是一致的。因此设计了一套基于multi view training的范式,把知识通过检索融入到原始的模型里,这样模型在最终应用的时候就不需要检索这一步骤。这套方案也带来了不错的性能提升。接下来看一下这套范式如何实际应用到各种数据抽取问题。



左边是一个电商query的NER,这是一个小米手机的型号,因为它是一个非常知识相关的词,而且是一个非常生僻的词,直接放到模型里的话模型可能很容易把第一个词预测成一个品类词,但实际上它是一个型号词,这里如果通过检索增强的方式来通过这个query检索到一个对应的商品,这一商品中提供一个非常丰富的上下文,可以弥补原始文本缺少上下文的情况,那么效果将有非常明显的提升。

后面我们把这一方式用到了更多的场景。中间这个例子是一个地址NER,"深圳南山大学城"这个数据,如果想去识别南山大学到底是一个POI,还是南山是一个区,非常难以区分。如果通过检索的手段,可以把这个query送到知识库里,或送到无监督语料里,发现可以检索出一些相似的文本,通过对比就能发现, "南山"其实是一个区,而"大学城"是一个POI,这样我们就可以把"南山大学城"做一个很好的拆分。基于这套策略,对一些比较难的实体类型,也可以做一个非常好的识别,达到更好的性能,这个论文也发表在了COLING2022上,并应用到实际的地址标准化的产品里。

我们还将这一方案应用到了NLPCC的一个语音识别理解的任务上。背景是,这个文本来自于ASR的一个噪声。因为它是一个演讲比赛,这个文本不是一个人写的或者一个比较天然的文本,而是通过机器把一个语音信号转换成的一个带噪声的文本信号。因为这个文本是有噪声的,同时与原始文本差异也比较大,如果直接通过Bert方法去做Encoding,那么效果是不够理想的。这里做了两个策略,第一个策略就是对带噪的文本,去检索一个已有的一个知识库。同时也会基于带噪文本,先去检索带噪文本对应的一些相关文本,这两个策略整体都是非常有效的,再把这两个策略做一个总体的组合,最终可以基于Bert-large这种backbone做一个底座,可以提升接近三个多点F1的提升。最终基于这个技术点,在NLPCC语音数据理解的竞赛上获得了榜首。



接下来再介绍一下把检索增强的策略应用到另外两个场景下。一个是多模态NER的场景,比如微信朋友圈里面,对一段文本做一个识别,有些用户去发朋友圈的时候,有些文本也会附带一些图片,很多时候这个图片给文本提供了非常丰富的信息,我们希望去利用好这个信息。沿用检索增强的一套范式,首先把图片通过caption或通过object detection,又或通过OCR等等方式把它转化成文本,再把这个文本拼接在原始文本的后面,这样就可以达到一个不错的结果。我们进一步思考能不能引入更多的检索信息,如果能引入更多检索文本、检索图片相关的一些信号,可以进一步提升多模态NER的性能,在NAACL2022的基础之上,我们进一步构建了一个多模态检索的方案,整体思想就是找维基百科把它爬下来,把维基百科中的这些图片、文本构建到这个检索系统里,同时把输入端的文本、图片在维基百科中进行检索,把检索出来的数据反过来拼接到原始文本的后面去提升原始文本的表征,通过这种方案,发现可以进一步让NAACL的工作得到进一步的提升,达到一个新的SOTA。



下面来看一下在ModelScope这个社区的平台上面,命名实体识别目前上线了哪些模型。首先登录到ModelScope官网,然后点击模型库,通过点击左侧自然语言处理下的子tab------命名实体识别,可以看到目前已经上线40多个行业命名实体识别的模型,目前已经有一些用户在下载使用。



上图是对目前上线的模型的一个汇总统计。首先,左侧图展示的是行情覆盖情况,可以看到覆盖率了电商、新闻、社交媒体等各种行业,其中通用模型是上线量最多的。因为这些模型背后的数据集,大部分还是来自于学术界或者比赛所使用的一些开源的数据集。如果其中哪些实体类型在使用中存在问题,也欢迎大家与我们沟通。

右上角的图是分语种来看,目前以中文为主。在很多应用场景下,大家对模型规格也是有一些特定需求的,因此我们上线了large、base和LSTM各种规格的模型,方便大家在不同的场景下使用。比如在一个资源比较有限的场景下,可以去尝试用我们的LSTM模型,它会相对比较轻量级一点,但性能可能会稍微差一点;在资源比较富裕的情况下,可以尝试用一些large模型;如果在两者之间,那么可以考虑用base模型。



下面通过几个例子展示一下目前上线的不同行业的模型。第一个是一个电商细粒度的NER,从淘宝上随便复制一个商品标题,点击执行,即可得到这个标题文本的一个实体抽取的结果,可以看到,把标题中的品牌、款式、材质、产品,都能做一个很好的有效识别。

第二个的是简历领域,可以去写一段简历文本,点击执行,可以识别出国籍、民族以及学历等等。

第三个是医疗领域的一个NER,这里目前只上了一个flat的NER,只能抽取序列级的span,不能抽取nested的。这里的例子是对于一个文本,可以抽出其中的一些疾病以及疾病的一些特征。



在具有了这些实体识别能力后,如何去利用实体识别能力构建一些小应用?这里提供了一个可能的方案,尝试用我们的小说领域的实体抽取,看一下能不能基于这种实体抽取的模型对《天龙八部》这么一部小说有更好的认识和理解。具体做法是,把这个小说下载下来,然后按照句子做一个切分。切完过后,把每一句输入到这个模型里,然后几行命令就可以得到一个结果,最终把这个结果加几行逻辑处理的代码,做一个总和就可以得到不同数据类型所对应的一些实体。可以做一个展示,一个是招式名,可以看到在《天龙八部》小说里面有金庸大师设计的非常有趣的一些招式,比如凌波微步、一阳指、化功大法、北冥神功,这些还挺有趣的。同时也可以抽取一些武侠人物,比如之前以为乔峰占比是非常多的,后来发现占比最大的其实是段誉,这也是比较出乎我的意料。此外可以识别一些帮派名,天龙八部小说里面,我们发现丐帮这个词,出现的频率是最高的。这个例子当然只是抛砖引玉,大家可以基于我们目前已经上线的一些实体抽取的能力,来搭建下游的一些有趣的应用。

03/文本表征

接下来介绍一下文本表征的能力。



首先来简单介绍一下什么是文本表征。文本表征的目标就是希望把这个文本映射到一个高维的连续向量里面,这样就可以通过一组数字来对这个原始文本做一个建模。那它有什么作用呢?这里给了两个例子,一个作用就是把不同的文本映射到同一个高维的向量空间里面,再通过向量空间中的距离的度量去判断出不同文本之间的相似度关系。比如"苹果手机"与"乔布斯"之间的联系会比较紧密,但与"富士苹果"的距离就会比较远一点。另一个作用是,在搜索引擎中,比如搜索 "美猴王",我们会发现淘宝返回的其中一些相关商品的标题中并没有写"美猴王",那它是怎么被返回的呢?一种方案就是把美猴王这个query,以及商品的标题,同时映射到某一个连续的子空间里,再通过向量的计算来召回出这个商品。



我们在文本表征方向也做了一系列的工作,首先介绍一下文本表征的通用范式大概是怎么做的,它包含两个阶段,第一个阶段是召回阶段,第二个阶段是精排阶段。召回阶段,就是给定一个query,可以在上亿甚至十亿这种doc里面去检索出可能top100或top 1000相关的doc,再通过精排去做一个re-ranking来得到最终的结果。召回通常会采用双塔模型来做,而精排通常会用单塔模型。

我们在这个方向上做了进一步的优化,因为我们发现在搜索场景下,不同的值的作用是不一样的,所以引入了term weight的信息在预训练里面。同时沿用原有的MLM的一套训练目标,可以通过无监督的获取term weight的信息,注入到MLM目标里,去做进一步的continue的pre-training,这样会有一个更好的提升。

进一步,我们又提出了一个混排模型,粗排加精排,可能最终得到的结果还是比较有限的,如果我们能够尝试把粗排的结果跟精排的结果做一个融合,同时输入到一个新的模型------混排模型中,做一个二次的重排序,那么会有更好的效果。我们发现基于这种方式,可以在MS MARCO的passage ranking上达到SOTA的结果,目前依旧是一个榜一的位置。



基于以上的技术,我们在ModelScope上目前已经上线了四个文本表征的模型,包括中英的双塔模型和中英的单塔模型。以上就是对目前基础NLP的50个基础模型的一个简单介绍,欢迎大家到ModelScope社区来进行体验。

04/后续计划

最后介绍一下未来我们计划在ModelScope平台进一步开放的一些能力。



主要有四个新的能力:地址结构化,文档关键词抽取,百科实体链接和更多相似度模型。如果大家有兴趣的话,可以扫码加入钉钉群,进行更多的讨论。

最后宣传一下我们推广的一个序列理解工具箱------AdaSeq,它的全称是Alibaba Damo Academy Sequence understanding tollkits。其定位是希望在ModelScope生态下的序列理解领域,作为一个比较重要的模型开发组件。它具有如下几个特色:

  • 方法丰富、效果优异:提供(包括自研)序列理解领域(分词,NER,关键词,关系抽取等)的几十种SOTA模型代码、训练方法、周边工具,适用于多任务、多语言、多场景。
  • 调用方便、结果最优:一键式调参、探索不同方法、产出最优模型。
  • 轻松定制、一键评估:框架拓展性强,可一键运行几十benchmarks全方位评估模型效果。
  • 性能强劲、工具齐全:工业级工程性能优化,上下游工具齐全,ModelScope部署方案开箱即用。

欢迎大家来试用:
https://github.com/modelscope/adaseq

今天的分享就到这里,谢谢大家。



本文地址:https://www.6aiq.com/article/1690643701525
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出