spaCy:处理流程

调用nlp时会发生什么?
spaCy流程将文本变为处理过的doc的图示
原生的流程组件
名字描述创建结果
tagger词性标注器Token.tagToken.pos
parser依存关系标注器Token.depToken.headDoc.sentsDoc.noun_chunks
ner命名实体识别器Doc.entsToken.ent_iobToken.ent_type
textcat文本分类器Doc.cats
解构后台
标注为zh_core_web_sm的包、文件夹、文件及config.cfg的图示
  • 流程是依次定义在模型的config.cfg文件里。
  • 原生组件需要二进制数据来做预测。
  • nlp.pipe_names: 流程组件名的列表
  • nlp.pipeline(name, component)元组的列表

定制化流程组件

为什么要用定制化组件?
spaCy流程图示
  • 使得一个函数在我们调用nlp时被自动执行
  • 为文档document和词符token增加我们自己的元数据
  • 更新一些原生的属性比如doc.ents
  • 函数用来读取一个doc,修改和返回它。
  • Language.component装饰器来注册。
  • 我们可以用nlp.add_pipe来添加组件。
解构组件
参数说明例子
last如果为True则加在最后面nlp.add_pipe("component", last=True)
first如果为True则加在最前面nlp.add_pipe("component", first=True)
before加在指定组件之前nlp.add_pipe("component", before="ner")
after加在指定组件之后nlp.add_pipe("component", after="tagger")

简单组件

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

返回结果如下

复杂组件

  • 定义这个定制化组件,在doc上面应用matcher
  • 给每一个匹配结果创建一个Span,添加"ANIMAL"的标签ID,然后 用这些新的span覆盖doc.ents
  • 处理文本,打印doc.ents中所有实体的实体文本和实体标签。

返回结果如下

扩展属性

设置定制化属性
  • 添加定制化元数据到文档document、词符token和跨度span中
  • 通过._属性来读取
  • 使用set_extension方法在全局的DocTokenSpan上注册。
扩展属性类别
  1. 特性(Attribute)扩展
  2. 属性(Property)扩展
  3. 方法(Method)扩展
特性(Attribute)扩展
  • 设置一个可以被覆盖的默认值。
属性(Property)扩展 (1)
  • 设置一个取值器(getter)和一个可选的赋值器(setter)函数。
  • 取值器只有当你 提取 属性值的时候才会被调用。
属性(Property)扩展 (2)
  • Span扩展大部分情况下总是需要有一个取值器。
方法(Method)扩展
  • 作为一个实例的方法引入一个函数
  • 可以向扩展函数中传入参数

设置扩展属性

  • Token.set_extension来注册"is_country"(默认是False)。
  • "Spain"更新该扩展属性,然后对所有词符打印这个属性。

返回结果如下

  • Token.set_extension来注册"reversed"(取值函数是get_reversed)。
  • 对所有词符打印这个属性的值。

返回结果如下

  • 完成get_has_number函数。
  • Doc.set_extension来注册"has_number"(取值函数是get_has_number) 并打印这个属性的值。

返回结果如下

  • Span.set_extension来注册"to_html"to_html方法)。
  • doc[0:2]上用标签"strong"来调用它。

返回结果如下

实体和扩展

  • 完成get_wikipedia_url这个取值函数,使其只有在span的标签在标签列表中时 才返回URL。
  • 用取值函数get_wikipedia_url设置Span的扩展"wikipedia_url"
  • 遍历doc中的实体,输出它们的维基百科URL。

返回结果如下

含有扩展的组件

matcher变量中已经有一个匹配所有国家的短语匹配器。CAPITALS变量中则有一个把国家名 映射到其首都城市的字典。

  • 完成countries_component_function,为所有匹配结果创建一个含有标签"GPE"(地理政治实体) 的Span
  • 把组件加入到流程中。
  • 使用取值函数get_capital注册Span的扩展属性"capital"
  • 处理文本,对每一个doc.ents中的实体打印其实体文本、实体标签和实体的首都城市。

返回结果如下

规模化和性能

处理大规模语料
  • 使用nlp.pipe方法
  • 用流模式来处理文本,生成Doc实例
  • 这比直接在每段文本上面调用nlp快得多

不好的方法:

好的方法:

传入语境(1)
  • nlp.pipe设置as_tuples=True,这样我们可以传入一些列形式为 (text, context)的元组。
  • 产生一系列(doc, context)元组。
  • 当我们要把doc关联到一些元数据时这种方法就很有用。
传入语境(2)
只用分词器(1)
spaCy流程图解
  • 不要跑整个流程!
只用分词器(2)
  • nlp.make_doc将一段文本变成Doc实例

不好的方法:

好的方法:

关闭流程组件
  • 使用nlp.select_pipes来暂时关闭一个或多个流程组件。
  • with代码块之后这些组件会重新启用
  • 这些组件关闭后spaCy流程只会跑剩余的未被关闭的组件

处理流

nlp.pipe重写这个例子。不要直接遍历文本来处理它们,而是遍历nlp.pipe产生的 doc实例。

返回结果如下

nlp.pipe重写这个例子。记着对结果调用list()来把它变为一个列表。

返回结果如下

nlp.pipe重写这个例子。记着对结果调用list()来把它变为一个列表。

在语境中处理数据

变量DATA里有一个[text, context]的示例列表。文本text是一些有名书籍的引用, 而语境context是一些键值为"author""book"的字典。

  • 使用set_extension方法在Doc上注册定制化属性"author""book",其默认值 为None
  • 使用nlp.pipe,设置as_tuples=True,处理DATA中的[text, context]对。
  • 使用传入的对应信息作为语境覆盖doc._.bookdoc._.author

返回结果如下

选择性处理

nlp.make_doc重写代码使其只对文本做分词。

返回结果如下

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

返回结果如下

LEAVE A REPLY

游客评论不支持回复他人评论内容,如需回复他人评论内容请