开始使用

spaCy 101:你需要知道的一切

最重要的概念,用简单的语言解释

无论你是spaCy的新手,还是只想温习一些NLP基础知识和实现细节——本页面都能满足你的需求。每个章节都会用简单的语言和示例或图示来解释spaCy的一项功能。部分章节还会在使用指南中重复出现,作为快速入门介绍。

什么是spaCy?

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

如果你需要处理大量文本,最终会想要深入了解其内容。例如:文本的主题是什么?词语在上下文中的含义是什么?谁对谁做了什么?提到了哪些公司和产品?哪些文本彼此相似?

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

spaCy不是什么

  • spaCy不是一个平台或"API"。与平台不同,spaCy不提供软件即服务或网络应用程序。它是一个开源库,旨在帮助你构建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置于正确状态。

Linguistic annotations

spaCy提供多种语言注释,帮助您深入理解文本的语法结构。这包括词性标注(如词类划分)以及词语之间的关联关系。例如,在分析文本时,判断一个名词是句子的主语还是宾语会产生巨大差异——同样,"google"是被用作动词,还是在特定上下文中指代网站或公司名称,也会带来完全不同的解析结果。

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

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

尽管Doc经过处理——例如被分割成单个词语并添加注释——它仍然保留原始文本的所有信息,比如空格字符。你总是可以获取某个词符在原始字符串中的偏移量,或者通过连接词符及其尾部空格来重建原始文本。这种方式确保你在使用spaCy处理文本时永远不会丢失任何信息。

Tokenization

在处理过程中,spaCy首先会对文本进行分词,也就是将其分割成单词、标点符号等。这是通过应用针对每种语言的特定规则来完成的。例如,句子末尾的标点符号应该被分开——而"U.K."则应保持为一个词元。每个Doc由独立的词元组成,我们可以遍历它们:

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

012345678910
苹果正在考虑收购英国初创公司价格$1十亿

首先,原始文本会按照空白字符进行分割,类似于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 将所有字符串编码为哈希值以减少内存使用并提高 效率。因此要获取属性的可读字符串表示形式,我们 需要在属性名称后添加下划线_

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

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

使用spaCy内置的displaCy可视化工具,以下是我们示例句子及其依存关系的展示效果:

命名实体 需要模型

命名实体是指被赋予名称的"现实世界对象",例如人物、国家、产品或书名。spaCy能够通过模型预测来识别文档中的各类命名实体。由于模型是基于统计的,且高度依赖其训练样本,因此效果并非总是完美,根据具体使用场景可能需要进行后续调整。

命名实体可以通过Docents属性获取:

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

文本起始位置结束位置标签描述
Apple05ORGCompanies, agencies, institutions.
U.K.2731GPEGeopolitical entity, i.e. countries, cities, states.
$1 billion4454MONEYMonetary values, including unit.

使用spaCy内置的displaCy可视化工具,以下是我们示例句子及其命名实体的展示效果:

Apple ORG is looking at buying U.K. GPE startup for $1 billion MONEY

词向量与相似度 需要模型

相似度是通过比较词向量或"词嵌入"来确定的,即词语的多维语义表示。词向量可以使用类似word2vec的算法生成,通常呈现如下形式:

banana.vector

内置词向量的Pipeline包使它们可以通过Token.vector属性获取。 Doc.vectorSpan.vector默认会返回其词向量的平均值。您还可以检查一个词是否分配了向量,并获取L2范数(可用于向量归一化)。

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

单词"dog"、"cat"和"banana"在英语中都非常常见,因此它们是spacy词汇表的一部分,并且拥有对应的词向量。而单词"afskfsd"则非常罕见且属于词汇表外(OOV)词汇——所以它的向量表示由300维的0组成,这意味着它实际上不存在。如果您的应用程序需要更大的词汇量和更多向量,您应该考虑使用更大的spacy模型包或加载完整的词向量包,例如en_core_web_lg,它包含68.5万个独特向量

spaCy能够比较两个对象,并预测它们的相似程度。预测相似度对于构建推荐系统或标记重复内容非常有用。例如,您可以向用户推荐与他们当前查看内容相似的资讯,或者当支持工单与已有工单高度相似时将其标记为重复。

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

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

