spaCy学习记录
Language Processing Pipelines
前言
例如:今天在学习用到了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执行以下操作:
- 通过get_lang_class加载给定ID的语言类和数据并初始化它。语言类(language class)包含共享词汇表(vocabulary)、标记化规则(tokenization)和特定于语言的注释方案(the language-specific annotation scheme)。
- 迭代所有的pipeline names并使用create_pipe创建每个组件,create_pipe会在Language.factories中查找它们。
- 按照顺序添加每一个pipeline component 到管道中,使用add_pipe
- 通过使用模型数据目录的路径调用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…