开始使用

spaCy 101:你需要了解的一切

最重要的概念,以简单的术语解释

无论你是 spaCy 的新手,还是只想复习一些 NLP 基础知识和实现细节——本页应该能满足你的需求。每个部分将用简单易懂的语言和示例或图示来解释 spaCy 的一项特性。有些部分也会在用法指南中重新出现,作为快速介绍。

什么是 spaCy?

spaCy 是一个免费、开源库,用于 Python 中的高级自然语言处理 (NLP)。

如果你正在处理大量的文本,你最终会想更多地了解它。例如,它讲的是什么?这些词在上下文中是什么意思?谁在对谁做什么?提到了哪些公司和产品?哪些文本彼此相似?

spaCy 专为生产使用而设计,可帮助你构建处理和“理解”大量文本的应用程序。它可以用于构建信息提取自然语言理解系统,或为深度学习预处理文本。

spaCy 不是什么

  • spaCy 不是一个平台或“API”。与平台不同,spaCy 不提供软件即服务或 Web 应用程序。它是一个开源库,旨在帮助你构建 NLP 应用程序,而不是可消费的服务。
  • spaCy 不是一个现成的聊天机器人引擎。虽然 spaCy 可用于为对话应用程序提供支持,但它并非专门为聊天机器人设计,仅提供底层的文本处理功能。
  • spaCy 不是研究软件。它建立在最新的研究之上,但它旨在完成任务。这导致了与 NLTKCoreNLP 不同的设计决策,后者是作为教学和研究平台创建的。主要区别在于 spaCy 是集成的和有主见的。spaCy 试图避免让用户在提供等效功能的多个算法之间进行选择。保持菜单小巧可以让 spaCy 提供通常更好的性能和开发体验。
  • spaCy 不是一家公司。它是一个开源库。发布 spaCy 和其他软件的公司名为 Explosion

特性

在文档中,你将遇到对 spaCy 的特性和功能的提及。其中一些指的是语言学概念,而另一些则与更通用的机器学习功能相关。

名称描述
分词将文本分割成单词、标点符号等。
词性 (POS) 标注为词素分配词性,如动词或名词。
依存句法分析分配句法依存关系标签,描述单个词素之间的关系,如主语或宾语。
词形还原分配单词的基本形式。例如,“was”的词元是“be”,而“rats”的词元是“rat”。
句子边界检测 (SBD)查找和分割单个句子。
命名实体识别 (NER)标记命名“现实世界”对象,如人、公司或地点。
实体链接 (EL)消除文本实体的歧义,将其映射到知识库中的唯一标识符。
相似度比较单词、文本片段和文档,以及它们彼此有多相似。
文本分类为整个文档或文档的一部分分配类别或标签。
基于规则的匹配基于其文本和语言学标注查找标记序列,类似于正则表达式。
训练更新和改进统计模型的预测。
序列化将对象保存到文件或字节字符串。

统计模型

虽然 spaCy 的一些特性可以独立工作,但另一些特性需要加载训练好的流程,这使得 spaCy 能够预测语言学标注——例如,一个词是动词还是名词。训练好的流程可以由多个组件组成,这些组件使用在标记数据上训练的统计模型。spaCy 当前为各种语言提供训练好的流程,可以作为单独的 Python 模块安装。流程包在大小、速度、内存使用、准确性和包含的数据方面可能有所不同。你选择的包始终取决于你的用例和正在处理的文本。对于通用用例,小的默认包始终是一个好的起点。它们通常包括以下组件

  • 二进制权重用于词性标注器、依存句法分析器和命名实体识别器,以在上下文中预测这些标注。
  • 词汇条目在词汇表中,即单词及其上下文无关属性,如形状或拼写。
  • 数据文件,如词形还原规则和查找表。
  • 词向量,即单词的多维含义表示,可让你确定它们彼此有多相似。
  • 配置选项,如语言和处理流程设置以及要使用的模型实现,以便在加载流程时将 spaCy 置于正确的状态。

语言学标注

