当前位置:   article > 正文

【论文阅读】命名实体识别文献综述_ner评价指标conll2003

ner评价指标conll2003

命名实体识别的常用方法是BiLSTM-CRF和BERT-CRF,可以完美的匹配该任务。

综述

在这里插入图片描述

摘要

命名实体识别 (NER) 是从属于预定义语义类型(如人、位置、组织等)的文本中识别刚性指示符的任务。NER 一直是许多自然语言应用的基础,如问答、文本摘要和机器翻译。早期的 NER 系统在以设计特定领域的特征和规则的人工工程成本实现良好性能方面取得了巨大成功。近年来,深度学习通过非线性处理得到连续实值向量表示和语义组合的支持,已被用于 NER 系统,产生了最先进的性能。在本文中,我们全面回顾了现有的 NER 深度学习技术。我们首先介绍 NER 资源,包括带标签的 NER 语料库和现成的 NER 工具。然后,我们根据沿三个轴的分类法对现有作品进行系统分类:输入的分布式表示、上下文编码器和标签解码器。接下来,我们调查了最近在新的 NER 问题设置和应用中应用深度学习技术的最具代表性的方法。最后,我们向读者展示了 NER 系统面临的挑战,并概述了该领域的未来方向。

Index Terms—Natural language processing, named entity recognition, deep learning, survey

1.Introduction

NAMED 实体识别 (NER) 旨在从属于预定义语义类型(例如人、位置、组织等)的文本中识别刚性指示符的提及 [1]。 NER 不仅作为信息提取 (IE) 的独立工具,而且在文本理解 [2]、[3]、信息检索 [4]、 [5]、自动文本摘要[6]、问答[7]、机器翻译[8]、知识库构建[9]等

  • NER的演进
    • 术语“命名实体”(NE)首次在第六届消息理解会议(MUC-6)[10]上使用,作为识别文本中组织名称、人员名称和地理位置以及货币、时间的任务和百分比表达式。自 MUC-6 以来,人们对 NER 的兴趣越来越大,各种科学事件(例如,CoNLL03 [11]、ACE [12]、IREX [13] 和 TREC Entity Track [14])都在这个主题上投入了大量精力。
    • 关于问题定义,Petasis 等人。 [15]限制了命名实体的定义:“NE是一个专有名词,作为某物或某人的名字”。语料库中存在的专有名词的显着百分比证明了这种限制是合理的。 Nadeau 和 Sekine [1] 声称,“命名”一词将任务限制为仅由一个或多个刚性指示符代表所指对象的那些实体。 [16] 中定义的刚性指示符包括专有名称和自然种类术语,如生物物种和物质。尽管 NE 的定义多种多样,但研究人员已就需要识别的 NE 类型达成共识。我们通常将 NE 分为两类:通用 NE(例如,人和位置)和特定领域的 NE(例如,蛋白质、酶和基因)。在本文中,我们主要关注英语中的通用 NE。我们并不声称这篇文章是详尽无遗的或代表所有语言的所有 NER 作品。
    • 至于 NER 中应用的技术,主要有四个流派:1)基于规则的方法,不需要注释数据,因为它们依赖于手工制定的规则; 2) 无监督学习方法,它依赖于没有手工标记训练示例的无监督算法; 3)基于特征的监督学习方法,它依赖于具有仔细特征工程的监督学习算法; 4)基于深度学习的方法,以端到端的方式从原始输入中自动发现分类和/或检测所需的表示。我们简要介绍 1)、2) 和 3),并详细回顾 4)。
  • 进行这项调查的动机
    • 近年来,深度学习(DL,也称为深度神经网络)因其在各个领域的成功而备受关注。从 Collobert 等人开始。 [17],具有最少特征工程的基于 DL 的 NER 系统一直在蓬勃发展。在过去的几年中,相当多的研究将深度学习应用于 NER,并成功地提升了最先进的性能 [17]-[21]。这种趋势促使我们进行一项调查,以报告深度学习技术在 NER 研究中的现状。通过比较 DL 架构的选择,我们旨在确定影响 NER 性能的因素以及问题和挑战。
    • 另一方面,尽管 NER 研究几十年来一直蓬勃发展,但据我们所知,迄今为止该领域的评论很少。可以说,最成熟的一个是由 Nadeau 和 Sekine [1] 于 2007 年发表的。这项调查概述了从手工制定规则到机器学习的技术趋势。马雷罗等人。 [22] 总结了 2013 年 NER 工作从谬误、挑战和机遇的角度。然后 Patawar 和 Potey [23] 在 2015 年提供了一个简短的评论。最近的两个简短调查是关于新领域 [24] 和复杂实体提及 [ 25],分别。总之,现有调查主要涵盖基于特征的机器学习模型,而不是现代基于 DL 的 NER 系统。与这项工作更相关的是 2018 年的两项最新调查 [26]、[27]。Goyal 等人。 [27] 调查了 NER 的发展和进展。但是,它们不包括深度学习技术的最新进展。 Yadav 和 Bethard [26] 基于句子中单词的表示,对 NER 的最新进展进行了简短的调查。本调查更多地关注输入的分布式表示(例如,字符级和单词级嵌入),而不是审查上下文编码器和标签解码器。最近在 NER 任务上应用深度学习的趋势(例如,多任务学习、迁移学习、强化学习和对抗性学习)也不在他们的范围内。
  • 本次调查的贡献
    • 我们深入回顾了深度学习技术在 NER 中的应用,以启发和指导该领域的研究人员和从业者。具体来说,我们以表格形式整合 NER 语料库、现成的 NER 系统(来自学术界和工业界),为 NER 研究社区提供有用的资源。然后,我们对 NER 的深度学习技术进行了全面调查。为此,我们提出了一种新的分类法,它沿三个轴系统地组织了基于 DL 的 NER 方法:输入的分布式表示、上下文编码器(用于捕获标签解码器的上下文依赖性)和标签解码器(用于预测单词标签)给定的顺序)。此外,我们还调查了最近在新的 NER 问题设置和应用中应用深度学习技术的最具代表性的方法。最后,我们向读者展示了 NER 系统面临的挑战,并概述了该领域的未来方向。

2 背景

  • 我们首先给出 NER 问题的正式表述。然后我们介绍了广泛使用的 NER 数据集和工具。接下来,我们详细介绍评估指标并总结 NER 的传统方法。

2.1 什么是神经网络?

  • 命名实体是一个单词或短语,可以从一组具有相似属性的其他项目中清楚地识别出一个项目 [28]。命名实体的示例是一般域中的组织、人员和位置名称;生物医学领域的基因、蛋白质、药物和疾病名称。 NER 是将文本中的命名实体定位和分类为预定义实体类别的过程。

  • 形式上,给定一个标记序列 s = < w 1 , w 2 , . . . , w N > s = < w_1, w_2, ..., w_N> s=<w1,w2,...,wN> ,NER 是输出一个元组列表 < I s , I e , t i > < I_s, I_e, t_i> <Is,Ie,ti>。每一个都是s中提到的一个命名实体。

  • 这里, I s ∈ [ 1 , N ]   a n d   I e ∈ [ 1 , N ] I_s ∈ [1, N] \ and\ I_e ∈ [1, N ] Is[1,N] and Ie[1,N]是命名实体提及的开始和结束索引;t 是预定义类别集中的实体类型。图 1 显示了一个示例,其中 NER 系统从给定的句子中识别三个命名实体。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hw0dugKq-1678240468627)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307162045505.png)]

  • 当 NER 首次在 MUC 中定义时-6 [10],任务是识别文本中的人名、组织、位置和时间、货币、百分比表达式。请注意,该任务侧重于一小组粗略的实体类型,每个命名实体一个类型。我们将这种 NER 任务称为粗粒度 NER [10]、[11]。最近,一些细粒度 NER 任务 [29]-[33] 关注更大的实体类型集,其中一个提及项可能被分配多个细粒度类型。

  • NER 作为各种下游应用程序的重要预处理步骤例如信息检索、问答、机器翻译等。在这里,我们以语义搜索为例来说明 NER 在支持各种应用方面的重要性。语义搜索是指一组技术,它使搜索引擎能够理解用户查询背后的概念、含义和意图 [34]。根据 [4],大约 71% 的搜索查询包含至少一个命名实体。识别搜索查询中的命名实体将帮助我们更好地理解用户意图,从而提供更好的搜索结果。为了将命名实体纳入搜索中,Raviv 等人提出了基于实体的语言模型 [34],该模型考虑单个术语以及已注释为实体(在文档和查询中)的术语序列。 [35]。还有一些研究利用命名实体来增强用户体验,例如查询推荐 [36]、查询自动完成 [37]、[38] 和实体卡 [39]、[40]。

