Spacy NLP 流水线初学者教程

1,197 阅读9分钟

简介

在NLP中,管道是将各种文本处理组件整合在一起的概念,这样,一个组件的输出可以作为下一个组件的输入。Spacy提供了内置的管道功能,可以很容易地进行设置。在本教程中,我们将带你了解Spacy NLP管道的功能和例子。

Spacy NLP管道

Spacy NLP管道让你整合Spacy的多个文本处理组件,而每个组件都会返回文本的Doc对象,成为管道中下一个组件的输入。

我们可以很容易地玩转Spacy管道,根据我们的需要添加、删除、禁用、替换组件。此外,如果需要,你也可以定制管道组件。

Spacy NLP管道的组件

Spacy NLP Pipeline Tutorial for Beginners

一个训练有素的管道的默认组件包括标签器、词法分析器、分析器和实体识别器。我们可以通过只启用那些需要的组件,或者通过使用nlp.pipe将文本作为一个流来处理,并分批缓冲,而不是逐一缓冲,来提高这个管道过程的效率。

我们可以通过调用nlp.add_pipe和它们的名字来初始化它们,Spacy会自动将它们添加到nlp管道中。下面是不同的NLP组件的列表和它们的描述。

以下是Spacy管道中可用的组件。

STRING_NAME组件名称描述
标记器标记器赋予部分语音标记。
解析器依赖性分析器指派依赖性标签。
识别器实体识别器(EntityRecognizer分配命名的实体。
entity_linker实体链接器为命名的实体分配知识库ID。应该添加在实体识别器之后。
entity_rulerEntityRuler根据模式规则和字典来分配命名实体。
textcat文本分类器(TextCategorizer指定文本类别:每个文档正好有一个类别被预测。
textcat_multilabel多标签_文本分类器在多标签设置中分配文本类别:每个文档有零、一个或多个标签。
词法分析器词法分析器为单词分配基本形式。
形态分析器形态分析器赋予形态学特征和粗粒度的POS标签。
属性管理器(attribute_ruler属性裁定器(AttributeRuler赋予标记属性映射和基于规则的例外情况。
句子识别器句子识别器(SentenceRecognizer分配句子的边界。
Sentencizer句子识别器增加基于规则的句子分割,不需要依赖性解析。
tok2vecTok2Vec分配令牌到向量的嵌入。
变换器变换器指定一个转化器模型的标记和输出。

添加自定义属性

在Spacy中,我们可以在上下文中添加元数据,并使用nlp.pipe将其保存在自定义属性中。这可以通过以tuples形式传递文本及其上下文,并传递一个参数astuples=True来完成。输出将是一个文档和上下文的序列。在下面的例子中,我们将一个文本列表和一些自定义属性一起传递给nlp.pipe,并使用doc将这些属性设置到doc中。

In [1]:

import

[输出] :

text1: This is the first text.
text2: This is the second text.

多重处理

Spacy在nlp.pipe中使用n_process提供了一个内置的多处理选项。这将大大增加nlp管道的性能。我们可以利用这一点使其成为一个多进程任务,或者也可以通过向nlp.pipe传递n_process=-1来使其成为多进程,有多少CPU就有多少进程。

然而,这应该被谨慎地使用。我们还可以在nlp管道中设置自己的batch_size,默认情况下是1000。对于较短的任务,使用较少的进程和较大的批处理量可能会更快。最佳的 batch_size 设置取决于管道组件、你的文档长度、进程数量以及可用内存的多少。

在[2]中。

docs

Spacy管道的内涵

Spacy管道包由三个部分组成:权重,即从目录中加载的二进制数据,按顺序调用的函数管道,以及语言数据,如标记化规则和特定语言设置。一个西班牙语NER管道需要的权重、语言数据和组件与英语解析和标记管道不同。

这也是为什么管道状态总是由Language类持有的原因。spacy.load将这一切放在一起,并返回一个具有管道集和访问二进制数据的Language实例。

在[3]中。

import

当我们加载一个管道时,Spacy首先会查阅meta.json和config.cfg。配置告诉Spacy要使用什么语言类,管道中有哪些组件,以及这些组件应该如何创建。

  • 通过get_lang_class加载给定ID的语言类和数据,并初始化它。语言类包含共享词汇、标记化规则和特定语言的设置。
  • 遍历管道名称,在[组件]块中查找每个组件名称。工厂告诉Spacy在用add_pipe添加组件时要使用哪个组件工厂。设置被传入工厂。
  • 通过调用from_disk和数据目录的路径,使模型数据对语言类可用。

样本 CONFIG.CFG

管道的config.cfg告诉Spacy使用语言 "en "和管道["tok2vec", "tagger", "parser", "ner", " attribute_ruler", "lemmatizer"]。然后,Spacy将初始化spacy.lang.en.English,并创建每个管道组件,将其添加到处理管道中。然后,它将从数据目录中加载模型数据,并返回修改后的Language类,供你作为nlp对象使用。

lang

Spacy首先对文本进行标记,加载模型数据,然后依次调用每个组件。然后组件访问模型数据,将注释分配给Doc对象、token或doc对象的跨度。

一个组件返回的修改后的文档被传递给下一个组件,以便在流水线上进行处理。一个组件的输出可作为另一个组件的输入,例如,分配给标记服务器的部分语音标记可作为词法分析器的输入数据。然而,有些组件是独立工作的,如标签器和分析器,不需要任何其他组件的数据。

在[1]中。

doc

在nlp.pipeline的帮助下,我们可以得到处理管道的列表,它返回一个包含组件名称和组件本身的图元列表。而nlp.pipe_names则返回所有组件的名称。

在 [2]:

print

[输出] :

[('tok2vec', <spacy.pipeline.Tok2Vec>), ('tagger', <spacy.pipeline.Tagger>), ('parser', <spacy.pipeline.DependencyParser>), ('ner', <spacy.pipeline.EntityRecognizer>), ('attribute_ruler', <spacy.pipeline.AttributeRuler>), ('lemmatizer', <spacy.lang.en.lemmatizer.EnglishLemmatizer>)]
['tok2vec', 'tagger', 'parser', 'ner', 'attribute_ruler', 'lemmatizer']

定制管道

在Spacy中,我们可以定制我们的NLP管道。也就是说,我们可以在管道中添加、禁用、排除和修改组件。这可能会使处理后的文本有很大的不同,并会提高加载和推理的速度。例如,如果我们不需要标签器或分析器,我们可以禁用或排除管道中的它们。

禁用组件

我们可以通过使用disable关键字在加载管道时禁用管道组件。它将被包括在内,但默认是禁用的。该组件及其数据将与管道一起加载,但它将被禁用,不会作为处理管道的一部分运行。然而,我们可以在需要时通过调用nlp.enable_pipe明确地启用它。

例如,经过训练的Spacy管道'en_core_web_sm'包含了一个分析器和senter,可以进行句子分割,但senter默认是禁用的。

在[3]中。

import

我们可以使用nlp.select_pipes上下文管理器来暂时禁用某个区块的某些组件。select_pipes返回一个对象,让我们在需要时调用其restore()方法来恢复被禁用的组件。如果我们想防止大型块的不必要的代码缩进,这可能是有用的。

在[4]中。

import

如果我们想禁用除一个或几个管道之外的所有管道,我们可以使用enable关键字。

在[5]中。

import

排除组件

在Spacy中,我们也可以通过传递exclude关键字和排除的组件列表来排除一个组件。与diable不同的是,它不会将组件和它的数据与管道一起加载。一旦管道被加载,就不会有对被排除或包括的任何组件的引用。

在[5]中。

import

我们还可以使用remove_pipe方法从现有的管道中移除管道组件,使用rename_pipe方法对其进行重命名,或者使用replace_pipe方法将其完全替换为自定义组件。

在[6]中。

nlp
参数描述
nlp.pipeline返回处理管道的组件名称和组件的图元,按顺序排列。
nlp.pipe_names按顺序返回管道组件的名称。
nlp.component返回所有组件名称和组件的图元,包括禁用的组件。
nlp.component_names返回所有组件的名称,包括禁用的组件。
nlp.disabled返回当前被禁用的组件的名称。

分析组件

在Spacy中,我们可以使用nlp.analyze方法来分析管道组件,该方法会返回组件的信息,比如它们在文件和令牌上设置的属性,它们是否重新认证了文件,以及它们在训练过程中产生了哪些分数。如果组件需要的值没有被前面的组件设置,它也会显示警告--例如,如果实体链接器被使用,但在它之前运行的组件没有设置命名实体。设置pretty=True将漂亮地打印一个表格,而不是只返回结构化数据。

在[6]。

import

[Out] :

Output 1:
{  
  "summary": {  
    "tagger": {  
      "assigns": ["token.tag"],  
      "requires": [],  
      "scores": ["tag_acc", "pos_acc", "lemma_acc"],  
      "retokenizes": false  
    },  
    "entity_linker": {  
      "assigns": ["token.ent_kb_id"],  
      "requires": ["doc.ents", "doc.sents", "token.ent_iob", "token.ent_type"],  
      "scores": [],  
      "retokenizes": false  
    }  
  },  
  "problems": {  
    "tagger": [],   
    "entity_linker": ["doc.ents", "doc.sents", "token.ent_iob", "token.ent_type"]   
  },   
  "attrs": {   
    "token.ent_iob": { "assigns": [], "requires": ["entity_linker"] },   
    "doc.ents": { "assigns": [], "requires": ["entity_linker"] },   
    "token.ent_kb_id": { "assigns": ["entity_linker"], "requires": [] },    
    "doc.sents": { "assigns": [], "requires": ["entity_linker"] },    
    "token.tag": { "assigns": ["tagger"], "requires": [] },   
    "token.ent_type": { "assigns": [], "requires": ["entity_linker"] }   
  }    
}    

Output 2:
============================= Pipeline Overview =============================

#   Component       Assigns           Requires         Scores        Retokenizes
-   -------------   ---------------   --------------   -----------   -----------
0   tagger          token.tag                          tag_acc       False

1   entity_linker   token.ent_kb_id   doc.ents         nel_micro_f   False
                                      doc.sents        nel_micro_r
                                      token.ent_iob    nel_micro_p
                                      token.ent_type


================================ Problems (4) ================================'entity_linker' requirements not met: doc.ents, doc.sents,
token.ent_iob, token.ent_type

创建自定义组件

在Spacy中,我们可以创建自己的自定义流水线组件,并将其添加到nlp流水线中。我们像其他函数一样创建一个管道组件,除了首先使用@Language.component装饰器将该函数描述为一个管道组件。这个管道组件将被列在管道配置中,以便使用我们的组件保存、加载和训练管道。自定义组件可以使用add_pipe方法添加到管道中。我们还可以指定组件在管道列表中的位置。

在[7]中。

import
参数描述
最后一个如果设置为True,组件将在管道中最后加入。默认情况下,组件被添加在最后。
第一个如果设置为 "True",则该组件在管道中被首先添加。
之前取字符串名称或索引,用于添加新的组件在前。
after在新组件之后添加的字符串名称或索引。

参考资料 -Spacy文档

The postSpacy NLP Pipeline Tutorial for Beginnersappeared first onMLK - Machine Learning Knowledge.