spaCy 提供各种语言学标注,以便让你深入了解文本的语法结构。这包括词性等词类型,以及单词之间的关系。例如,如果你正在分析文本,一个名词是句子的主语还是宾语——或者“google”是作为动词使用,还是指特定的网站或公司——这会产生巨大的影响。

一旦你下载并安装了一个训练好的流程,你就可以通过 spacy.load 加载它。这将返回一个 Language 对象,其中包含处理文本所需的所有组件和数据。我们通常称之为 nlp。在 nlp 对象上调用一个文本字符串将返回一个处理后的 Doc

Editable CodespaCy v3.7 · Python 3 · via Binder

即使一个 Doc 已经被处理过——例如,被分割成单个单词并进行了标注——它仍然保留着原始文本的所有信息,如空格字符。你始终可以获取词素到原始字符串的偏移量,或者通过连接词素及其尾随空格来重建原始字符串。这样,你在使用 spaCy 处理文本时将永远不会丢失任何信息。

分词

在处理过程中,spaCy 首先分词文本,即将其分割成单词、标点符号等。这是通过应用特定于每种语言的规则来完成的。例如,句子末尾的标点符号应该被分割开——而“U.K.”应该保持一个词素。每个 Doc 由单个词素组成,我们可以遍历它们

Editable CodespaCy v3.7 · Python 3 · via Binder

012345678910
AppleislookingatbuyingU.K.startupfor$1billion

首先,原始文本在空格字符上分割,类似于 text.split(' ')。然后,分词器从左到右处理文本。在每个子字符串上,它执行两个检查

  1. 子字符串是否匹配分词器异常规则? 例如,“don’t”不包含空格,但应该分割成两个词素,“do”和“n’t”,而“U.K.”应该始终保持一个词素。

  2. 是否可以分割前缀、后缀或中缀? 例如,逗号、句点、连字符或引号等标点符号。

如果存在匹配项,则应用该规则,并且分词器继续循环,从新分割的子字符串开始。这样,spaCy 就可以分割复杂的嵌套词素,如缩写和多个标点符号的组合。

Example of the tokenization process

虽然标点符号规则通常非常通用,但分词器异常强烈依赖于单个语言的细节。这就是为什么每个 可用语言 都有自己的子类,如 EnglishGerman,它加载了硬编码的数据和异常规则列表。

词性标注和依存关系 需要模型

在分词之后,spaCy 可以 解析标注 给定的 Doc。 这时,训练好的管道和它的统计模型就派上用场了,它们使 spaCy 能够 做出预测,判断哪个标签或类别最适用于当前语境。 训练好的组件包含二进制数据,这些数据是通过向系统展示足够的示例来生成的,以便系统能够做出泛化到语言的预测——例如,在英语中,“the” 之后的词最有可能是一个名词。

语言标注作为 Token 属性 提供。 像许多 NLP 库一样,spaCy 将所有字符串编码为哈希值,以减少内存使用并提高效率。 因此,为了获得属性的可读字符串表示,我们需要在其名称后添加下划线 _

Editable CodespaCy v3.7 · Python 3 · via Binder

文本词元POS标签依存关系形状alphastop
AppleapplePROPNNNPnsubjXxxxxTrueFalse
isbeAUXVBZauxxxTrueTrue
lookinglookVERBVBGROOTxxxxTrueFalse
atatADPINprepxxTrueTrue
buyingbuyVERBVBGpcompxxxxTrueFalse
U.K.u.k.PROPNNNPcompoundX.X.FalseFalse
startupstartupNOUNNNdobjxxxxTrueFalse
forforADPINprepxxxTrueTrue
$$SYM$quantmod$FalseFalse
11NUMCDcompounddFalseFalse
billionbillionNUMCDpobjxxxxTrueFalse

使用 spaCy 内置的 displaCy 可视化工具,我们的示例句子及其依存关系如下所示

命名实体 需要模型

命名实体是被赋予名称的“现实世界对象”——例如,一个人、一个国家、一个产品或一本书的标题。 spaCy 可以 识别文档中的各种类型的命名实体,通过向模型请求预测。 由于模型是统计性的,并且强烈依赖于它们所训练的示例,因此这并不总是完美的,并且可能需要根据您的用例进行一些调整。