2.2 NER 资源:数据集和工具

  • 高质量的注释对于模型学习和评估都至关重要。在下文中,我们总结了英语 NER 广泛使用的数据集和现成的工具。

  • 标记语料库是包含一种或多种实体类型注释的文档集合。表 1 列出了一些广泛使用的数据集及其数据源和实体类型(也称为标签类型)的数量。如表 1 所示,在 2005 年之前,数据集主要通过对新闻文章进行注释而开发,实体类型较少,适用于粗粒度的 NER 任务。之后,在各种文本源上开发了更多数据集,包括维基百科文章、对话和用户生成的文本(例如,推文和 YouTube 评论以及 W-NUT 中的 StackExchange 帖子)。标签类型的数量显着增加,例如 HYENA 中的 505。

    Corpus Year Text Source #Tags URL

    MUC-6 1995 Wall Street Journal 7

    https://catalog.ldc.upenn.edu/LDC2003T13

    MUC-6 Plus 1995 Additional news to MUC-6 7

    https://catalog.ldc.upenn.edu/LDC96T10

    MUC-7 1997 New York Times news 7

    https://catalog.ldc.upenn.edu/LDC2001T02

    CoNLL03 2003 Reuters news 4

    https://www.clips.uantwerpen.be/conll2003/ner/

    ACE 2000 - 2008 Transcripts, news 7

    https://www.ldc.upenn.edu/collaborations/past-projects/ace

    OntoNotes 2007 - 2012 Magazine, news, web, etc. 18

    https://catalog.ldc.upenn.edu/LDC2013T19

    W-NUT 2015 - 2018 User-generated text 6/10

    http://noisy-text.github.io

    BBN 2005 Wall Street Journal 64

    https://catalog.ldc.upenn.edu/LDC2005T33

    WikiGold 2009 Wikipedia 4 https://fifigshare.com/articles/Learning_multilingual_named_entity_recognition_from_Wikipedia/5462500

    WiNER 2012 Wikipedia 4

    http://rali.iro.umontreal.ca/rali/en/winer-wikipedia-for-ner

    WikiFiger 2012 Wikipedia 112

    https://github.com/xiaoling/fifiger

    HYENA 2012 Wikipedia 505

    https://www.mpi-inf.mpg.de/departments/databases-and-information-systems/research/yago-naga/hyena

    N3 2014 News 3

    http://aksw.org/Projects/N3NERNEDNIF.html

    Gillick 2016 Magazine, news, web, etc. 89

    https://arxiv.org/e-print/1412.1820v2

    FG-NER 2018 Various 200

    https://fgner.alt.ai/

    NNE 2019 Newswire 114

    https://github.com/nickyringland/nested_named_entities

    GENIA 2004 Biology and clinical text 36

    http://www.geniaproject.org/home

    GENETAG 2005 MEDLINE 2

    https://sourceforge.net/projects/bioc/fifiles/

    FSU-PRGE 2010 PubMed and MEDLINE 5

    https://julielab.de/Resources/FSU_PRGE.html

    NCBI-Disease 2014 PubMed 1

    https://www.ncbi.nlm.nih.gov/CBBresearch/Dogan/DISEASE/

    BC5CDR 2015 PubMed 3

    http://bioc.sourceforge.net/

    DFKI 2018 Business news and social media 7

    https://dfki-lt-re-group.bitbucket.io/product-corpus/

  • 我们还列出了一些领域特定的数据集,特别是在 PubMed 和 MEDLINE 文本上开发的。实体类型的数量从 NCBI-Disease 中的 1 种到 GENIA 中的 36 种不等。我们注意到许多最近的 NER 作品报告了他们在 CoNLL03 和 OntoNotes 数据集上的表现(见表 3)。 CoNLL03 包含两种语言的路透社新闻注释:英语和德语。英语数据集有很大一部分体育新闻,带有四种实体类型(人物、位置、组织和杂项)的注释 [11]。 OntoNotes 项目的目标是注释大型语料库,包括各种类型(网络日志、新闻、脱口秀、广播、新闻组和电话对话),具有结构信息(句法和谓词参数结构)和浅层语义(词与本体论和共指相关联的意义)。有 5 个版本,从 Release 1.0 到 Release 5.0。这些文本用 18 种实体类型进行了注释。

  • 我们还注意到两个托管一些 NER 语料库的 Github 存储库。网上有许多带有预训练模型的 NER 工具。表 2 总结了学术界(顶部)和工业界(底部)流行的英语 NER。

NER System URL

StanfordCoreNLP :https://stanfordnlp.github.io/CoreNLP/

OSU Twitter NLP :https://github.com/aritter/twitter_nlp

Illinois NLP :http://cogcomp.org/page/software/

NeuroNER :http://neuroner.com/

NERsuite : http://nersuite.nlplab.org/

Polyglot : https://polyglot.readthedocs.io

Gimli : http://bioinformatics.ua.pt/gimli

spaCy : https://spacy.io/api/entityrecognizer

NLTK :https://www.nltk.org

OpenNLP :https://opennlp.apache.org/

LingPipe :http://alias-i.com/lingpipe-3.9.3/

AllenNLP :https://demo.allennlp.org/

IBM Watson https://natural-language-understanding-demo.ng.bluemix.net

FG-NER https://fgner.alt.ai/extractor/

Intellexer http://demo.intellexer.com/

Repustate https://repustate.com/named-entity-recognition-api-demo

AYLIEN https://developer.aylien.com/text-api-demo

Dandelion API https://dandelion.eu/semantic-text/entity-extraction-demo

displaCy https://explosion.ai/demos/displacy-ent

ParallelDots https://www.paralleldots.com/named-entity-recognition

TextRazor https://www.textrazor.com/named_entity_recognition

2.3 NER 评估指标

  • NER 系统通常通过将其输出与人类注释进行比较来评估。比较可以通过精确匹配或宽松匹配来量化。
2.3.1 精确匹配评估 Exact-match Evaluation
  • NER 本质上涉及两个子任务:边界检测和类型识别。在“精确匹配评估”[11]、[41]、[42] 中,正确识别的实例需要系统同时正确识别其边界和类型。更具体地说,假阳性 (FP)、假阴性 (FN) 和真阳性 (TP) 的数量用于计算 Precision、Recall 和 F-score。

  • False Positive (FP):由NER 系统返回但未出现在基本事实中的实体。

  • False Negative (FN):不是由NER 系统返回但出现在基本事实中的实体。

  • True Positive (TP):由NER 系统返回并且也出现在基本事实中的实体。

  • 精度是指正确识别的系统结果的百分比。召回率是指系统正确识别的实体总数的百分比。

  • 结合精度和召回率的测量方法是精度和召回率的调和平均值,即传统的Fmeasure或平衡F-score。

  • 此外,宏观平均 F-score 和微观平均 F-score 都考虑了跨多个实体类型的性能。 Macro-averaged F-score 独立计算不同实体类型的F-score,然后取F-scores的平均值。微平均 F 分数总结了所有实体类型中的个别漏报、漏报和真报,然后应用它们来获得统计数据。后者可能会受到语料库中大类实体识别质量的严重影响。

2.3.2 Relaxed-match Evaluation
  • MUC-6 [10]定义了一个relaxed-match evaluation:如果一个实体被分配了正确的类型,无论其边界如何,只要与ground truth边界有重叠,就被认为是正确的类型;无论实体的类型分配如何,都会相信正确的边界。然后 ACE [12] 提出了一个更复杂的评估程序。它解决了部分匹配和错误类型等问题,并考虑了命名实体的子类型。然而,这是有问题的,因为只有当参数固定时,最终分数才具有可比性 [1]、[22]、[23]。复杂的评估方法不直观,并且使错误分析变得困难。因此,复杂的评估方法在最近的研究中并未广泛使用。

2.4 传统的 NER 方法

  • 传统的 NER 方法大致分为三个主要流派:基于规则的、无监督的学习和基于特征的监督学习方法 [1]、[26]。
2.4.1 基于规则的方法Rule-based Approaches
  • 基于规则的 NER 系统依赖于手工制定的规则。可以根据特定领域的地名词典 [9]、[43] 和句法-词汇模式 [44] 来设计规则。 Kim [45] 提出使用 Brill 规则推理方法进行语音输入。该系统根据 Brill 的词性标注器自动生成规则。在生物医学领域,Hanisch 等人。 [46] 提出了 ProMiner,它利用预处理的同义词词典来识别生物医学文本中的蛋白质提及和潜在基因。金巴亚等人。 [47] 提出了一种基于字典的电子健康记录 NER 方法。实验结果表明,该方法提高了召回率,同时对精度的影响有限。
  • 其他一些著名的基于规则的 NER 系统包括 LaSIE-II [48]、NetOwl [49]、Facile [50]、SAR [51]、FASTUS [52] 和 LTG [53] 系统。这些系统主要基于手工制作的语义和句法规则来识别实体。当词典详尽无遗时,基于规则的系统运行良好。由于特定领域的规则和不完整的词典,从此类系统中经常观察到高精度和低召回率,并且系统无法转移到其他领域。
2.4.2 无监督学习方法 Unsupervised Learning Approaches
  • 无监督学习的典型方法是聚类[1]。基于聚类的 NER 系统根据上下文相似性从聚类组中提取命名实体。关键思想是在大型语料库上计算的词汇资源、词汇模式和统计数据可用于推断命名实体的提及。柯林斯等人。 [54] 观察到使用未标记数据将监督要求减少到仅 7 个简单的“种子”规则。然后,作者提出了两种用于命名实体分类的无监督算法。同样,KNOWITALL [9] 利用一组谓词名称作为输入,并从一小组通用提取模式引导其识别过程。
  • 纳多等人[55] 提出了一个用于地名词典构建和命名实体歧义解决的无监督系统。该系统结合了基于简单而高效的启发式方法的实体提取和消歧。此外,Zhang 和 Elhadad [44] 提出了一种从生物医学文本中提取命名实体的无监督方法。他们的模型没有监督,而是求助于术语、语料库统计(例如,逆文档频率和上下文向量)和浅层句法知识(例如,名词短语分块)。对两个主流生物医学数据集的实验证明了其无监督方法的有效性和通用性。