相似度结果的预期

计算相似度分数在许多情况下都很有帮助,但对其能提供的信息保持现实的预期也很重要。词语之间可以通过多种方式相互关联,因此单一的"相似度"分数始终是不同信号的混合体,而且基于不同数据训练的向量可能产生差异很大的结果,这些结果可能并不符合您的需求。以下是需要牢记的一些重要考量因素:

  • 相似性没有客观的定义。"我喜欢汉堡"和"我喜欢意大利面"是否相似取决于您的应用场景。两者都谈论食物偏好,这使得它们非常相似——但如果您在分析提及的食物时,这些句子就相当不同了,因为它们谈论的是完全不同的食物。
  • DocSpan对象的相似度默认采用平均词向量计算。这意味着"fast food"的向量是"fast"和"food"向量的平均值,这种计算方式不一定能准确反映短语"fast food"的含义。
  • 向量平均意味着多个标记的向量对单词的顺序不敏感。两个用不同措辞表达相同含义的文档将返回较低的相似度分数,而两个恰好包含相同单词但表达不同含义的文档则会获得较高分数。

Pipelines

当你对文本调用nlp时,spaCy首先会对文本进行分词以生成Doc对象。然后Doc会经过多个不同步骤的处理——这也被称为处理管道训练好的管道通常包含词性标注器、词形还原器、依存分析器和实体识别器。每个管道组件都会返回处理后的Doc对象,然后传递给下一个组件。

The processing pipeline
名称组件创建内容描述
tokenizerTokenizerDocSegment text into tokens.
处理流程
taggerTaggerToken.tagAssign part-of-speech tags.
parserDependencyParserToken.head, Token.dep, Doc.sents, Doc.noun_chunksAssign dependency labels.
nerEntityRecognizerDoc.ents, Token.ent_iob, Token.ent_typeDetect and label named entities.
lemmatizerLemmatizerToken.lemmaAssign base forms.
textcatTextCategorizerDoc.catsAssign document labels.
customcustom componentsDoc._.xxx, Token._.xxx, Span._.xxxAssign custom attributes, methods or properties.

处理管道的能力始终取决于其组件、模型及训练方式。例如,一个命名实体识别管道需要包含训练好的命名实体识别器组件,该组件需配备统计模型和权重,使其能够预测实体标签。这就是为什么每个管道都会在config中指定其组件及配置:

统计组件如词性标注器或解析器通常是独立的,彼此之间不共享任何数据。例如,命名实体识别器不会使用标注器和解析器设置的任何特征,依此类推。这意味着您可以替换它们,或从处理流程中移除单个组件而不影响其他组件。然而,组件可能会共享一个"token-to-vector"组件,如Tok2VecTransformer。您可以在嵌入层文档中了解更多相关信息。

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

分词器是一个"特殊"组件,不属于常规处理流程的一部分。 它也不会出现在nlp.pipe_names中。原因是实际上只能有一个分词器,而其他所有流程组件都接收Doc并返回它,分词器则是接收文本字符串并将其转换为Doc。不过您仍然可以自定义分词器。nlp.tokenizer是可写的,因此您既可以Tokenizer class from scratch从头创建自己的分词器类,也可以用entirely custom function完全自定义的函数来替换它。


架构

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

文本标注的设计也遵循单一数据源原则:Doc对象拥有数据,而SpanToken指向该数据的视图Doc对象由Tokenizer构建,然后被流水线组件原地修改Language对象负责协调这些组件,它接收原始文本并通过流水线处理,最终返回一个标注文档,同时还负责管理训练和序列化流程。

Library architecture {w:1080, h:1254}

容器对象

名称描述
DocA container for accessing linguistic annotations.
DocBinA collection of Doc objects for efficient binary serialization. Also used for training data.
ExampleA collection of training annotations, containing two Doc objects: the reference data and the predictions.
LanguageProcessing class that turns text into Doc objects. Different languages implement their own subclasses of it. The variable is typically called nlp.
LexemeAn entry in the vocabulary. It’s a word type with no context, as opposed to a word token. It therefore has no part-of-speech tag, dependency parse etc.
SpanA slice from a Doc object.
SpanGroupA named collection of spans belonging to a Doc.
TokenAn individual token — i.e. a word, punctuation symbol, whitespace, etc.