命名实体作为 Docents 属性提供

Editable CodespaCy v3.7 · Python 3 · via Binder

文本开始结束标签描述
Apple05ORG公司、机构、组织。
U.K.2731GPE地缘政治实体,即国家、城市、州。
$1 billion4454MONEY货币价值,包括单位。

使用 spaCy 内置的 displaCy 可视化工具,我们的示例句子及其命名实体如下所示

Apple ORG 正在考虑收购 U.K. GPE 初创公司,价值 $1 billion MONEY

词向量和相似度 需要模型

相似度是通过比较 词向量 或“词嵌入”来确定的,词向量是单词的多维含义表示。 词向量可以使用像 word2vec 这样的算法生成,通常如下所示

banana.vector

带有内置词向量的管道包将它们作为 Token.vector 属性提供。 Doc.vectorSpan.vector 将默认使用它们的词元向量的平均值。 您还可以检查词元是否分配了向量,并获取 L2 范数,可用于规范化向量。

Editable CodespaCy v3.7 · Python 3 · via Binder

“dog”、“cat”和“banana”这些词在英语中都非常常见,因此它们是管道的词汇表的一部分,并带有向量。 另一方面,“afskfsd” 这种词不太常见,并且是词汇表外的——因此它的向量表示由 300 个维度为 0 的值组成,这意味着它实际上不存在。 如果您的应用程序将受益于更大的词汇表和更多的向量,您应该考虑使用其中一个更大的管道包或加载完整的向量包,例如,en_core_web_lg,它包含 685k 个唯一向量

spaCy 能够比较两个对象,并预测它们有多相似。 预测相似度对于构建推荐系统或标记重复项很有用。 例如,您可以建议用户与他们当前正在查看的内容相似的内容,或者如果它与已有的内容非常相似,则将支持工单标记为重复项。

每个 DocSpanTokenLexeme 都带有 .similarity 方法,可让您将其与另一个对象进行比较并确定相似度。 当然,相似度始终是主观的——两个词语、跨度或文档是否相似,实际上取决于您如何看待它。 spaCy 的相似度实现通常假定了一种通用的相似度定义。

Editable CodespaCy v3.7 · Python 3 · via Binder

关于相似度结果的期望

计算相似度得分在许多情况下都很有帮助,但保持对它可以提供的信息的现实期望也很重要。 单词可以通过多种方式相互关联,因此单个“相似度”得分始终是不同信号的混合,并且在不同数据上训练的向量可能会产生非常不同的结果,这些结果可能对您的目的没有用。 以下是一些需要记住的重要注意事项

  • 没有关于相似度的客观定义。 “我喜欢汉堡”和“我喜欢意大利面”是否相似取决于您的应用程序。 两者都谈论食物偏好,这使它们非常相似——但如果您正在分析食物的提及,这些句子非常不相似,因为它们谈论的是非常不同的食物。
  • “Doc”对象和“Span”对象的相似度默认为token向量的平均值。这意味着“fast food”(快餐)的向量是“fast”(快)和“food”(食物)的向量的平均值,这不一定能代表“fast food”这个短语。
  • 向量平均意味着多个token的向量对单词的顺序不敏感。表达相同含义但措辞不同的两篇文档,其相似度得分会低于包含相同单词但表达不同含义的两篇文档。

流程

当你调用nlp处理文本时,spaCy首先将文本分词以生成一个Doc对象。然后,Doc在几个不同的步骤中进行处理——这也被称为处理流水线。由训练好的流水线使用的流水线通常包括词性标注器、词形还原器、句法分析器和实体识别器。每个流水线组件都会返回处理后的Doc,然后将其传递给下一个组件。