2.4.3 基于特征的监督学习方法 Feature-based Supervised Learning Approaches
  • 应用监督学习,NER 被用于多类分类或序列标记任务。给定带注释的数据样本,精心设计特征以表示每个训练示例。然后利用机器学习算法来学习模型,以从看不见的数据中识别相似的模式。
  • 特征工程在受监督的 NER 系统中至关重要。特征向量表示是对文本的一种抽象,其中一个词由一个或多个布尔值、数字或标称值 [1]、[56] 表示。词级特征(例如,格、形态和词性标记)[57]-[59],列表查找特征(例如,维基百科地名词典和 DBpedia 地名词典)[60]-[63],以及文档和语料库特征(例如,局部语法和多次出现)[64]-[67] 已广泛用于各种监督 NER 系统。 [1]、[28]、[68] 中讨论了更多的特征设计。基于这些特征,许多机器学习算法已应用于有监督的 NER,包括隐马尔可夫模型 (HMM) [69]、决策树 [70] 、最大熵模型 [71]、支持向量机 (SVM) [72] 和条件随机场 (CRF) [73]。比克尔等。 [74]、[75] 提出了第一个基于 HMM 的 NER 系统,名为 IdentiFinder,用于识别和分类名称、日期、时间表达式和数值量。此外,Szarvas 等人。 [76] 通过使用 C4.5 决策树和 AdaBoostM1 学习算法开发了多语言 NER 系统。一个主要优点是它提供了一个机会,可以通过不同的特征子集训练几个独立的决策树分类器,然后通过多数表决方案组合它们的决策。博思威克等人。 [77]通过应用最大熵理论提出了“最大熵命名实体”(MENE)。 MENE 能够利用极其多样化的知识来源来做出标记决策。其他使用最大熵的系统可以在 [78]-[80] 中找到。
  • McNamee 和 Mayfield [81] 使用 1000 个与语言相关的特征和 258 个正字法和标点符号特征来训练 SVM 分类器。每个分类器对当前标记是否属于八个类别之一进行二元决策,即 B-(开始)、I-(内部)用于 PERSON、ORGANIZATION、LOCATION 和 MIS 标签。 SVM 在预测实体标签时不考虑“neighboring”词。 CRF 考虑了上下文。 McCallum 和 Li [82] 提出了 NER 中 CRF 的特征归纳方法。在 CoNLL03 上进行了实验,英语的 F 分数达到了 84.04%。 Krishnan 和 Manning [67] 提出了一种基于两个耦合 CRF 分类器的两阶段方法。第二个 CRF 使用从第一个 CRF 的输出中导出的潜在表示。我们注意到,基于 CRF 的 NER 已广泛应用于各个领域的文本,包括生物医学文本 [58]、[83]、推文 [84]、[85] 和化学文本 [86]。

3.NER 的深度学习技术

  • 近年来,基于 DL 的 NER 模型成为主导并取得了最先进的结果。与基于特征的方法相比,深度学习有利于自动发现隐藏的特征。接下来,我们先简单介绍一下什么是深度学习,以及为什么深度学习是为了NER。然后我们调查基于 DL 的 NER 方法。

3.1 为什么深度学习适用于 NER?

  • 深度学习是机器学习的一个领域,它由多个处理层组成,用于学习具有多个抽象级别的数据表示 [87]。典型的层是由前向传播和反向传播组成的人工神经网络。前**向传递计算来自前一层的输入的加权和,并将结果传递给非线性函数。向后传递是通过导数的链式法则计算目标函数相对于多层模块堆栈权重的梯度。**深度学习的关键优势在于表示学习的能力以及由向量表示和神经处理赋予的语义组合。这允许机器输入原始数据并自动发现分类或检测所需的潜在表示和处理 [87]。
  • 将深度学习技术应用于 NER 具有三个核心优势。
    • 首先,NER 受益于非线性变换,它生成从输入到输出的非线性映射。与线性模型(例如,对数线性 HMM 和线性链 CRF)相比,基于深度学习的模型能够通过非线性激活函数从数据中学习复杂而复杂的特征。
    • 其次,深度学习大大节省了设计 NER 特征的工作量。传统的基于特征的方法需要大量的工程技能和领域专业知识。另一方面,基于深度学习的模型可以有效地从原始数据中自动学习有用的表示和潜在因素。
    • 第三,深度神经 NER 模型可以通过梯度下降在端到端范式中进行训练。此属性使我们能够设计可能复杂的 NER 系统。
  • 为什么我们在本次调查中使用新的分类法?
    • 现有的分类法 [26]、[88] 基于字符级编码器、单词级编码器和标签解码器。我们认为“字级编码器”的描述是不准确的,因为在典型的基于 DL 的 NER 模型中使用了两次字级信息:1) 字级表示用作原始特征,以及 2) 字级表示(与字符级表示一起)用于捕获标签解码的上下文依赖性。
    • 在本次调查中,我们总结了 NER 的最新进展以及图 2 中所示的通用架构。输入的分布式表示考虑了词级和字符级嵌入以及其他功能的结合,例如 POS 标签和地名词典,这些功能在功能上很有效基于的方法。上下文编码器是使用 CNN、RNN 或其他网络来捕获上下文依赖关系。标签解码器预测输入序列中标记的标签。例如,在图 2 中,每个标记都使用一个标记来预测,该标记由具有其类型的命名实体的 B-(开始)、I-(内部)、E-(结束)、S-(单例)或 O-(外部)的命名实体。请注意,还有其他标记方案或标记符号,例如 BIO。标签解码器也可以被训练来检测实体边界,然后将检测到的文本跨度分类为实体类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OhgO45iH-1678240468630)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307163236769.png)]

图2. 基于DL的NER的分类法。从输入序列到预测标签,一个基于DL的NER模型由输入、上下文编码器和标签解码器的分布式表示组成。

3.2 输入的分布式表示

  • 表示单词的一个直接选项是单热向量表示。在 one-hot 向量空间中,两个不同的词具有完全不同的表示并且是或正交的。分布式表示表示低维实值密集向量中的单词,其中每个维度表示一个潜在特征。从文本中自动学习,分布式表示捕获单词的语义和句法属性,这些属性不会明确出现在 NER 的输入中。接下来,我们回顾了 NER 模型中使用的三种分布式表示:词级、字符级和混合表示。
3.2.1 词级表示Word-Level Representation
  • 一些研究[89]-[91]采用了词级表示,通常通过无监督算法(例如连续词袋(CBOW)和连续skip-克模型 [92]。最近的研究 [88]、[93] 表明了这种预训练词嵌入的重要性。作为输入,预训练的词嵌入可以在 NER 模型训练期间固定或进一步微调。常用的词嵌入包括 Google Word2Vec、Stanford GloVe、Facebook fastText 和 SENNA。
  • 姚等 [94] 提出了 Bio-NER,一种基于深度神经网络架构的生物医学 NER 模型。 Bio-NER 中的单词表示是使用 skip-gram 模型在 PubMed 数据库上训练的。该词典包含 600 维向量中的 205,924 个单词。阮等 [89] 使用 word2vec 工具包从 Gigaword 语料库中学习英语的词嵌入,并使用来自 BOLT(广泛的操作语言技术)的新闻组数据进行扩充。翟等。 [95] 设计了一个用于序列分块的神经模型,它由两个子任务组成:分割和标记。可以为神经模型提供 SENNA 嵌入或随机初始化的嵌入。
  • 郑等 [90] 使用单一模型联合提取实体和关系。这个端到端模型使用 word2vec takeit 在 NYT 语料库上学习的词嵌入。斯特鲁贝尔等。 [91] 提出了一种基于迭代扩张卷积神经网络(ID-CNN)的标记方案。他们模型中的查找表由通过 skip-n-gram 在 SENNA 语料库上训练的 100 维嵌入初始化。在他们提出的用于提取实体及其关系的神经模型中,Zhou 等人。 [96]使用了谷歌预训练的 300 维词向量。此外,GloVe [97]、[98] 和 fastText [99] 也广泛用于 NER 任务。
3.2.2 字符级表示 Character-level Representation
  • 多项研究 [100]、[101] 并入了从端到端神经模型中学习的基于字符的词表示,而不是仅将词级表示视为基本输入。已发现字符级表示对于利用显式子词级信息(例如前缀和后缀)很有用。字符级表示的另一个优点是它可以自然地处理词汇表之外的内容。因此,基于字符的模型能够推断出未见过的词的表示,并共享词素级规律性的信息。有两种广泛使用的用于提取字符级表示的体系结构:基于 CNN 和基于 RNN 的模型。图 3(a) 和 3(b) 说明了这两种架构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlAYlJRK-1678240468631)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172234100.png)]

  • 马等[97] 利用 CNN 提取单词的字符级表示。然后将字符表示向量与词嵌入连接起来,然后再送入 RNN 上下文编码器。同样,Li 等人 [98] 应用了一系列卷积层和高速公路层来生成单词的字符级表示。最终的词嵌入被送入双向递归网络。杨等 [102] 提出了一种用于 NER 的神经重新排序模型,其中在字符嵌入层之上使用具有固定窗口大小的卷积层。最近,彼得斯等人[103] 提出了 ELMo 词表示,它是在具有字符卷积的双层双向语言模型之上计算的。
  • 对于基于 RNN 的模型,长短期记忆(LSTM)和门控循环单元(GRU)是基本单元的两种典型选择。库鲁等人[100] 提出了 CharNER,一种用于与语言无关的 NER 的字符级标注器。CharNER 将句子视为字符序列,并利用 LSTM 提取字符级表示。它为每个字符而不是每个单词输出标签分布。然后从字符级标签中获取词级标签。他们的结果表明,以字符为主要表示优于单词作为基本输入单位。 Lample 等人[19] 利用双向 LSTM 提取单词的字符级表示。与[97] 类似,字符级表示与来自单词查找表的预训练单词级嵌入连接在一起。 Gridach [104] 研究了识别生物医学命名实体中的词嵌入和字符级表示。丽等人。 [105] 使用门控机制将字符级表示与词嵌入相结合。通过这种方式,Rei 的模型动态地决定使用多少来自字符或单词级组件的信息。 Tran 等人。 [101] 引入了一种具有堆栈残差 LSTM 和可训练偏差解码的神经 NER 模型,其中从词嵌入和字符级 RNN 中提取词特征。杨等。 [106] 开发了一个模型来以统一的方式处理跨语言和多任务联合训练。他们使用深度双向 GRU 从单词的字符序列中学习信息形态表示。然后将字符级表示和词嵌入连接起来以产生单词的最终表示。使用递归神经网络的语言建模的最新进展使得将语言建模为字符分布成为可能。 Akbik 等人的上下文字符串嵌入。 [107],使用字符级神经语言模型为句子上下文中的字符串生成上下文嵌入。一个重要的属性是嵌入由它们周围的文本上下文化,这意味着同一个词根据其上下文使用具有不同的嵌入。图 4 说明了在句子上下文中提取单词“Washington”的上下文字符串嵌入的架构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qu336fCK-1678240468631)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172244703.png)]

图 4. 在句子上下文中提取单词“华盛顿”的上下文字符串嵌入 [107]。从前向语言模型(以红色显示)中,模型提取单词中最后一个字符后的输出隐藏状态。从后向语言模型(以蓝色显示)中,该模型提取单词中第一个字符之前的输出隐藏状态。两个输出隐藏状态连接起来形成一个词的最终嵌入。

