简介
在NLP中,管道是将各种文本处理组件整合在一起的概念,这样,一个组件的输出可以作为下一个组件的输入。Spacy提供了内置的管道功能,可以很容易地进行设置。在本教程中,我们将带你了解Spacy NLP管道的功能和例子。
Spacy NLP管道
Spacy NLP管道让你整合Spacy的多个文本处理组件,而每个组件都会返回文本的Doc对象,成为管道中下一个组件的输入。
我们可以很容易地玩转Spacy管道,根据我们的需要添加、删除、禁用、替换组件。此外,如果需要,你也可以定制管道组件。
Spacy NLP管道的组件
一个训练有素的管道的默认组件包括标签器、词法分析器、分析器和实体识别器。我们可以通过只启用那些需要的组件,或者通过使用nlp.pipe将文本作为一个流来处理,并分批缓冲,而不是逐一缓冲,来提高这个管道过程的效率。
我们可以通过调用nlp.add_pipe和它们的名字来初始化它们,Spacy会自动将它们添加到nlp管道中。下面是不同的NLP组件的列表和它们的描述。
以下是Spacy管道中可用的组件。
| STRING_NAME | 组件名称 | 描述 |
|---|---|---|
| 标记器 | 标记器 | 赋予部分语音标记。 |
| 解析器 | 依赖性分析器 | 指派依赖性标签。 |
| 识别器 | 实体识别器(EntityRecognizer | 分配命名的实体。 |
| entity_linker | 实体链接器 | 为命名的实体分配知识库ID。应该添加在实体识别器之后。 |
| entity_ruler | EntityRuler | 根据模式规则和字典来分配命名实体。 |
| textcat | 文本分类器(TextCategorizer | 指定文本类别:每个文档正好有一个类别被预测。 |
| textcat_multilabel | 多标签_文本分类器 | 在多标签设置中分配文本类别:每个文档有零、一个或多个标签。 |
| 词法分析器 | 词法分析器 | 为单词分配基本形式。 |
| 形态分析器 | 形态分析器 | 赋予形态学特征和粗粒度的POS标签。 |
| 属性管理器(attribute_ruler | 属性裁定器(AttributeRuler | 赋予标记属性映射和基于规则的例外情况。 |
| 句子识别器 | 句子识别器(SentenceRecognizer | 分配句子的边界。 |
| Sentencizer | 句子识别器 | 增加基于规则的句子分割,不需要依赖性解析。 |
| tok2vec | Tok2Vec | 分配令牌到向量的嵌入。 |
| 变换器 | 变换器 | 指定一个转化器模型的标记和输出。 |
添加自定义属性
在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库中的止损词教程
- 还可以阅读 - Spacy Tokenizer完整指南及实例
参考资料 -Spacy文档
The postSpacy NLP Pipeline Tutorial for Beginnersappeared first onMLK - Machine Learning Knowledge.