The processing pipeline
名称组件创建描述
分词器TokenizerDoc将文本分割成token。
处理流水线
组件 句法分析器Token.tag分配词性标签。
可训练的词形还原器DependencyParserToken.headToken.depDoc.sentsDoc.noun_chunks分配依存关系标签。
句法分析器EntityRecognizerDoc.entsToken.ent_iobToken.ent_type检测和标记命名实体。
词形还原器LemmatizerToken.lemma分配基本形式。
spancatTextCategorizerDoc.cats分配文档标签。
自定义自定义组件Doc._.xxxToken._.xxxSpan._.xxx分配自定义属性、方法或特性。

处理流水线的功能始终取决于组件、它们的模型以及它们的训练方式。例如,用于命名实体识别的流水线需要包含一个经过训练的命名实体识别器组件,并带有统计模型和权重,使其能够进行预测的实体标签。这就是为什么每个流水线都会在其配置中指定其组件及其设置。

诸如词性标注器或句法分析器之类的统计组件通常是独立的,并且彼此之间不共享任何数据。例如,命名实体识别器不使用词性标注器和句法分析器设置的任何特征,依此类推。这意味着你可以交换它们,或者从流水线中删除单个组件,而不会影响其他组件。但是,组件可能会共享一个“token-to-vector”(token到向量)组件,例如Tok2VecTransformer。你可以在embedding layers(嵌入层)的文档中了解更多信息。

自定义组件也可能依赖于其他组件设置的标注。例如,自定义词形还原器可能需要分配的词性标签,因此只有在将其添加到词性标注器之后才能工作。句法分析器会尊重预定义的句子边界,因此如果流水线中的先前组件设置了它们,其依存关系预测可能会有所不同。同样,在统计实体识别器之前或之后添加EntityRuler也很重要:如果先添加它,实体识别器将在进行预测时考虑现有的实体。应该在识别实体(例如EntityRecognizer)的流水线组件之后使用EntityLinker,后者将命名实体解析为知识库ID。

分词器是一个“特殊”组件,不属于常规流水线。它也不显示在nlp.pipe_names中。原因是通常只能有一个分词器,而所有其他流水线组件都接收一个Doc并返回它,而分词器接收一个文本字符串并将其转换为一个Doc。你仍然可以自定义分词器。 nlp.tokenizer是可写的,因此你可以创建自己的Tokenizer类从头开始,或者甚至用一个完全自定义的函数替换它。


架构

spaCy中的核心数据结构是Language类、VocabDoc对象。Language类用于处理文本并将其转换为一个Doc对象。它通常存储在一个名为nlp的变量中。Doc对象拥有token序列和所有标注。通过将字符串、词向量和词汇属性集中在Vocab中,我们避免存储这些数据的多个副本。这可以节省内存,并确保有一个事实的唯一来源

文本标注也被设计为允许一个事实的唯一来源:Doc对象拥有数据,而SpanToken指向它的视图Doc对象由Tokenizer构造,然后由流水线的组件就地修改Language对象协调这些组件。它接收原始文本并将其通过流水线发送,返回一个已标注的文档。它还协调训练和序列化。

Library architecture {w:1080, h:1254}

容器对象

名称描述
Doc用于访问语言注释的容器。
DocBin一个Doc对象的集合,用于高效的二进制序列化。也用于训练数据
示例一个训练标注的集合,包含两个Doc对象:参考数据和预测。
命令开始使用,或克隆项目模板以获得端到端工作流程。处理类,将文本转换为Doc对象。不同的语言实现自己的子类。该变量通常称为nlp
Lexeme词汇表中的一个条目。它是一个没有上下文的词类型,与词token相反。因此,它没有词性标签、依存关系分析等。
Span来自Doc对象的一个切片。
SpanGroup属于Doc的命名span的集合。
Token一个单独的 token——即一个单词、标点符号、空格等。

处理流水线

处理流水线由按顺序在Doc上调用的一个或多个流水线组件组成。分词器在组件之前运行。可以使用Language.add_pipe添加流水线组件。它们可以包含一个统计模型和训练权重,或者只进行基于规则的修改Doc。spaCy提供了一系列用于不同语言处理任务的内置组件,并允许添加自定义组件