3.2.3 Hybrid Representation
  • 除了词级和字符级表示,一些研究还结合了额外的信息(例如地名词典[18]、[108]、词汇相似性[109]、语言依赖性[110]和视觉特征[111] ]) 在进入上下文编码层之前进入单词的最终表示。换句话说,基于 DL 的表示以混合方式与基于特征的方法相结合。添加额外的信息可能会导致 NER 性能的提高,但代价是会损害这些系统的通用性。
  • [17] 率先将神经模型用于 NER,其中提出了一种基于词序列的时间卷积神经网络的架构。当结合共同的先验知识(例如,地名词典和 POS)时,生成的系统优于仅使用词级表示的基线。在 Huang 等人的 BiLSTM-CRF 模型中。 [18],四种类型的特征用于 NER 任务:拼写特征、上下文特征、词嵌入和地名词典特征。他们的实验结果表明,额外的特征(即地名词典)提高了标注的准确性。 Chiu 和 Nichols [20] 的 BiLSTM-CNN 模型结合了双向 LSTM 和字符级 CNN。除了词嵌入之外,该模型还使用了额外的词级特征(大写、词典)和字符级特征(表示字符类型的 4 维向量:大写、小写、标点符号等)。
  • 魏等 [112] 提出了一种基于 CRF 的神经系统,用于识别和规范化疾病名称。除了词嵌入之外,该系统还采用了丰富的特征,包括词、词性标签、分块和词形特征(例如,字典和词法特征)。斯特鲁贝尔等。 [91] 将 100 维嵌入与 5 维词形向量(例如,全部大写、未大写、首字母大写或包含大写字母)连接起来。林等。 [113] 连接字符级表示、词级表示和句法词表示(即词性标签、依赖角色、词位置、中心位置)以形成综合词表示。 Aguilar 等人提出了 NER 的多任务方法。 [114]。这种方法利用 CNN 在字符级别捕获正字法特征和词形。对于词级的句法和上下文信息,例如 POS 和词嵌入,该模型实现了 LSTM 架构。 Jansson 和 Liu [115] 提出将 Latent Dirichlet Allocation (LDA) 与字符级和单词级嵌入的深度学习相结合。
  • 许等 [116] 提出了一种基于固定大小的顺序遗忘编码 (FOFE) [117] 的 NER 局部检测方法,FOFE 探索了每个片段及其上下文的字符级和单词级表示。在 Moon 等人的多模式 NER 系统中。 [118],对于推文和 Snapchat 字幕等嘈杂的用户生成数据,词嵌入、字符嵌入和视觉特征与模态注意力相结合。 Ghaddar 和 Langlais [109] 发现,词汇特征在神经 NER 系统中大部分被丢弃是不公平的。他们提出了一种替代的词汇表示,它是离线训练的,可以添加到任何神经 NER 系统中。使用 120 维向量为每个单词计算词汇表示,其中每个元素编码单词与实体类型的相似性。最近,De vlin 等人。 [119] 提出了一种新的语言表示模型,称为 BERT,来自 transformers 的双向编码器表示。 BERT 使用掩码语言模型来启用预训练的深度双向表示。对于给定的标记,其输入表示由相应位置、段和标记嵌入的总和组成。请注意,预训练语言模型嵌入通常需要大规模语料库进行训练,并且本质上包含辅助嵌入(例如,位置和片段嵌入)。出于这个原因,我们在本次调查中将这些语境化语言模型嵌入归类为混合表示.

3.3 上下文编码器架构

  • 在这里,我们现在回顾一下广泛使用的上下文编码器架构:卷积神经网络、递归神经网络、递归神经网络和深度变换器
3.3.1 卷积神经网络
  • Collobert 等人[17] 提出了一种句子方法网络,其中一个词被标记为考虑整个句子,如图 5 所示。输入序列中的每个词在输入表示阶段之后被嵌入到一个 N 维向量中。然后使用一个卷积层来产生每个单词周围的局部特征,卷积层输出的大小取决于句子中单词的数量。全局特征向量是通过组合卷积层提取的局部特征向量构建的。全局特征向量的维度是固定的,与句子长度无关,以便应用后续的标准仿射层。

  • 两种方法广泛用于提取全局特征:

    • 对句子中的位置(即“时间”步长)进行最大或平均操作。
  • 最后,这些固定大小的全局特征被输入到标签解码器中,以计算网络输入中单词所有可能标签的分布分数。在 Collobert 的工作之后,Yao 等人。 [94] 提出了用于生物医学 NER 的 Bio-NER。吴等。 [120]利用卷积层生成由多个全局隐藏节点表示的全局特征。然后将局部特征和全局特征都输入到标准仿射网络中,以识别临床文本中的命名实体。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTJ15COT-1678240468632)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172521532.png)]

图5. 基于CNN的句子方法网络[17]。卷积层从整个句子中提取特征,将其视为一个具有全局结构的序列。

  • 周等[96] 观察到,使用 RNN,后面的词比前面的词对最终句子表示的影响更大。然而,重要的词可能出现在句子的任何地方。在他们提出的名为 BLSTM RE 的模型中,BLSTM 用于捕获长期依赖关系并获得输入序列的整体表示。然后利用 CNN 学习高级表示,然后将其输入到 S 型分类器中。最后,整个句子表示(由 BLSTM 生成)和关系表示(由 sigmoid 分类器生成)被输入另一个 LSTM 以预测实体。
  • 传统上,对于长度为 N 的序列,LSTM 的时间复杂度在并行方式下为 O(N )。斯特鲁贝尔等。 [91] 提出了 ID-CNN,称为迭代扩张卷积神经网络,由于能够处理更大的上下文和结构化预测,因此计算效率更高。图 6 显示了扩张 CNN 块的架构,其中四个堆叠的宽度为 3 的扩张卷积产生标记表示。实验结果表明,与 Bi-LSTM-CRF 相比,ID-CNN 实现了 14-20 倍的测试时间加速,同时保持了相当的准确性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5aC1xNBR-1678240468632)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307165302687.png)]

3.3.2 递归神经网络Recurrent Neural Networks
  • 递归神经网络及其变体,如门控递归单元(GRU)和长短期记忆(LSTM),在序列数据建模方面取得了显著成就。特别是,双向 RNN 在特定时间范围内有效地利用过去信息(通过前向状态)和未来信息(通过后向状态)[18]。因此,由双向 RNN 编码的标记将包含来自整个输入句子的证据。因此,双向 RNN 成为构成深度上下文相关文本表示的事实上的标准 [91]、[97]。基于 RNN 的上下文编码器的典型架构如图 7 所示。
  • Huang 等人的工作。 [18] 是最早使用双向 LSTM CRF 架构来对标记任务(POS、分块和 NER)进行排序的人之一。在 [18] 之后,一系列作品 [19]、[20]、[89]、[90]、[95]–[97]、[101]、[105]、[112]、[113] 应用了 BiLSTM作为编码序列上下文信息的基本架构。杨等。 [106] 在字符和单词级别上使用深度 GRU 来编码形态和上下文信息。他们通过共享架构和参数进一步将模型扩展到跨语言和多任务联合训练。
  • 格雷戈里克等[121] 在同一输入中使用了多个独立的双向 LSTM 单元。他们的模型通过使用模型间正则化项来促进 LSTM 单元之间的多样性。通过将计算分布在多个较小的 LSTM 上,他们发现参数总数有所减少。最近,一些研究 [122]、[123] 设计了基于 LSTM 的神经网络用于嵌套命名实体识别。 Katiyar 和 Cardie [122] 提出了对基于 LSTM 的标准序列标记模型的修改,以处理嵌套命名实体识别。朱等人。 [123] 提出了一种神经模型,通过动态堆叠平坦的 NER 层来识别嵌套实体,直到没有外部实体被提取出来。每个平面 NER 层都使用双向 LSTM 来捕获顺序上下文。该模型将 LSTM 层的输出合并到当前平面 NER 层中,为检测到的实体构建新的表示,然后将它们馈送到下一个平面 NER 层。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OBKxKGG9-1678240468633)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307165610965.png)]

3.3.3 Recursive Neural Networks
  • 递归神经网络是非线性自适应模型,能够通过按拓扑顺序遍历给定结构来学习深度结构化信息。命名实体与语言成分高度相关,例如名词短语[98]。然而,典型的顺序标记方法很少考虑句子的短语结构。为此,李等人。 [98] 提出对 NER 选区结构中的每个节点进行分类。该模型递归地计算每个节点的隐藏状态向量,并通过这些隐藏向量对每个节点进行分类。图 8 显示了如何为每个节点递归计算两个隐藏状态特征。自下而上的方向计算每个节点子树的语义组成,自上而下的方向将包含子树的语言结构传播到该节点。给定每个节点的隐藏向量,网络计算实体类型和特殊非实体类型的概率分布。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8Rgs0Rx-1678240468634)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172721745.png)]

图 8. NER 的双向递归神经网络 [98]。计算在两个方向上递归完成。自下而上的方向计算每个节点子树的语义组成,自上而下的方向将包含子树的语言结构传播到该节点。

3.3.4 Neural Language Models
  • 语言模型是描述序列生成的一系列模型。给定一个标记序列 ( t 1 , t 2 , . . . , t N ) (t_1, t_2, . . . , t_N ) (t1,t2,...,tN),前向语言模型通过对给定历史记录的标记 t k t_k tk 的概率建模来计算序列的概率 $(t_1, . . . , t_{k−1}) [21 ]:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bq9ZPj1x-1678240468635)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307165808729.png)]
  • 后向语言模型与前向语言模型类似,只是它以相反的顺序运行序列,根据其未来的上下文预测前一个标记。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o0D9kuAf-1678240468635)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307165829873.png)]

  • 对于神经语言模型,token t k t_k tk 的概率可以通过递归神经网络的输出来计算。在每个位置 k,我们可以获得两个上下文相关的表示(前向和后向),然后将它们组合起来作为标记 tk 的最终语言模型嵌入。这种语言模型增强知识已被经验证明有助于许多序列标记任务 [21]、[103]、[124]-[127]。
  • Rei [124] 提出了一个具有次要目标的框架——学习为数据集中的每个单词预测周围的单词。图 9 用关于 NER 任务的简短句子说明了架构。在每个时间步长(即令牌位置),网络都经过优化以预测序列中的前一个令牌、当前标签和下一个令牌。添加的语言建模目标鼓励系统学习更丰富的特征表示,然后将其重新用于序列标记。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eL86qVyh-1678240468636)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172755203.png)]