处理流程

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

The processing pipeline
名称描述
AttributeRulerSet token attributes using matcher rules.
DependencyParserPredict syntactic dependencies.
EditTreeLemmatizerPredict base forms of words.
EntityLinkerDisambiguate named entities to nodes in a knowledge base.
EntityRecognizerPredict named entities, e.g. persons or products.
EntityRulerAdd entity spans to the Doc using token-based rules or exact phrase matches.
LemmatizerDetermine the base forms of words using rules and lookups.
MorphologizerPredict morphological features and coarse-grained part-of-speech tags.
SentenceRecognizerPredict sentence boundaries.
SentencizerImplement rule-based sentence boundary detection that doesn’t require the dependency parse.
TaggerPredict part-of-speech tags.
TextCategorizerPredict categories or labels over the whole document.
Tok2VecApply a “token-to-vector” model and set its outputs.
TokenizerSegment raw text and create Doc objects from the words.
TrainablePipeClass that all trainable pipeline components inherit from.
TransformerUse a transformer model and set its outputs.
Other functionsAutomatically apply something to the Doc, e.g. to merge spans of tokens.

Matchers

匹配器(Matchers)帮助您根据描述目标序列的匹配模式,从Doc对象中查找和提取信息。匹配器在Doc上运行,并让您能在上下文中访问匹配到的词元。

名称描述
DependencyMatcherMatch sequences of tokens based on dependency trees using Semgrex operators.
MatcherMatch sequences of tokens, based on pattern rules, similar to regular expressions.
PhraseMatcherMatch sequences of tokens based on phrases.

其他类

名称描述
CorpusClass for managing annotated corpora for training and evaluation data.
KnowledgeBaseAbstract base class for storage and retrieval of data for entity linking.
InMemoryLookupKBImplementation of KnowledgeBase storing all data in memory.
CandidateObject associating a textual mention with a specific entity contained in a KnowledgeBase.
LookupsContainer for convenient access to large lookup tables and dictionaries.
MorphAnalysisA morphological analysis.
MorphologyStore morphological analyses and map them to and from hash values.
ScorerCompute evaluation scores.
StringStoreMap strings to and from hash values.
VectorsContainer class for vector data keyed by string.
VocabThe shared vocabulary that stores strings and gives you access to Lexeme objects.

Vocab, hashes and lexemes

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

Doc, Vocab, Lexeme and StringStore

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

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

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

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

文本原词形状前缀后缀是否为字母是否为数字
I4690420944186131903XIITrueFalse
love3702023516439754181xxxxloveTrueFalse
coffee3197928453018144401xxxxcfeeTrueFalse

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

然而,哈希值无法被逆向还原,无法将3197928453018144401重新解析为"coffee"。spaCy唯一能做的是在词汇表中查找它。这就是为什么你必须确保创建的所有对象都能访问相同的词汇表。如果无法做到这一点,spaCy可能无法找到所需的字符串。

可编辑代码spaCy v3.7 · Python 3 · 通过 Binder

如果词汇表中不包含字符串3197928453018144401,spaCy会报错。你可以手动重新添加"coffee"这个词,但这仅在你确实知道文档包含该词时才有效。为避免这个问题,当你保存Docnlp对象时,spaCy也会导出Vocab。这将为你提供对象及其编码注释,以及解码所需的"密钥"。

序列化

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

所有容器类,即 Language (nlp), Doc, VocabStringStore 都提供以下方法:

方法返回值示例
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"极有可能指代公司。因此训练数据必须始终能代表我们想要处理的数据类型。一个基于维基百科训练的模型(其中第一人称句子极为罕见)在推特数据上可能表现糟糕。同样地,用言情小说训练的模型在法律文本上也可能表现不佳。