The processing pipeline
名称描述
AttributeRuler使用匹配器规则设置token属性。
DependencyParser预测句法依存关系。
EditTreeLemmatizer预测单词的基本形式。
EntityLinker将命名实体消歧到知识库中的节点。
EntityRecognizer预测命名实体,例如人或产品。
EntityRuler使用基于token的规则或精确短语匹配将实体span添加到Doc中。
Lemmatizer使用规则和查找来确定单词的基本形式。
Morphologizer预测形态特征和粗粒度的词性标签。
SentenceRecognizer预测句子边界。
Sentencizer实现基于规则的句子边界检测,不需要依存关系分析。
句法分析器预测词性标签。
TextCategorizer预测整个文档的类别或标签。
Tok2Vec应用“token-to-vector”模型并设置其输出。
Tokenizer分割原始文本并创建Doc对象。
TrainablePipe所有可训练流水线组件都继承的类。
Transformer使用transformer模型并设置其输出。
其他函数自动将某些内容应用于Doc,例如合并token的span。

匹配器

匹配器帮助你根据描述你正在寻找的序列的匹配模式,从Doc对象中查找和提取信息。匹配器在一个Doc上运行,并让你能够访问上下文中匹配的token。

名称描述
DependencyMatcher使用Semgrex运算符基于依存树匹配token序列。
Matcher基于模式规则匹配token序列,类似于正则表达式。
PhraseMatcher基于短语匹配token序列。

其他类

名称描述
Corpus用于管理用于训练和评估数据的标注语料库的类。
KnowledgeBase用于存储和检索实体链接数据的抽象基类。
InMemoryLookupKB基于内存存储所有数据的 KnowledgeBase 的实现。
候选者将文本提及与 KnowledgeBase 中包含的特定实体关联的对象。
查找表用于方便访问大型查找表和字典的容器。
形态分析一种形态分析。
形态学存储形态分析并将它们映射到哈希值以及从哈希值映射回来。
Scorer计算评估分数。
StringStore将字符串映射到哈希值以及从哈希值映射回字符串。
Vectors以字符串为键的向量数据的容器类。
Vocab共享词汇表,存储字符串并提供访问 Lexeme 对象的功能。

词汇表、哈希和词素

在可能的情况下,spaCy 尝试将数据存储在词汇表中,即 Vocab,该词汇表将在多个文档之间共享。为了节省内存,spaCy 还会将所有字符串编码为哈希值——例如,在这个例子中,“coffee”的哈希值为 3197928453018144401。实体标签(如“ORG”)和词性标签(如“VERB”)也会被编码。在内部,spaCy 只“说”哈希值。

Doc, Vocab, Lexeme and StringStore

如果您处理大量包含单词“coffee”的文档,并且这些单词在各种不同的语境中使用,那么每次存储确切的字符串“coffee”会占用太多的空间。因此,spaCy 会对字符串进行哈希处理,并将其存储在 StringStore 中。您可以将 StringStore 视为一个双向查找表——您可以查找字符串以获取其哈希值,也可以查找哈希值以获取其字符串。

Editable CodespaCy v3.7 · Python 3 · via Binder

现在所有字符串都已编码,词汇表中的条目不需要包含单词文本本身。相反,它们可以通过其哈希值在 StringStore 中查找它。词汇表中的每个条目,也称为 Lexeme,包含关于单词的与语境无关的信息。例如,无论“love”在某些语境中用作动词还是名词,其拼写和是否由字母字符组成都不会改变。它的哈希值也将始终相同。

Editable CodespaCy v3.7 · Python 3 · via Binder

文本正交形状前缀后缀is_alphais_digit
4690420944186131903XTrueFalse
love3702023516439754181xxxxloveTrueFalse
coffee3197928453018144401xxxxcfeeTrueFalse

单词到哈希值的映射不依赖于任何状态。为了确保每个值都是唯一的,spaCy 使用 哈希函数 根据单词字符串计算哈希值。这也意味着“coffee”的哈希值将始终相同,无论您使用哪个管道或如何配置 spaCy。

但是,哈希值不能被反转,并且无法将 3197928453018144401 还原为“coffee”。spaCy 只能在词汇表中查找它。因此,您始终需要确保您创建的所有对象都可以访问相同的词汇表。如果它们不能,spaCy 可能无法找到它需要的字符串。