图 9. 带有附加语言建模目标的序列标记模型 [124],对句子“Fischler proposes measures”执行 NER。在每个标记位置(例如,“proposes”),网络被优化以预测序列中的前一个词(“Fischler”)、当前标签(“O”)和下一个词(“measures”)。

  • 彼得斯等人[21] 提出了 TagLM,一种语言模型增强序列标注器。该标注器为序列标记任务的输入序列中的每个标记考虑预训练词嵌入和双向语言模型嵌入。图 10 显示了 LM-LSTM-CRF 模型的架构 [125]、[126]。语言模型和序列标注模型以多任务学习的方式共享同一个字符级层。来自字符级嵌入、预训练词嵌入和语言模型表示的向量被连接起来并输入到词级 LSTM 中。实验结果表明,多任务学习是引导语言模型学习任务特定知识的有效方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-waQia8m9-1678240468636)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172824779.png)]

图 10. 具有上下文表示的序列标记架构 [125]。来自双向语言模型的字符级表示、预训练词嵌入和上下文表示被连接起来,并进一步输入到上下文编码器中。

  • 图 4 显示了 Akbik 等人使用神经字符级语言建模的上下文字符串嵌入。 [107]。他们利用前向后向循环神经网络的隐藏状态来创建上下文化的词嵌入。该模型的一个主要优点是字符级语言模型独立于 to kenization 和固定词汇表。彼得斯等人。 [103] 提出了 ELMo 表示,它是在具有字符卷积的双层双向语言模型之上计算的。这种新型的深度语境化单词表示能够对单词使用的复杂特征(例如,语义和句法)和跨语言上下文的使用变化(例如,多义词)进行建模。
3.3.5 Deep Transformer
  • 神经序列标记模型通常基于由编码器和解码器组成的复杂卷积或循环网络。 Transformer,由 Vaswani 等人提出。 [128],完全免除了递归和卷积。 Transformer 利用堆叠式自注意力和逐点全连接层来构建编码器和解码器的基本块。各种任务的实验 [128]-[130] 表明变形金刚在质量上更胜一筹,同时需要显着更少的训练时间。
  • 基于transformer,Radford 等人 [131] 提出了用于语言理解任务的生成式预训练转换器(GPT)。 **GPT 有一个两阶段的训练过程。首先,他们在未标记的数据上使用带有 Transformer 的语言建模目标来学习初始参数。然后,他们使用监督目标将这些参数调整为目标任务,从而使预训练模型的变化最小。**与 GPT(一种从左到右的架构)不同,提出了来自变压器的双向编码器表示(BERT),通过对所有层中的左右上下文进行联合调节来预训练深度双向变压器 [119]。图 11 总结了 BERT [119]、GPT [131] 和 ELMo [103]。此外,Baevski 等人。 [132] 提出了一种基于双向 Transformer 的新型完形填空驱动预训练机制,该机制采用完形填空式目标进行训练,并在给定所有左右上下文的情况下预测中心词。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y7HPX7xt-1678240468637)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307172922521.png)]

图 11. 预训练模型架构的差异 [119]。 Google BERT 使用双向 Transformer(缩写为“Trm”)。 OpenAI GPT 使用从左到右的 Transformer。 AllenNLP ELMo 使用独立训练的从左到右和从右到左 LSTM 的串联来为下游任务生成特征。

  • 这些使用 Transformer 预训练的语言模型嵌入正在成为 NER 的新范式。首先,这些嵌入是上下文相关的,可以用来替代传统的嵌入,例如 Google Word2vec 和 Stanford GloVe。一些研究 [108]、[110]、[133]-[136] 通过利用传统嵌入和语言模型嵌入的组合取得了可喜的性能。其次,这些语言模型嵌入可以通过一个额外的输出层进一步微调,以用于包括 NER 和分块在内的广泛任务。特别是,李等人。 [137]、[138] 将 NER 任务定义为机器阅读理解 (MRC) 问题,可以通过微调 BERT 模型来解决。

3.4 标签解码器架构

  • 标签解码器是 NER 模型的最后阶段。它以上下文相关的表示作为输入,并生成与输入序列相对应的标签序列。图 12 总结了标签解码器的四种架构:MLP + softmax 层、条件随机场 (CRF)、递归神经网络和指针网络。
3.4.1 多层感知器 + Softmax
  • NER 通常被表述为序列标记问题。以多层感知器+Softmax层作为标签解码层,将序列标注任务转化为多类分类问题。每个词的标签都是根据上下文相关的表示独立预测的,而不考虑它的邻居。
  • 早期介绍的许多 NER 模型 [91]、[98]、[116]、[119]、[139] 使用 MLP + Softmax 作为标签解码器。作为特定领域的 NER 任务,Tomori 等人。 [140] 使用 softmax 作为标签解码器来预测日本象棋游戏中的游戏状态。他们的模型同时接受文本输入和棋盘输入(9 × 9 的正方形,有 40 块 14 种不同类型的棋子)并预测特定于该游戏的 21 个命名实体。文本表示和游戏状态嵌入都被馈送到 softmax 层,以使用 BIO 标签方案预测命名实体。
3.4.2 条件随机场
  • 条件随机场(CRF)是一个以观测序列为全局条件的随机场[73]。 CRF 已广泛用于基于特征的监督学习方法(参见第 2.4.3 节)。许多基于深度学习的 NER 模型使用 CRF 层作为标签解码器,例如,在双向 LSTM 层 [18]、[90]、[103]、[141] 和 CNN 层 [17] 之上, [91], [94]。如表 3 所示,CRF 是标签解码器最常见的选择,[107] 使用 CRF 标签解码器实现了 CoNLL03 和 OntoNotes5.0 上的最先进性能。
  • 然而,CRFs 不能充分利用段级信息,因为段的内部属性不能用词级表示完全编码。卓等。 [142] 然后提出了门控递归半马尔可夫 CRF,它直接对段而不是单词进行建模,并通过门控递归卷积神经网络自动提取段级特征。最近,Ye 和 Ling [143] 提出了用于神经序列标记的混合半马尔可夫 CRF。该方法采用段而不是词作为特征提取和转换建模的基本单位。词级标签用于推导片段分数。因此,这种方法能够利用词级和段级信息来计算段分数。
3.4.3 递归神经网络
  • 一些研究[88]-[90]、[96]、[144]探索了RNN来解码标签。沉等。 [88] 报告说,RNN 标签解码器优于 CRF,并且在实体类型数量较多时训练速度更快。图 12© 说明了基于 RNN 的标签解码器的工作流程,它作为一种语言模型来贪婪地生成标签序列。第一步的 [GO] 符号作为 y 1 y_1 y1 提供给 RNN 解码器。随后,在每个时间步 i i i,RNN 解码器根据前一步标签 y i y_i yi 、前一步解码器隐藏状态 h i D e c h^{Dec}_i hiDec 和当前步编码器隐藏状态 h i + 1 D e c h^{Dec}_{i+1} hi+1Dec 计算当前解码器隐藏状态 h i + 1 D e c h^{Dec}_{i+1} hi+1Dec ;当前输出标签 y i + 1 y_{i+1} yi+1 通过使用 softmax 损失函数进行解码,并进一步作为输入馈送到下一个时间步。最后,我们获得了所有时间步长的标签序列。
3.4.4 指针网络
  • 指针网络应用 RNN 来学习输出序列的条件概率,其中元素是与输入序列中的位置相对应的离散标记 [145]、[146]。它通过使用 softmax 概率分布作为“指针”来表示可变长度字典。翟等。 [95]首先应用指针网络来产生序列标签。如图 12(d) 所示,指针网络首先识别一个块(或一个段),然后对其进行标记。重复此操作,直到处理完输入序列中的所有单词。在图 12(d) 中,给定起始标记“ ”,片段“Michael Jeffery Jordan”首先被识别,然后标记为“PERSON”。分割和标记可以由指针网络中的两个独立神经网络完成。接下来,将“Michael Jeffery Jordan”作为输入并送入指针网络。结果,段“was”被识别并标记为“O”。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8Drhyke-1678240468638)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307173009385.png)]

3.5 基于DL的NER架构总结

架构总结
  • 表 3 通过架构选择总结了最近关于神经 NER 的工作。 BiLSTM-CRF 是使用深度学习的 NER 最常见的架构。以完形填空式方式预训练双向 Transformer 模型的方法 [132] 在 CoNLL03 上实现了最先进的性能 (93.5%)。 BERT 和骰子损失 [138] 的工作在 OntoNotes5.0 上实现了最先进的性能 (92.07%)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqBMqvj7-1678240468639)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307171640616.png)]

  • NER 系统的成功在很大程度上依赖于它的输入表示。集成或微调预训练语言模型嵌入正在成为神经 NER 的新范例。当利用这些语言模型嵌入时,性能有显着提高 [103]、[107]、[108]、[132]-[138]。表 3 的最后一列列出了几个基准数据集的 F 分数报告的性能。虽然在正式文档(例如 CoNLL03 和 OntoNotes5.0)上报告了高 F 分数,但在噪声数据(例如 W-NUT17)上的 NER 仍然具有挑战性。
