训练模型与管道
python -m spacy download en_core_web_smimport spacynlp = spacy.load("en_core_web_sm")import en_core_web_smnlp = en_core_web_sm.load()doc = nlp("This is a sentence.")print([(w.text, w.pos_) for w in doc])包命名约定
通常,spaCy 期望所有管道包都遵循 [lang]_[name] 的命名约定。对于 spaCy 的管道,我们还将名称划分为三个组成部分
-
类型: 功能(例如
core用于具有词性标注、句法分析、词形还原和命名实体识别的通用管道,或dep仅用于词性标注、句法分析和词形还原)。 -
类型: 管道训练的文本类型,例如
web或news。 -
大小: 包大小指示器,
sm、md、lg或trf。sm和trf管道没有静态词向量。对于具有默认向量的管道,
md具有包含约 50 万个单词的 2 万个唯一向量的缩减词向量表,而lg具有包含约 50 万个条目的大型词向量表。对于具有 floret 向量的管道,
md向量表包含 5 万个条目,而lg向量表包含 20 万个条目。
例如,en_core_web_sm 是一个小型英语管道,在书面网络文本(博客、新闻、评论)上进行训练,包括词汇、句法和实体。
包版本控制
此外,管道包版本控制反映了与 spaCy 的兼容性以及模型版本。包版本 a.b.c 对应于
a:spaCy 主要版本。例如,2表示 spaCy v2.x。b:spaCy 次要版本。例如,3表示 spaCy v2.3.x。c:模型版本。不同的模型配置:例如,从不同的数据训练、使用不同的参数、进行不同迭代次数、使用不同的向量等。
有关详细的兼容性概述,请参阅 compatibility.json。这也是 spaCy 在您运行 download 命令时执行的内部兼容性检查的来源。
训练管道设计
spaCy v3 训练管道旨在高效且可配置。例如,多个组件可以共享通用的“token-to-vector”模型,并且很容易交换或禁用词形还原器。这些管道旨在在速度和大小方面高效,并在管道完全运行时效果良好。
修改训练管道时,了解组件依赖于彼此非常重要。与 spaCy v2 不同,在 spaCy v2 中,tagger、parser 和 ner 组件都是独立的,一些 v3 组件依赖于管道中的早期组件。因此,禁用或重新排序组件会影响注释质量或导致警告和错误。
spaCy v2 模型的主要变化
Tok2Vec组件可能是一个单独的共享组件。像词性标注器或句法分析器这样的组件可以 监听 之前的tok2vec或transformer,而不是拥有自己的单独 tok2vec 层。- 基于规则的异常从各个组件移动到
attribute_ruler。词形和词性异常从分词器异常移动到属性规则,词性映射和形态规则从词性标注器移动到属性规则。 - 词形还原表和处理从词汇和词性标注器移动到单独的
lemmatizer组件。
CNN/CPU 管道设计
在 sm/md/lg 模型中
tagger、morphologizer和parser组件监听tok2vec组件。如果词形还原器是可训练的(v3.3+),lemmatizer也监听tok2vec。attribute_ruler将token.tag映射到token.pos(如果没有morphologizer)。attribute_ruler还会确保空格被一致地标记,并将token.pos复制到token.tag(如果没有词性标注器)。对于英语,如果来自parser的依赖句法分析存在,属性规则可以改进从token.tag到token.pos的映射,但句法分析器不是必需的。- 对于许多语言,
lemmatizer组件需要来自tagger+attribute_ruler或morphologizer的token.pos注释。 ner组件是独立的,具有自己的内部 tok2vec 层。
具有 floret 向量的 CNN/CPU 管道
克罗地亚语、芬兰语、韩语、斯洛文尼亚语、瑞典语和乌克兰语的 md 和 lg 管道使用 floret 向量 而不是默认向量。如果您在文本上运行训练管道并使用 Doc 对象,您在使用 floret 向量时不会注意到任何差异。使用 floret 向量,没有词汇量外的标记,因此 Token.is_oov 将对所有标记返回 False。
如果您直接访问向量进行相似性比较,则存在一些差异,因为 floret 向量不包含像默认向量的向量键那样的固定词列表。
-
如果您的工作流程遍历向量键,则需要使用外部词列表
-
Vectors.most_similar不受支持,因为没有固定的向量列表可用于将您的向量进行比较。
Transformer 管道设计
在 transformer (trf) 管道中,tagger、parser 和 ner(如果存在)都监听 transformer 组件。attribute_ruler 和 lemmatizer 具有与 CNN 模型相同的配置。
对于 spaCy v3.0-v3.6,trf 管道使用 spacy-transformers,并且 doc._.trf_data 中的 transformer 输出是一个 TransformerData 对象。
对于 spaCy v3.7+,trf 管道使用 spacy-curated-transformers,并且 doc._.trf_data 是一个 DocTransformerOutput 对象。
修改默认管道
为了加快处理速度,您可能只想运行训练管道中的一部分组件。disable 和 exclude 参数用于 spacy.load,让您可以控制加载和运行哪些组件。禁用的组件在后台加载,因此可以在未来使用 nlp.enable_pipe 在同一管道中重新启用它们。要完全跳过加载组件,请使用 exclude 而不是 disable。
禁用词性标注和词形还原
要禁用词性标注和词形还原,请禁用 tagger、morphologizer、attribute_ruler 和 lemmatizer 组件。
使用 senter 而不是 parser 进行快速句子分割
如果您需要快速的句子分割而不需要依赖句法分析,请禁用 parser 并使用 senter 组件
senter 组件比 parser 快约 10 倍,并且比基于规则的 sentencizer 更准确。
切换到默认词形还原器而不是可训练词形还原器
从 v3.3 开始,许多管道使用可训练的词形还原器。您可以检查词形还原器是否可训练
如果您想切换到类似于 v3.2 或更早版本的不可训练词形还原器,您可以将可训练的词形还原器替换为默认的不可训练词形还原器
切换到基于查找的词形还原
对于荷兰语、英语、法语、希腊语、马其顿语、挪威语和西班牙语的流水线,您可以将可训练或基于规则的词形还原器替换为查找词形还原器。
禁用所有内容,仅保留 NER
对于非 Transformer 模型,ner 组件是独立的,因此您可以禁用其他所有组件。
在 Transformer 模型中,ner 监听 transformer 组件,因此您可以禁用所有与词性标注、句法分析和词形还原相关的组件。
将 NER 移动到流水线的末尾
为了在 entity_ruler 中访问 POS 和 LEMMA 特征,请将 ner 移动到流水线的末尾,在 attribute_ruler 和 lemmatizer 之后。