Editable CodespaCy v3.7 · Python 3 · via Binder

如果词汇表中不包含 3197928453018144401 的字符串,spaCy 将引发错误。您可以手动重新添加“coffee”,但这只有在您实际知道该文档包含该单词时才有效。为了防止此问题,spaCy 也会在保存 Docnlp 对象时导出 Vocab。这将为您提供对象及其编码的注释,以及解码它的“密钥”。

序列化

如果您一直在修改管道、词汇表、向量和实体,或者对组件模型进行了更新,您最终会想要保存您的进度——例如,您所有的 nlp 对象中的内容。这意味着您必须将它的内容和结构转换为可以保存的格式,例如文件或字节字符串。这个过程称为序列化。spaCy 带有内置的序列化方法,并支持 Pickle 协议

所有容器类,即 Languagenlp)、DocVocabStringStore 都有以下可用方法

方法返回值示例
to_bytesbytesdata = nlp.to_bytes()
from_bytesobjectnlp.from_bytes(data)
to_disk-nlp.to_disk("/path")
from_diskobjectnlp.from_disk("/path")

训练

spaCy 的分词器、解析器、文本分类器和许多其他组件都由统计模型提供支持。这些组件所做的每一个“决定”——例如,分配哪个词性标签,或者一个单词是否是命名实体——都是基于模型当前权重值预测。权重值是根据模型在训练期间看到的示例估算的。要训练模型,您首先需要训练数据——文本示例,以及您希望模型预测的标签。这可以是词性标签、命名实体或任何其他信息。

训练是一个迭代过程,其中模型的预测与参考注释进行比较,以估算损失的梯度。然后使用梯度通过 反向传播 计算权重的梯度。梯度指示应如何更改权重值,以便模型的预测随着时间的推移更接近参考标签。

The training process

在训练模型时,我们不希望它仅仅记住我们的示例——我们希望它提出一个可以推广到未见数据的理论。毕竟,我们不希望模型仅仅学习到这个“Amazon”实例是公司——我们希望它学习到“Amazon”,在像这样的语境中,很可能是一个公司。因此,训练数据应始终代表我们想要处理的数据。在 Wikipedia 上训练的模型,其中第一人称的句子非常罕见,很可能在 Twitter 上表现不佳。同样,在浪漫小说上训练的模型很可能在法律文本上表现不佳。

这也意味着为了知道模型的表现如何,以及它是否在学习正确的东西,您不仅需要训练数据——您还需要评估数据。如果您只用它训练的数据测试模型,您将不知道它推广得如何。如果您想从头开始训练模型,通常至少需要几百个示例用于训练和评估。

训练配置和生命周期

训练配置文件包含训练你的流程的所有设置和超参数。与其在命令行中提供大量参数,你只需要将你的 config.cfg 文件传递给 spacy train。这也有助于集成用你选择的框架编写的自定义模型和架构。流程的 config.cfg 被认为是“唯一的真实来源”,无论是在训练还是运行时

Illustration of pipeline lifecycle

可训练组件

spaCy 的 Pipe 类帮助你实现自己的可训练组件,这些组件拥有自己的模型实例,对 Doc 对象进行预测,并且可以使用 spacy train 进行更新。这让你能够将完全自定义的机器学习组件插入到你的流程中,这些组件可以通过单个训练配置文件进行配置。

Illustration of Pipe methods

语言数据

每种语言都不同——并且通常充满例外和特殊情况,尤其是在最常用的词语中。其中一些例外在语言之间共享,而另一些则是完全特定的——通常非常具体,需要硬编码。 lang 模块包含所有特定于语言的数据,组织在简单的 Python 文件中。这使得数据易于更新和扩展。

目录根目录中的共享语言数据包括可以推广到多种语言的规则——例如,基本标点符号、表情符号、表情符号和单字母缩写词的规则。子模块中的单独语言数据包含仅与特定语言相关的规则。它还负责将所有组件放在一起并创建 Language 子类——例如,EnglishGerman。这些值定义在 Language.Defaults 中。