架构比较Architecture Comparison
  • 我们从三个角度讨论优缺点:输入、编码器和解码器。首先,关于外部知识是否应该或如何集成到基于 DL 的 NER 模型中,尚未达成共识。一些研究 [108]、[110]、[133]、[142] 表明,NER 性能可以通过外部知识得到提升。然而,缺点也很明显:1)获取外部知识是劳动密集型的(例如,地名词典)或计算量大(例如,依赖); 2) 整合外部知识会对端到端学习产生不利影响,并损害基于深度学习的系统的通用性。
  • 其次,当 Transformer 在大型语料库上进行预训练时,Transformer 编码器比 LSTM 更有效。如果 Transformer 未经过预训练且训练数据有限 [147]、[148],则它们无法完成 NER 任务。另一方面,当序列的长度 n 小于表示的维数 d(复杂性:自注意力 O ( n 2 ⋅ d ) 和递归 O ( n ⋅ d 2 ) ) O(n^2·d) 和递归 O(n·d^2)) O(n2d)和递归O(nd2)时,Transformer 编码器比递归层更快 [128 ].
  • 第三,RNN 和 Pointer Net work 解码器的一个主要缺点在于贪婪解码,这意味着当前步骤的输入需要上一步的输出。这种机制可能会对速度产生重大影响,并且是并行化的障碍。 CRF 是标签解码器最常见的选择。当采用非语言模型(即非上下文化)嵌入(如 Word2vec 和 GloVe)时,CRF 可以强大地捕获标签转换依赖性。然而,当实体类型的数量很大时,CRF 可能在计算上很昂贵。更重要的是,在采用 BERT 和 ELMo [137]、[139] 等语境化语言模型嵌入时,与 softmax 分类相比,CRF 并不总能带来更好的性能。
  • 对于最终用户而言,选择何种架构取决于数据和领域任务。如果数据丰富,可以考虑从头开始使用 RNN 训练模型并微调上下文语言模型。如果数据稀缺,采用传输策略可能是更好的选择。对于新闻专线领域,有许多预训练的现成模型可用。对于特定领域(例如,医学和社交媒体),使用特定领域数据微调通用上下文语言模型通常是一种有效的方法。
NER for Different Language不同语言的 NER
  • 在本次调查中,我们主要关注英语和一般领域的 NER。除了英语外,还有许多关于其他语言或跨语言设置的研究。吴等。 [120] 和王等人。 [149] 调查了中文临床文本中的 NER。 Zhang 和 Yang [150] 提出了一种用于中文 NER 的格子结构 LSTM 模型,该模型对一系列输入字符以及与词典匹配的所有潜在单词进行编码。除了中文,很多研究都是针对其他语言进行的。示例包括蒙古语 [151]、捷克语 [152]、阿拉伯语 [153]、乌尔都语 [154]、越南语 [155]、印度尼西亚语 [156] 和日语 [157]。每种语言都有自己的特点,可以帮助理解该语言的 NER 任务的基础知识。还有一些研究 [106]、[158]-[160] 旨在通过将知识从源语言转移到目标语言,很少或没有标签来解决跨语言环境中的 NER 问题。

4 NER 的应用深度

  • 学习第 3.2、3.3 和 3.4 节概述了 NER 的典型网络架构。在本节中,我们调查了最近为 NER 探索的应用深度学习技术。

4.1 NER 的深度多任务学习Deep Multi-task Learning for NER

  • 多任务学习[161]是一种一起学习一组相关任务的方法。通过考虑不同任务之间的关系,多任务学习算法有望获得比单独学习每个任务的算法更好的结果。科洛伯特等人。 [17] 训练了一个窗口/句子处理网络来联合执行 POS、Chunk、NER 和 SRL 任务。这种多任务机制让训练算法能够发现对所有感兴趣的任务都有用的内部表征。杨等。 [106] 提出了一个多任务联合模型,以学习语言特定的规律,联合训练 POS、Chunk 和 NER 任务。 Rei [124] 发现,通过在训练过程中包含无监督语言建模目标,序列标记模型实现了一致的性能改进。林等。 [160] 提出了一种用于低资源设置的多语言多任务架构,可以有效地迁移不同类型的知识以改进主模型。除了将 NER 与其他序列标记任务一起考虑之外,多任务学习框架还可以应用于实体和关系的联合提取 [90]、[96],或者将 NER 建模为两个相关的子任务:实体分割和实体类别预测 [114]、[162]。在生物医学领域,由于不同数据集的差异,每个数据集上的 NER 被视为多任务设置中的一个任务 [163],[164]。这里的一个主要假设是不同的数据集共享相同的字符级和单词级信息。然后应用多任务学习来更有效地利用数据并鼓励模型学习更通用的表示。
4.2 NER 的深度迁移学习Deep Transfer Learning for NER
  • 迁移学习旨在通过利用从源域中学到的知识在目标域上执行机器学习任务[165]。在 NLP 中,迁移学习也称为域适应。在 NER 任务上,传统方法是通过引导算法 [166]-[168]。最近,已经提出了一些方法 [127]、[169]-[173],用于使用深度神经网络的低资源和跨域 NER。潘等。 [169] 提出了一种用于跨域 NER 的传输联合嵌入(TJE)方法。 TJE 采用标签嵌入技术将多类分类转换为低维潜在空间中的回归。曲等。 [174] 观察到相关的命名实体类型通常共享词汇和上下文特征。他们的方法使用双层神经网络学习源命名实体类型和目标命名实体类型之间的相关性。他们的方法适用于源域与目标域具有相似(但不相同)命名实体类型的设置。 Peng 和 Dredze [162] 探索了多任务学习环境中的迁移学习,他们考虑了两个领域:新闻和社交媒体,用于两个任务:分词和 NER。在迁移学习的设置中,不同的神经模型通常在源任务和目标任务之间共享模型参数的不同部分。杨等。 [175] 首先研究了不同表示层的可迁移性。然后他们针对跨域、跨语言和跨应用场景提出了三种不同的参数共享架构。如果两个任务有可映射的标签集,则有一个共享的 CRF 层,否则,每个任务学习一个单独的 CRF 层。实验结果表明,在低资源条件下(即可用注释较少),各种数据集都有显着改进。 Pius 和 Mark [176] 扩展了 Yang 的方法,允许对非正式语料库(例如,WNUT 2017)进行联合训练,并结合句子级特征表示。他们的方法在 NER 的 WNUT 2017 共享任务中获得了第二名,获得了 40.78% 的 F1 分数。赵等。 [177] 提出了一个具有域自适应的多任务模型,其中全连接层适应不同的数据集,CRF 特征分别计算。 Zhao 模型的一个主要优点是在数据选择过程中过滤掉了具有不同分布和未对齐注释指南的实例。与这些参数共享架构不同,Lee 等人。 [170] 通过在源任务上训练模型并在目标任务上使用经过训练的模型进行微调,在 NER 中应用迁移学习。最近,Lin 和 Lu [171] 还通过引入三个神经适应层提出了一种 NER 微调方法:词适应层、句子适应层和输出适应层。 Beryozkin 等人。 [178] 提出了一种用于异构标签集 NER 设置的标签层次模型,其中在推理过程中使用层次结构将细粒度标签映射到目标标签集。此外,一些研究 [164]、[179]、[180] 探索了生物医学 NER 中的迁移学习,以减少所需标记数据的数量。

4.3 NER 的深度主动学习

  • 主动学习背后的关键思想是,如果允许机器学习算法选择其学习的数据[181],则机器学习算法可以用更少的训练数据表现得更好。
  • 深度学习通常需要大量的训练数据,而获取这些数据的成本很高。因此,将深度学习与主动学习相结合有望减少数据注释工作。主动学习训练分多轮进行。然而,传统的主动学习方案对于深度学习来说代价高昂,因为在每一轮之后,它们都需要使用新标注的样本对分类器进行完全再训练。因为从头开始再训练对于深度学习是不切实际的,Shen 等人。 [88] 提出用每批新标签对 NER 进行增量训练。他们将新标注的样本与现有样本混合,并在少量时期更新神经网络权重,然后在新一轮中查询标签。具体来说,在每一轮开始时,主动学习算法根据预定义的预算选择要注释的句子。在接收到选择的注释后,通过在增强数据集上进行训练来更新模型参数。主动学习算法在选择要注释的句子时采用不确定性抽样策略[182]。实验结果表明,主动学习算法仅使用英语数据集上 24.9% 的训练数据和中文数据集上的 30.1% 的训练数据,就可以实现全数据训练的最佳深度学习模型 99% 的性能。此外,12.0% 和 16.9% 的训练数据足以让深度主动学习模型优于在完整训练数据上学习的浅层模型 [183]。

4.4 NER 的深度强化学习

  • 强化学习(RL)是受行为主义心理学启发的机器学习的一个分支,它关注软件代理如何在环境中采取行动以最大化一些累积奖励[184],[185]。这个想法是,代理人将通过与环境交互并从执行动作中获得奖励来从环境中学习。具体来说,RL 问题可以表述如下 [186]:环境被建模为具有输入(来自代理的动作)和输出(对代理的观察和奖励)的随机有限状态机。它由三个关键组成部分组成:(i) 状态转换函数,(ii) 观察(即输出)函数,以及 (iii) 奖励函数。该代理也被建模为具有输入(来自环境的观察/奖励)和输出(对环境的动作)的随机有限状态机。它由两个部分组成:(i) 状态转换函数,以及 (ii) 策略/输出函数。代理的最终目标是通过尝试最大化累积奖励来学习良好的状态更新函数和策略。
  • Narasimhan 等人[187] 将信息提取任务建模为马尔可夫决策过程 (MDP),该过程动态结合实体预测并提供从一组自动生成的备选方案中选择下一个搜索查询的灵活性。该过程包括发出搜索查询、从新来源提取以及对提取值进行核对,并且重复该过程直到获得足够的证据。为了为代理学习好的策略,他们利用深度 Q 网络 [188] 作为函数逼近器,其中使用深度神经网络来逼近状态-动作值函数(即 Q 函数)。最近,杨等人。 [189]利用远程监督生成的数据在新领域进行新型命名实体识别。 instance selector基于强化学习,从NE tagger获得反馈奖励,旨在选择积极的句子来减少噪声标注的影响。

