spaCy:Processing Pipelines

spaCy学习记录



前言

例如:今天在学习用到了spaCy库,以前也经常遇到这个库,但是没有系统记下问题,以后用这个文章系列当作笔记,省的以后遇到相同问题还要再去查。

一、spaCy是什么?

示例:spaCy是一个号称工业级的自然语言处理工具包,详细介绍可以在这里查看link ,这里先记下处理文本的第一部分,以后看到后面再做记录。

二、Processing Text

1.概念介绍

当在文本上调用nlp时,spaCy首先将tokenizes化文本生成一个Doc对象,这个Doc,通过几个不同的步骤来处理文档-这也称为处理管道(processing pipeline)。默认模型使用的pipeline由标记器,解析器和实体识别器组成( tagger, parser,entity recognizer),每个pipeline组件都返回已处理的Doc,然后将其传递给下一个组件。
在这里插入图片描述
processing pipeline 始终取决于统计模型及其功能,例如,一个pipeline模型如果只包含用实体标签进行预测的数据,那么pipeline只能包含entity recognizer组件。这就是每个模型都将在其元数据中指定要使用的管道的原因

这是一个样例,包含简单组件列表:

"pipeline": ["tagger", "parser", "ner"]

注意:上面这些是相互独立的,如果自己写的一些组件无依赖关系,组件不必全部导入

tokenizer是特殊的组件,它不是常规管道的一部分,使用nlp.pipe_name 它不会出现。它只是一个分词器,所有Doc都会返回它。也可以自定义生成分词器,nlp.tokenizer是可写的

2.Processing text

对文本上调用nlp时,spaCy将对其进行标记化(tokenize),然后依次调用文档上的每个组件。 然后,返回可以使用的已处理文档。
代码如下(示例):

doc = nlp("This is a text")

这时候doc表示已经处理过的 “This is a text”

在处理大量文本时,如果让统计模型处理成批文本,通常它们会更高效。 spaCy的nlp.pipe方法采用可迭代的文本,并生成已处理的Doc对象。 批处理在内部完成。

下面是两种处理方式,第二种更高效

texts = ["This is a text", "These are lots of texts", "..."]
- docs = [nlp(text) for text in texts]
+ docs = list(nlp.pipe(texts))

这里有一个命名实体识别示例,解释

import spacy
​
texts = [
    "Net income was $9.4 million compared to the prior year of $2.7 million.",
    "Revenue exceeded twelve billion dollars, with a loss of $1b.",
]
​
nlp = spacy.load("en_core_web_sm")
for doc in nlp.pipe(texts, disable=["tagger", "parser"]):
    # Do something with the doc here
    print([(ent.text, ent.label_) for ent in doc.ents])
    
-----------------------------------------------------------------------------------
[('$9.4 million', 'MONEY'), ('the prior year', 'DATE'), ('$2.7 million', 'MONEY')]
[('twelve billion dollars', 'MONEY'), ('1b', 'MONEY')]

3.How pipelines work

使用spaCy不但可以很容易地创建由可重用的pipelines——这包括spaCy的默认tagger、parser和entity recognizer,还包括您自己的自定义(custom)处理函数。在初始化语言类时指定,管道组件可以添加到已经存在的nlp对象中,或者在模型包中定义。

当你加载一个模型时,spaCy首先会查询模型的meta.json。元数据通常包括模型细节(model details)、语言类(language class)的ID和可选的管道组件列表。然后,spaCy执行以下操作:

  1. 通过get_lang_class加载给定ID的语言类和数据并初始化它。语言类(language class)包含共享词汇表(vocabulary)、标记化规则(tokenization)和特定于语言的注释方案(the language-specific annotation scheme)。
  2. 迭代所有的pipeline names并使用create_pipe创建每个组件,create_pipe会在Language.factories中查找它们。
  3. 按照顺序添加每一个pipeline component 到管道中,使用add_pipe
  4. 通过使用模型数据目录的路径调用from_disk,使模型数据**(model data)**对语言类可用。

因此当你使用

nlp = spacy.load("en_core_web_sm")

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

META.JSON (EXCERPT)
{
    
    
  "lang": "en",
  "name": "core_web_sm",
  "description": "Example model for spaCy",
  "pipeline": ["tagger", "parser", "ner"]
}

to be continue…

总结

今天有一次用到了spaCy这个库,先进行第一次总结,以后是有时间会翻译一些其他的guide 今天看的地址在这里 https://spacy.io/usage/processing-pipelines#plugins

猜你喜欢

转载自blog.csdn.net/qq_42388742/article/details/112095021