名称描述
停用词
stop_words.py
语言中最常见词的列表,通常用于过滤掉,例如“and”或“I”。匹配的词条将为 is_stop 返回 True
分词器例外
tokenizer_exceptions.py
分词器的特殊规则,例如,像“can’t”这样的缩写和带有标点符号的缩写,如“U.K.”。
标点符号规则
punctuation.py
用于分割词条的正则表达式,例如,在标点符号或表情符号等特殊字符上。包括前缀、后缀和中缀的规则。
字符类
char_classes.py
要在正则表达式中使用的字符类,例如,拉丁字符、引号、连字符或图标。
词法属性
lex_attrs.py
用于在词条上设置词法属性的自定义函数,例如,like_num,其中包含特定于语言的词语,如“ten”或“hundred”。
语法迭代器
syntax_iterators.py
根据其语法计算 Doc 对象视图的函数。目前,仅用于 名词短语
Lemmatizer
lemmatizer.py spacy-lookups-data
自定义词形还原实现和词形还原表。

社区与常见问题解答

我们很高兴看到 spaCy 社区不断发展,并汇集了来自各行各业的人们——计算语言学、数据科学、深度学习、研究等等。如果你想参与其中,以下是一些关于最重要的问题和进一步阅读资源的解答。

帮助,我的代码无法正常工作!

错误很糟糕,我们正在尽最大努力不断改进测试并尽快修复错误。在提交问题之前,请快速搜索并检查问题是否已报告。如果你遇到安装或加载问题,请务必查看 故障排除指南。可以通过以下平台获得 spaCy 的帮助

  • Stack Overflow使用问题以及与你的特定代码问题相关的一切。Stack Overflow 社区比我们的社区大得多,因此如果你的问题可以由其他人解决,你将更快地获得帮助。
  • GitHub 讨论一般讨论项目想法使用问题。与其他社区成员会面,以获得特定代码实现的帮助,讨论新项目/插件的想法,支持更多语言,并分享最佳实践。
  • GitHub 问题跟踪器错误报告改进建议,即,所有可能由 spaCy 造成的错误。这还包括超出统计不准确范围的训练流程问题,例如指向错误的模式。

我如何为 spaCy 做出贡献?

你不必是 NLP 专家或 Python 专家才能做出贡献,我们很乐意帮助你入门。如果你是 spaCy 的新手,一个好的起点是 help wanted (easy) label 在 GitHub 上,我们用它来标记易于理解和独立的错误和功能请求。我们还欢迎对文档的贡献——无论是修复一个错别字、改进一个示例还是添加额外的说明。你会在每页的底部找到一个“Suggest edits”链接,它会指向源代码。

另一种参与方式是帮助我们改进 语言数据——特别是如果你恰好会说当前处于 alpha 支持 的一种语言。即使添加简单的分词器例外、停用词或词形还原数据也能带来很大的不同。它还将使我们更容易在未来为该语言提供训练好的流程。提交记录一个错误或性能问题的测试,或者涵盖对你的应用程序特别重要的功能的测试也很有帮助。这样,你还可以确保我们永远不会意外地对你最关心的库的部分进行回归。

有关我们正在寻找的贡献类型、代码约定和其他有用的技巧的更多详细信息,请务必查看 贡献指南

我用 spaCy 构建了一些很酷的东西——我如何让人们知道?

首先,恭喜——我们很想看看!如果你认为你的项目适合 spaCy Universe请随时提交!教程对其他用户来说也非常有价值,并且是获得曝光的好方法。因此,我们强烈建议撰写你的经验,或在你的博客上分享你的代码和一些技巧和窍门。由于我们的网站是开源的,你可以通过在 GitHub 上提出拉取请求来添加你的项目或教程。

如果你想在你的网站上使用 spaCy 徽标,请先联系我们并询问。但是,如果你想表明支持并告诉其他人你的项目正在使用 spaCy,你可以获取我们的spaCy 徽章

Built with spaCy
Made with love and spaCy