这也意味着,为了了解模型的表现以及它是否在学习正确的内容,你不仅需要训练数据——还需要评估数据。如果只用训练数据来测试模型,你将无法知道它的泛化能力如何。如果想从头开始训练一个模型,通常至少需要几百个训练和评估样本。

训练配置与生命周期

训练配置文件包含训练流程所需的全部设置和超参数。您无需在命令行提供大量参数,只需将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
stop_words.py
List of most common words of a language that are often useful to filter out, for example “and” or “I”. Matching tokens will return True for is_stop.
Tokenizer exceptions
tokenizer_exceptions.py
Special-case rules for the tokenizer, for example, contractions like “can’t” and abbreviations with punctuation, like “U.K.”.
Punctuation rules
punctuation.py
Regular expressions for splitting tokens, e.g. on punctuation or special characters like emoji. Includes rules for prefixes, suffixes and infixes.
Character classes
char_classes.py
Character classes to be used in regular expressions, for example, Latin characters, quotes, hyphens or icons.
Lexical attributes
lex_attrs.py
Custom functions for setting lexical attributes on tokens, e.g. like_num, which includes language-specific words like “ten” or “hundred”.
Syntax iterators
syntax_iterators.py
Functions that compute views of a Doc object based on its syntax. At the moment, only used for noun chunks.
Lemmatizer
lemmatizer.py spacy-lookups-data
Custom lemmatizer implementation and lemmatization tables.

社区与常见问题

我们非常高兴看到spaCy社区不断发展壮大,吸引了来自各种不同背景的成员——包括计算语言学、数据科学、深度学习、研究等领域。如果您想参与其中,以下是一些重要问题的解答以及进一步阅读的资源。

Help, my code isn’t working!

Bug很烦人,我们正在尽最大努力持续改进测试并尽快修复问题。在提交问题之前,请先快速搜索并检查该问题是否已被报告。如果您遇到安装或加载问题,请务必查看故障排除指南。spaCy的帮助可通过以下平台获取:

  • Stack Overflow: 使用问题以及所有与您特定代码问题相关的内容。Stack Overflow社区比我们的社区大得多,因此如果其他人能解决您的问题,您将更快获得帮助。
  • GitHub discussions: 一般讨论项目构想使用问题。与其他社区成员交流,获取具体代码实现的帮助,讨论新项目/插件的想法,支持更多语言,并分享最佳实践。
  • GitHub issue tracker: Bug reports改进建议, 即所有可能是spaCy的问题。这还包括训练管道中超出统计误差范围的问题,比如指向bug的模式。

如何为spaCy做贡献?

您不需要成为NLP专家或Python高手即可参与贡献,我们很乐意帮助您入门。如果您是spaCy的新手,可以从GitHub上的help wanted (easy)标签开始,我们用它来标记那些简单且独立的问题和功能请求。我们也欢迎对文档的贡献——无论是修正拼写错误、改进示例还是添加额外说明。您会在每页底部找到一个"建议编辑"链接,它将引导您到源代码。

另一种参与方式是帮助我们改进 语言数据——尤其是当您 恰好会说当前处于 alpha支持阶段的某种语言时。即使是添加简单的分词器 例外情况、停用词或词形还原数据也能产生重大影响。这还将 使我们未来更容易为该语言提供训练好的处理流程。提交记录错误或性能问题的测试用例, 或覆盖对您的应用特别重要的功能也非常 有帮助。通过这种方式,您还能确保我们永远不会意外地对您最关心的库部分 引入回归问题。

如需了解更多关于我们寻求的贡献类型、代码规范和其他实用建议,请务必查阅贡献指南

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

首先,恭喜你——我们很乐意查看你的作品!如果你认为自己的项目适合加入spaCy Universe欢迎随时提交!教程对其他用户也极具价值,是获得曝光的好方法。因此我们强烈建议撰写你的经验分享,或在博客上分享代码及实用技巧。由于我们的网站是开源的,你可以通过GitHub提交pull request来添加你的项目或教程。

如果您想在网站上使用spaCy徽标,请先联系我们并征得许可。不过,如果您想表示支持并告知他人您的项目正在使用spaCy,可以在此获取我们的spaCy徽章

Built with spaCy
Made with love and spaCy