Skip to content

Commit

Permalink
upgrade zh course to spaCy v3
Browse files Browse the repository at this point in the history
  • Loading branch information
crownpku committed Dec 29, 2021
1 parent 37bdcbe commit d340e83
Show file tree
Hide file tree
Showing 131 changed files with 1,132 additions and 755 deletions.
55 changes: 27 additions & 28 deletions chapters/zh/chapter1.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: '第一章: 词语、短语、名字和概念的检索'
description:
"本章介绍spaCy文本处理的基础知识。
你将会学习到数据结构、构造统计模型以及如何用它们来抽取文本中的语言学特征"
你将会学习到数据结构、模型训练以及如何用它们来抽取文本中的语言学特征"
prev: null
next: /chapter2
type: chapter
Expand All @@ -18,25 +18,25 @@ id: 1

<exercise id="2" title="入门">

让我们来一起开始使用spaCy吧!这个例子中我们会尝试用到55+个[spaCy支持的语言](https://spacy.io/usage/models#languages)中的一些。
让我们来一起开始使用spaCy吧!这个例子中我们会尝试用到60+个[spaCy支持的语言](https://spacy.io/usage/models#languages)中的一些。

### 第一部分: 中文

- `spacy.lang.zh`中导入`Chinese`类然后创建`nlp`对象。
- 使用`spacy.blank`来创建一个空白的中文(`"zh"`)的`nlp`对象。
- 创建`doc`并打印其中的文本。

<codeblock id="01_02_04"></codeblock>

### 第二部分: 英语

- `spacy.lang.en`中导入`English`类然后创建`nlp`对象。
- 使用`spacy.blank`来创建一个空白的英语(`"en"`)的`nlp`对象。
- 创建`doc`并打印其中的文本。

<codeblock id="01_02_01"></codeblock>

### 第三部分: 德语

- `spacy.lang.de`中导入`German`类然后创建`nlp`对象。
- 使用`spacy.blank`来创建一个空白的德语(`"de"`)的`nlp`对象。
- 创建`doc`并打印其中的文本。

<codeblock id="01_02_02"></codeblock>
Expand All @@ -50,7 +50,7 @@ id: 1

### 第一步

- 导入`Chinese`的语言类然后创建`nlp`的对象
- 使用`spacy.blank`来创建一个中文的`nlp`对象。
- 处理文本,然后在`doc`变量中创建一个`Doc`对象的实例。
- 选取`Doc`中的第一个词符并打印出它的`text`

Expand All @@ -64,7 +64,7 @@ id: 1

### 第二步

- 导入`Chinese`的语言类然后创建`nlp`的对象
- 使用`spacy.blank`来创建一个中文的`nlp`对象。
- 处理文本,然后在`doc`变量中创建一个`Doc`对象的实例。
-`Doc`中截取其部分的词符"老虎"和"老虎和狮子"。

Expand Down Expand Up @@ -96,67 +96,66 @@ id: 1

</exercise>

<exercise id="5" title="统计模型" type="slides">
<exercise id="5" title="训练好的流程" type="slides">

<slides source="chapter1_02_statistical-models">
</slides>

</exercise>

<exercise id="6" title="模型包" type="choice">
<exercise id="6" title="流程包" type="choice">

spaCy可以读入的模型包中**不包含**以下哪项?
spaCy可以读入的流水线包中**不包含**以下哪项?

<choice>
<opt text="包含有语言、流程和许可证书的文件">
<opt text="描述如何创建流程的配置文件">

所以模型都包含一个`meta.json`,定义了启用的语言、调用的流程组件名字以及一些其它的信息,
比如模型名字、版本、许可证书、数据源、作者以及准确率的图标(如果有的话)。
所有流程都包含一个`config.cfg`,定义了初始化的语言、调用的流程组件以及该流程的训练和配置的细节信息。

</opt>
<opt text="用来做统计预测的模型二进制权重">

用来做语义标注如词性标注、依存分析或者命名实体识别的模型,包含了二进制的权重
用来做语义标注如词性标注、依存分析或者命名实体识别的流程,包含了二进制的权重

</opt>
<opt correct="true" text="模型训练使用的标注数据">
<opt correct="true" text="流程训练使用的标注数据">

统计模型可以在训练数据的基础上泛化
训练好之后模型就可以直接用二进制的权重做预测
这也是为什么我们不需要把模型当初训练时使用的训练数据也一并包含进来
训练好的流程可以在训练数据的基础上泛化
训练好之后流程就可以直接用二进制的权重做预测
这也是为什么我们不需要把流程当初训练时使用的训练数据也一并包含进来

</opt>
<opt text="模型的词典字符串以及它们的哈希值">
<opt text="流程的词典字符串以及它们的哈希值">

模型包包含了`string.json`该文件存储了模型的词典及其对应的哈希值
流程包含有`string.json`该文件存储了流程的词典及其对应的哈希值
这样spaCy在需要的时候可以直接调用哈希值来搜索到对应的词典字符串。

</opt>
</choice>

</exercise>

<exercise id="7" title="调用模型">
<exercise id="7" title="调用流程">

这门课中我们需要使用的模型都已经预装好了
如果你想了解更多关于spaCy的统计模型以及如何在自己的电脑上安装这些模型
这门课中我们需要使用的流程都已经预装好了
如果你想了解更多关于spaCy的预训练流程以及如何在自己的电脑上安装这些模型
可以参考[这份文档](https://spacy.io/usage/models)

- 使用`spacy.load`来调用一个比较小的中文模型`"zh_core_web_sm"`
- 使用`spacy.load`来调用一个比较小的中文流程`"zh_core_web_sm"`
- 处理文档并打印出文档中的文字。

<codeblock id="01_07">

要调用一个模型,我们可以调用`spacy.load`加上模型对应名字的字符串
模型的名字会因为语言和训练数据的不同而有所变化,所以请确保使用了正确的名字。
要调用一个流程,我们可以调用`spacy.load`加上流程对应名字的字符串
流程的名字会因为语言和训练数据的不同而有所变化,所以请确保使用了正确的名字。

</codeblock>

</exercise>

<exercise id="8" title="语言学标注的预测">

我们现在来试试spaCy的一个已经预训练好的模型包看看它在实际预测中的表现
我们现在来试试spaCy的一个已经训练好的流程包看看它在实际预测中的表现
你完全可以在自己设定的文本中做测试!
如果你对某一个标注或者标签不清楚,可以在代码中调用`spacy.explain`
举个例子,`spacy.explain("PROPN")`或者`spacy.explain("GPE")`.
Expand Down Expand Up @@ -190,7 +189,7 @@ spaCy可以读入的模型包中**不包含**以下哪项?

<exercise id="9" title="命名实体在情境中的预测">

模型是基于统计学的但并不是_永远_正确。模型的预测是否正确取决于训练数据和我们要处理的文本。
模型是基于统计学的但并不是 _永远_ 正确。模型的预测是否正确取决于训练数据和我们要处理的文本。
我们来看一个例子:

- 使用`nlp`对象来处理文本
Expand Down
15 changes: 7 additions & 8 deletions chapters/zh/chapter2.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,11 @@ id: 2
为什么这段代码抛出了错误信息?

```python
from spacy.lang.en import English
from spacy.lang.de import German
import spacy

# 创建一个英文和德文的nlp实例
nlp = English()
nlp_de = German()
nlp = spacy.blank("en")
nlp_de = spacy.blank("de")

# 获取字符串'Bowie'的ID
bowie_id = nlp.vocab.strings["Bowie"]
Expand Down Expand Up @@ -244,15 +243,15 @@ for index, pos in enumerate(pos_tags):

<exercise id="9" title="检查词向量">

在这个练习中我们要用到一个更大的[中文模型](https://spacy.io/models/zh)
在这个练习中我们要用到一个更大的[中文流程](https://spacy.io/models/zh)
该模型有大概两万个词向量。这里模型已经提前安装好了。

- 读取中等大小的`"zh_core_web_md"`模型,该模型含有词向量
- 读取中等大小的`"zh_core_web_md"`流程,该流程含有词向量
-`token.vector`属性来打印`"老虎"`的向量。

<codeblock id="02_09">

-`spacy.load`调用模型名字来读取统计模型
-`spacy.load`调用流程名字来读取训练好的流程
- 可以直接用索引来读取doc中的一个词符token,比如`doc[4]`

</codeblock>
Expand Down Expand Up @@ -293,7 +292,7 @@ for index, pos in enumerate(pos_tags):

</exercise>

<exercise id="11" title="结合模型与规则" type="slides">
<exercise id="11" title="结合流程与规则" type="slides">

<slides source="chapter2_04_models-rules">
</slides>
Expand Down
28 changes: 15 additions & 13 deletions chapters/zh/chapter3.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,18 @@ spaCy的所有运算都在本机,并不需要连接任何远端服务器。

<opt text="初始化相应的语言,加入流程并读取模型中的二进制权重。">

当我们调用`spacy.load()`来读取模型时,spaCy会初始化相应语言,加入流程并读取
模型的二进制权重。当我们在文本上调取`nlp`之前模型就已经被读取了
当我们调用`spacy.load()`来读取流程时,spaCy会初始化相应语言,加入流程并读取
模型的二进制权重。当我们在文本上调取`nlp`之前流程就已经被读取了

</opt>

</exercise>

<exercise id="3" title="流程的检查">

让我们一起检查一下中文小模型的流程
让我们一起检查一下小规模的中文流程

- 读取`zh_core_web_sm`模型并创建`nlp`实例。
- 读取`zh_core_web_sm`流程并创建`nlp`实例。
-`nlp.pipe_names`来打印流程组件的名字。
-`nlp.pipeline`来打印`(name, component)`元组的完整流程。

Expand All @@ -84,7 +84,7 @@ spaCy的所有运算都在本机,并不需要连接任何远端服务器。

下面这些问题中那些可以用定制化组件来解决?请选择所有正确的答案。

1. 更新预训练模型来改进其性能
1. 更新训练好的流程来改进其性能
2. 基于词符及其属性来计算我们自己定义的变量
3. 基于比如一个词典来增加新的命名实体
4. 编写对某种新语种的支持
Expand Down Expand Up @@ -142,13 +142,13 @@ spaCy的所有运算都在本机,并不需要连接任何远端服务器。
你能完成这段代码吗?

-`doc`长度来完成组件函数。
- 加入`length_component`到现有的流程中,作为其**第一个**组件。
- 加入`"length_component"`到现有的流程中,作为其**第一个**组件。
- 试用这个新的流程,用`nlp`实例来处理一段任意的文本,比如"这是一个句子。"。

<codeblock id="03_06">

- 我们可以调用Python原生的`len()`方法来获取`Doc`实例的长度。
- 使用`nlp.add_pipe`方法把组件加入到流程中。记住要把`first`关键词参数设置为
- 使用`nlp.add_pipe`方法把组件加入到流程中。记住要使用组件的字符串名字并且把`first`关键词参数设置为
`True`来保证这个组件是被添加到其它所有组件之前的。
- 调用`nlp`实例来处理一段本文。

Expand All @@ -172,6 +172,7 @@ spaCy的所有运算都在本机,并不需要连接任何远端服务器。
- 注意所有的匹配结果是在一个`(match_id, start, end)`元组的列表中。
- `Span`类有四个参数:产生它的原始`doc`、起始索引、终止索引和标签。
-`nlp.add_pipe`上使用`after`关键词参数来把组件添加到另一个组件后面。
记住要使用组件的字符串名字。

</codeblock>

Expand Down Expand Up @@ -246,7 +247,7 @@ spaCy的所有运算都在本机,并不需要连接任何远端服务器。

<exercise id="11" title="实体和扩展">

在这个练习中,我们要结合定制化属性扩展和模型的预测结果,创建一个属性取值函数,当
在这个练习中,我们要结合定制化属性扩展和统计预测结果,创建一个属性取值函数,当
span为一个人、组织或者位置时返回其维基百科的查询URL。

- 完成`get_wikipedia_url`这个取值函数,使其只有在span的标签在标签列表中时
Expand All @@ -272,7 +273,7 @@ span为一个人、组织或者位置时返回其维基百科的查询URL。
`matcher`变量中已经有一个匹配所有国家的短语匹配器。`CAPITALS`变量中则有一个把国家名
映射到其首都城市的字典。

- 完成`countries_component`,为所有匹配结果创建一个含有标签`"GPE"`(地理政治实体)
- 完成`countries_component_function`,为所有匹配结果创建一个含有标签`"GPE"`(地理政治实体)
`Span`
- 把组件加入到流程中。
- 使用取值函数`get_capital`注册Span的扩展属性`"capital"`
Expand Down Expand Up @@ -354,7 +355,7 @@ span为一个人、组织或者位置时返回其维基百科的查询URL。

<exercise id="16" title="选择性处理">

在这个练习中,我们使用`nlp.make_doc``nlp.disable_pipes`方法只运行我们选择的
在这个练习中,我们使用`nlp.make_doc``nlp.select_pipes`方法只运行我们选择的
组件来处理文本。

### 第一部分
Expand All @@ -369,13 +370,14 @@ span为一个人、组织或者位置时返回其维基百科的查询URL。

### 第二部分

-`nlp.disable_pipes`方法关闭词性标注和依存关系分析的组件
-`nlp.select_pipes`方法关闭词性标注(tagger)和词性还原(lemmatizer)的组件
- 处理文本,将所有`doc`中的结果实体打印出来。

<codeblock id="03_16_02">

`nlp.disable_pipes`方法有一些可变数目的参数:那些想要关闭的流程组件的字符串名。
比如`nlp.disable_pipes("ner")`就会把命名实体识别器关掉。
`nlp.select_pipes`方法可以接收关键字参数`enbale`或者`disable`
读入一个组件名的列表来启用或者关闭相应的流程组件。
比如`nlp.select_pipes(disable="ner")`就会把命名实体识别器关掉。

</codeblock>

Expand Down
Loading

0 comments on commit d340e83

Please sign in to comment.