4.5 NER 的深度对抗学习

  • 对抗学习 [190] 是在对抗样本上显式训练模型的过程。目的是使模型对攻击更具鲁棒性或减少其对干净输入的测试错误。对抗网络学习通过 2 人游戏从训练分布中生成:一个网络生成候选者(生成网络),另一个评估它们(判别网络)。通常,生成网络学习从潜在空间映射到感兴趣的特定数据分布,而鉴别原生网络区分生成器生成的候选对象和来自真实世界数据分布的实例 [191]。对于 NER,对抗样本通常以两种方式产生。一些研究 [192]-[194] 将源域中的实例视为目标域的对抗性示例,反之亦然。例如,李等人。 [193] 和曹等人。 [194] 都结合了来自其他领域的对抗性示例,以鼓励跨领域 NER 的领域不变特征。另一种选择是通过添加带有扰动的原始样本来准备对抗样本。例如,[195] 中提出的双重对抗传输网络(DATNet)旨在解决低资源 NER 问题。对抗样本是通过添加原始样本和以小范数 ǫ 为界的扰动来最大化损失函数,如下所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R0nTP5Ns-1678240468639)(/Users/duanyuqing/Library/Application Support/typora-user-images/image-20230307171408177.png)]
  • 当前模型参数集,ε 可以在验证集上确定。一个对抗样本由 x a d v = x + η x x_{adv} = x + η_x xadv=x+ηx 构造。分类器在原始示例和对抗示例的混合上进行训练,以提高泛化能力。

4.6 NER 的神经注意

  • 注意机制大致基于人类 [196] 中发现的视觉注意机制。例如,人们通常以“高分辨率”关注图像的某个区域,而以“低分辨率”感知周围区域。神经注意机制使神经网络能够专注于其输入的一个子集。通过应用注意力机制,NER 模型可以捕获输入中信息量最大的元素。特别是,第 3.3.5 节中回顾的 Transformer 架构完全依赖注意力机制来绘制输入和输出之间的全局依赖关系。在 NER 任务中应用注意力机制还有很多其他方法。丽等人。 [105] 应用注意力机制来动态决定在端到端 NER 模型中从字符级或单词级组件使用多少信息。 Zukov-Gregoric 等人。 [197] 探索了 NER 中的自注意力机制,其中权重取决于单个序列(而不是两个序列之间的关系)。许等。 [198] 提出了一种基于注意力的神经 NER 架构来利用文档级全局信息。特别是,文档级信息是从具有神经注意力的预训练双向语言模型表示的文档中获得的。Zhang 等人。 [199] 在推文中为 NER 使用自适应共同注意网络。这种自适应共同注意网络是一种使用共同注意过程的多模态模型。共同注意包括视觉注意和文本注意,以捕捉不同模态之间的语义交互。

5 挑战和未来方向

  • 在第 3.5 节中讨论,选择标签解码器的变化不如输入表示和上下文编码器的选择多。从 Google Word2vec 到最近的 BERT 模型,基于 DL 的 NER 显着受益于建模语言中预训练嵌入的进步。无需复杂的特征工程,我们现在有机会重新审视 NER 任务的挑战和潜在的未来方向。

5.1 挑战

数据注释Data Annotation
  • 受监督的 NER 系统,包括基于 DL 的 NER,在训练中需要大量带注释的数据。然而,数据注释仍然耗时且昂贵。对于许多资源匮乏的语言和特定领域来说,这是一个巨大的挑战,因为需要领域专家来执行注释任务。
  • 由于语言歧义,注释的质量和一致性都是主要问题。例如,同一个命名实体可能被标注为不同的类型。例如,句子“Baltimore de feated the Yankees”中的“Baltimore”在 MUC-7 中标记为 Location,在 CoNLL03 中标记为 Organization。 “Empire State”和“Empire State Building”在 CoNLL03 和 ACE 数据集中都被标记为 Location,导致实体边界混淆。由于数据注释的不一致,即使两个数据集中的文档来自同一域,在一个数据集上训练的模型也可能无法在另一个数据集上很好地工作。
  • 为了使数据注释更加复杂,Katiyar 和 Cardie [122] 报告说嵌套实体相当普遍:GENIA 语料库中 17% 的实体嵌入到另一个实体中;在 ACE 语料库中,30% 的句子包含嵌套实体。需要开发适用于嵌套实体和细粒度实体的通用注释方案,其中一个命名实体可以分配多种类型。
Informal Text and Unseen Entities
  • 如表 3 所示,在具有正式文档(例如,新闻文章)的数据集上报告了不错的结果。然而,在用户生成的文本(例如 WUT-17 数据集)上,最好的 F 分数略高于 40%。**由于简短和嘈杂,非正式文本(例如,推文、评论、用户论坛)的 NER 比正式文本更具挑战性。**许多用户生成的文本也是特定领域的。在许多应用场景中,NER 系统必须处理用户生成的文本,例如电子商务和银行业务中的客户支持。
  • 评估 NER 系统的稳健性和有效性的另一个有趣的维度是它在新出现的讨论的背景下识别不寻常的、以前看不见的实体的能力。 WUT-17 数据集 [200] 的这个研究方向存在一个共享任务 2。

5.2 未来方向

  • 随着建模语言的进步和实际应用的需求,我们预计 NER 会受到研究人员的更多关注。另一方面,NER 通常被视为下游应用程序的预处理组件。这意味着特定的 NER 任务由下游应用程序的要求定义,例如,命名实体的类型以及是否需要检测嵌套实体 [201]。基于本次调查的研究,我们列出了以下 NER 研究进一步探索的方向。
Fine-grained NER and Boundary Detection
  • 细粒度 NER 和边界检测。虽然许多现有研究 [19]、[97]、[109] 侧重于一般领域中的粗粒度 NER,但我们期望在特定领域中对细粒度 NER 进行更多研究以支持各种实际应用 [202]。细粒度 NER 的挑战是 NE 类型的显着增加以及允许命名实体具有多种 NE 类型所引入的复杂性。这需要重新访问常见的 NER 方法,其中同时检测实体边界和类型,例如,通过使用 B-I-E-S-(实体类型)和 O 作为解码标签。值得考虑将命名实体边界检测定义为在忽略 NE 类型的情况下检测 NE 边界的专用任务。边界检测和 NE 类型分类的解耦使得可以跨不同域共享的边界检测通用且稳健的解决方案,以及用于 NE 类型分类的专用域特定方法。正确的实体边界也有效地减轻了链接到知识库的实体中的错误传播。有一些研究 [95]、[203] 将实体边界检测视为 NER 中的中间步骤(即子任务)。据我们所知,没有现有的工作单独关注实体边界检测以提供强大的识别器。我们期待未来在这个研究方向上取得突破。
Joint NER and Entity Linking
  • 联合 NER 和实体链接。实体链接 (EL) [204],也称为命名实体规范化或消歧歧化,旨在为参考知识库的文本中提到的实体分配唯一身份,例如通用领域的维基百科和统一医学语言生物医学领域的系统(UMLS)。大多数现有作品将 NER 和 EL 作为管道设置中的两个独立任务单独解决。我们认为成功链接的实体所携带的语义(例如,通过知识库中的相关实体)得到了显着丰富 [66]、[205]。也就是说,链接实体有助于成功检测实体边界和正确分类实体类型。值得探索联合执行 NER 和 EL,甚至实体边界检测、实体类型分类和实体链接的方法,以便每个子任务受益于其他子任务的部分输出,并减轻管道设置中不可避免的错误传播。
DL-based NER on Informal Text with Auxiliary Resource.
  • 基于 DL 的带辅助资源的非正式文本 NER。如第 5.1 节所述,基于 DL 的 NER 在非正式文本或用户生成的内容上的性能仍然很低。这需要在这方面进行更多的研究。特别是,我们注意到 NER 的性能显着受益于辅助资源的可用性 [206]-[208],例如,用户语言中的位置名称字典。虽然表 3 没有提供涉及地名词典的有力证据,因为附加功能会导致一般领域的 NER 性能提高,但我们认为辅助资源通常是更好地理解用户生成内容所必需的。问题是如何在用户生成的内容或特定领域的文本上为 NER 任务获取匹配的辅助资源,以及如何将辅助资源有效地整合到基于 DL 的 NER 中。
Scalability of DL-based NER
  • 基于 DL 的 NER 的可扩展性。使神经 NER 模型更具可扩展性仍然是一个挑战。此外,当数据量增长时,仍然需要优化参数指数增长的解决方案 [209]。一些基于 DL 的 NER 模型以大量计算能力为代价取得了良好的性能。例如,ELMo 表示用 3 × 1024 维向量表示每个单词,并且该模型在 32 个 GPU 上训练了 5 周 [107]。 Google BERT 表示在 64 个云 TPU 上进行了训练。但是,如果最终用户无法访问强大的计算资源,则他们无法微调这些模型。开发平衡模型复杂性和可扩展性的方法将是一个有前途的方向。另一方面,模型压缩和剪枝技术也是减少模型学习所需空间和计算时间的选择。
Deep Transfer Learning for NER
  • NER 的深度迁移学习。许多以实体为中心的应用程序采用现成的 NER 系统来识别命名实体。然而,由于语言特征的差异以及注释的差异,在一个数据集上训练的模型可能不适用于其他文本。尽管有一些将深度迁移学习应用于 NER 的研究(参见第 4.2 节),但这个问题尚未得到充分探索。未来更多的努力应该致力于通过探索以下研究问题,将知识从一个领域有效地转移到另一个领域: (b) 在 NER 任务中探索零样本、单样本和少样本学习; © 提供解决域不匹配和跨域设置中标签不匹配的解决方案。
An Easy-to-use Toolkit for DL-based NER

用于基于 DL 的 NER 的易于使用的工具包。最近,Röder 等人。 [210] 开发了 GERBIL,它为研究人员、最终用户和开发人员提供了易于使用的界面,用于对实体注释工具进行基准测试,以确保可重复和可存档的实验。但是,它不涉及最近基于 DL 的技术。 Ott [211] 提出了 FAIRSEQ,这是一种用于序列建模的快速、可扩展的工具包,尤其适用于机器翻译和文本标记化。 Dernoncourt 等人。 [212] 实现了一个名为 NeuroNER 的框架,它只依赖于递归神经网络的一个变体。近年来,许多深度学习框架(例如 TensorFlow、PyTorch 和 Keras)旨在通过高级编程接口为设计、训练和验证深度神经网络提供构建块。 3 为了重新实现表 3 中的架构,开发人员可以使用现有的深度学习框架从头开始编写代码。我们 3. https://developer.nvidia.com/deep-learning-frameworks 设想一个易于使用的 NER 工具包可以指导开发人员使用一些标准化模块来完成它:数据处理、输入表示、上下文编码器、标签解码器和有效性度量。我们相信专家和非专家都可以从此类工具包中受益。

6 结论

  • 本次调查旨在回顾最近关于基于深度学习的 NER 解决方案的研究,以帮助新研究人员对该领域有一个全面的了解。我们在本次调查中包括了 NER 研究的背景、传统方法的简要介绍、当前的最新技术、挑战和未来的研究方向。
  • 首先,我们整合可用的 NER 资源,包括带标签的 NER 语料库和现成的 NER 系统,重点关注通用领域的 NER 和英语的 NER。我们以表格形式展示这些资源,并提供指向它们的链接以便于访问。
  • 其次,我们介绍了 NER 任务的定义、评估指标、NER 的传统方法以及深度学习中的基本概念等预备知识
  • 第三,我们回顾了基于不同深度学习模型的文献,并根据新的分类法对这些研究进行了映射。我们进一步调查了最近在新问题设置和应用中应用深度学习技术的最具代表性的方法。最后,我们总结了 NER 的应用,并向读者展示了 NER 面临的挑战和未来的发展方向。我们希望这项调查能够在设计基于 DL 的 NER 模型时提供一个很好的参考。

Pytorch Tutorial NER代码解析

import torch
import torch.autograd as autograd
import torch.nn as nn
import torch.optim as optim

torch.manual_seed(1)

def prepare_sequence(seq, to_ix):
    idxs = [to_ix[w] for w in seq]
    return torch.tensor(idxs, dtype=torch.long)

def argmax(vec):
	# 得到最大的值的索引
	_, idx = torch.max(vec, 1)
	return idx.item()

def log_sum_exp(vec):
	max_score = vec[0, argmax(vec)]  # max_score的维度为1
	max_score_broadcast = max_score.view(1, -1).expand(1, vec.size()[1])  # 维度为1*5
	return max_score + torch.log(torch.sum(torch.exp(vec - max_score_broadcast)))
	#等同于torch.log(torch.sum(torch.exp(vec))),防止e的指数导致计算机上溢

class BiLSTM_CRF(nn.Module):
	def __init__(self, vocab_size, tag_to_ix, embedding_dim, hidden_dim):
		super(BiLSTM_CRF, self).__init__()
		self.embedding_dim = embedding_dim
		self.hidden_dim = hidden_dim
		self.vocab_size = vocab_size
		self.tag_to_ix = tag_to_ix
		self.tagset_size = len(tag_to_ix)

		self.word_embeds = nn.Embedding(vocab_size, embedding_dim)
		self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2, num_layers=1, bidirectional=True)
		self.hidden2tag = nn.Linear(hidden_dim, self.tagset_size)
		# 转移矩阵,transitions[i][j]表示从label_j转移到label_i的概率,虽然是随机生成的但是后面会迭代更新
		self.transitions = nn.Parameter(torch.randn(self.tagset_size, self.tagset_size))

		self.transitions.data[tag_to_ix[START_TAG], :] = -10000  # 从任何标签转移到START_TAG不可能
		self.transitions.data[:, tag_to_ix[STOP_TAG]] = -10000  # 从STOP_TAG转移到任何标签不可能

		self.hidden = self.init_hidden() # 随机初始化LSTM的输入(h_0, c_0)

	def init_hidden(self):
		return (torch.randn(2, 1, self.hidden_dim // 2),
				torch.randn(2, 1, self.hidden_dim // 2))

	def _forward_alg(self, feats):
		'''
		输入:发射矩阵(emission score),实际上就是LSTM的输出——sentence的每个word经BiLSTM后,对应于每个label的得分
		输出:所有可能路径得分之和/归一化因子/配分函数/Z(x)
		'''
		init_alphas = torch.full((1, self.tagset_size), -10000.)
		init_alphas[0][self.tag_to_ix[START_TAG]] = 0.

		# 包装到一个变量里面以便自动反向传播
		forward_var = init_alphas
		for feat in feats: # w_i
			alphas_t = []
			for next_tag in range(self.tagset_size): # tag_j
				# t时刻tag_i emission score(1个)的广播。需要将其与t-1时刻的5个previous_tags转移到该tag_i的transition scors相加
				emit_score = feat[next_tag].view(1, -1).expand(1, self.tagset_size) # 1*5
				# t-1时刻的5个previous_tags到该tag_i的transition scors
				trans_score = self.transitions[next_tag].view(1, -1)  # 维度是1*5

				next_tag_var = forward_var + trans_score + emit_score
				# 求和,实现w_(t-1)到w_t的推进
				alphas_t.append(log_sum_exp(next_tag_var).view(1))
			forward_var = torch.cat(alphas_t).view(1, -1) # 1*5

		# 最后将最后一个单词的forward var与转移 stop tag的概率相加
		terminal_var = forward_var + self.transitions[self.tag_to_ix[STOP_TAG]]
		alpha = log_sum_exp(terminal_var)
		return alpha

	def _get_lstm_features(self, sentence):
		'''
		输入:id化的自然语言序列
		输出:序列中每个字符的Emission Score
		'''
		self.hidden = self.init_hidden() # (h_0, c_0)
		embeds = self.word_embeds(sentence).view(len(sentence), 1, -1)
		lstm_out, self.hidden = self.lstm(embeds, self.hidden)
		lstm_out = lstm_out.view(len(sentence), self.hidden_dim)
		lstm_feats = self.hidden2tag(lstm_out) # len(s)*5
		return lstm_feats

	def _score_sentence(self, feats, tags):
		'''
		输入:feats——emission scores;tags——真实序列标注,以此确定转移矩阵中选择哪条路径
		输出:真实路径得分
		'''
		score = torch.zeros(1)
		# 将START_TAG的标签3拼接到tag序列最前面
		tags = torch.cat([torch.tensor([self.tag_to_ix[START_TAG]], dtype=torch.long), tags])
		for i, feat in enumerate(feats):
			score = score + \
					self.transitions[tags[i + 1], tags[i]] + feat[tags[i + 1]]
		score = score + self.transitions[self.tag_to_ix[STOP_TAG], tags[-1]]
		return score

	def _viterbi_decode(self, feats):
		# 预测序列的得分,维特比解码,输出得分与路径值
		backpointers = []

		init_vvars = torch.full((1, self.tagset_size), -10000.)
		init_vvars[0][self.tag_to_ix[START_TAG]] = 0

		forward_var = init_vvars
		for feat in feats:
			bptrs_t = []
			viterbivars_t = []

			for next_tag in range(self.tagset_size):
				next_tag_var = forward_var + self.transitions[next_tag]  # forward_var保存的是之前的最优路径的值
				best_tag_id = argmax(next_tag_var)  # 返回最大值对应的那个tag
				bptrs_t.append(best_tag_id)
				viterbivars_t.append(next_tag_var[0][best_tag_id].view(1))

			forward_var = (torch.cat(viterbivars_t) + feat).view(1, -1)
			backpointers.append(bptrs_t)  # bptrs_t有5个元素

		# 其他标签到STOP_TAG的转移概率
		terminal_var = forward_var + self.transitions[self.tag_to_ix[STOP_TAG]]
		best_tag_id = argmax(terminal_var)
		path_score = terminal_var[0][best_tag_id]

		best_path = [best_tag_id]
		for bptrs_t in reversed(backpointers):
			best_tag_id = bptrs_t[best_tag_id]
			best_path.append(best_tag_id)
		
		# 无需返回最开始的START位
		start = best_path.pop()
		assert start == self.tag_to_ix[START_TAG]
		best_path.reverse()  # 把从后向前的路径正过来
		return path_score, best_path

	def neg_log_likelihood(self, sentence, tags):  # 损失函数
		feats = self._get_lstm_features(sentence)  # len(s)*5
		forward_score = self._forward_alg(feats)  # 规范化因子/配分函数
		gold_score = self._score_sentence(feats, tags) # 正确路径得分
		return forward_score - gold_score  # Loss(已取反)

	def forward(self, sentence):
		'''
		解码过程,维特比解码选择最大概率的标注路径
		'''
		lstm_feats = self._get_lstm_features(sentence)

		score, tag_seq = self._viterbi_decode(lstm_feats)
		return score, tag_seq

START_TAG = "<START>"
STOP_TAG = "<STOP>"
EMBEDDING_DIM = 5 # 由于标签一共有B\I\O\START\STOP 5个,所以embedding_dim为5
HIDDEN_DIM = 4 # 这其实是BiLSTM的隐藏层的特征数量,因为是双向所以是2倍,单向为2

training_data = [(
	"the wall street journal reported today that apple corporation made money".split(),
	"B I I I O O O B I O O".split()
), (
	"georgia tech is a university in georgia".split(),
	"B I O O O O B".split()
)]

word_to_ix = {}
for sentence, tags in training_data:
	for word in sentence:
		if word not in word_to_ix:
			word_to_ix[word] = len(word_to_ix)

tag_to_ix = {"B": 0, "I": 1, "O": 2, START_TAG: 3, STOP_TAG: 4}

model = BiLSTM_CRF(len(word_to_ix), tag_to_ix, EMBEDDING_DIM, HIDDEN_DIM)
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-4)

for epoch in range(300):
	for sentence, tags in training_data:
		model.zero_grad()
		
        # 输入
		sentence_in = prepare_sequence(sentence, word_to_ix)
		targets = torch.tensor([tag_to_ix[t] for t in tags], dtype=torch.long)
		
        # 获取loss
		loss = model.neg_log_likelihood(sentence_in, targets)
		
        # 反向传播
		loss.backward()
		optimizer.step()

with torch.no_grad():
	precheck_sent = prepare_sequence(training_data[0][0], word_to_ix)
	print(model(precheck_sent))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/464513
推荐阅读
相关标签
  

闽ICP备14008679号