使用spaCy构建可定制NLP管道

使用spaCy构建可定制NLP管道

NLP简介

自然语言处理(NLP):从非结构化语言中提取结构化知识

spaCy工具概述

  • 研究概述、教程、数据集、库
  • Node.js、Python、C++、Java、Kotlin、Scala、R、Clojure、Ruby、Rust
  • 专注于spaCy库的功能性
  • Python + Cython(速度快!)
  • 专注于生产环境使用
  • 可配置、可定制、可扩展、可重新训练
  • 由开源DL库thinc提供支持
  • 开源(MIT许可证):https://github.com/explosion/spaCy/
  • 与其他NLP库的比较:https://spacy.io/usage/facts-figures

spaCy管道

文档 → 文本 → nlp处理 → 分词器 → 标注器 → 解析器 → 命名实体识别…

预训练模型

pip install spacy
python -m spacy download en_core_web_lg

import spacy
nlp = spacy.load('en_core_web_lg')
doc = nlp(text)

from spacy import displacy
displacy.serve(doc, style='ent')

print([(token.text, token.pos_) for token in doc])
  • 为10种语言提供预训练模型

定制分词器

from spacy.symbols import ORTH
nlp.tokenizer.add_special_case("Silo.AI", [{ORTH: "Silo.AI"}])
  • 为50种语言提供内置的特定语言规则
  • 欢迎提交改进您最喜欢语言的拉取请求!
  • 使用您自己的规则扩展默认规则
  • 定义特定的分词异常
  • 实现全新的分词器

(重新)训练模型

TRAIN_DATA = [
    ("Filip Ginter works for Silo.AI.", {"entities": [(0, 12, "PERSON"), (24, 30, "ORG")]}),
    ()
]

for itn in range(n_iter):
    random.shuffle(TRAIN_DATA)
    batches = minibatch(TRAIN_DATA)
    losses = {}
    for batch in batches:
        texts, annotations = zip(*batch)
        nlp.update(texts, annotations, sgd=optimizer, drop=0, losses=losses)
    print(f"Loss at {itn} is {losses['ner']}")

optimizer = nlp.begin_training()
optimizer = nlp.resume_training()

重新训练/优化现有的ML模型:

  • 添加新标签(如NER)
  • 输入新数据
  • 确保模型不会"忘记"之前学到的内容!
  • 同时输入"旧"示例

CLI训练

python -m spacy convert ud-treebanks-v2.4\UD_Finnish-TDT\fi_tdt-ud-train.conllu fi_json
python -m spacy convert ud-treebanks-v2.4\UD_Finnish-TDT\fi_tdt-ud-dev.conllu fi_json
python -m spacy train fi output fi_json\fi_tdt-ud-train.json fi_json\fi_tdt-ud-dev.json

从头开始训练ML模型:

  • 内置对UD注释的支持

注意:这不会自动给出最先进的结果…
没有调优、超参数选择或特定语言定制(尚未)!

spaCy v.3:更可配置的管道

(由Thinc v.8提供支持)

Thinc v.8

  • 新的深度学习库
  • 2020年1月发布
  • 多年来一直为spaCy提供支持
  • 为Python 3完全改造
  • 类型注释
  • 函数式编程概念:没有计算图,只有高阶函数
  • PyTorch、MXNet和TensorFlow的包装器
  • 广泛的文档:https://thinc.ai
def relu(inputs: Floats2d) -> Tuple[Floats2d, Callable[[Floats2d], Floats2d]]:
    mask = inputs >= 0
    def backprop_relu(d_outputs: Floats2d) -> Floats2d:
        return d_outputs * mask
    return inputs * mask, backprop_relu
  • 层执行前向函数
  • 返回前向结果 + 反向传播的调用
  • 反向传播计算输入的梯度,给定输出的梯度

类型检查

  • 通过用适当的类型注释变量,可以防止错误!
  • 促进自动完成
  • 使用mypy

配置

THINC.AI

  • 配置文件
  • 内置注册函数
  • 定义您自己的函数
  • 所有超参数明确定义
  • 所有对象在解析配置时构建

从配置训练

python -m spacy train-from-config fi train.json dev.json config.cfg

即将推出

  • 完全控制所有设置和参数
  • 配置可以轻松保存和共享
  • 快速运行实验,例如交换不同的tok2vec组件
  • 完全支持预训练的BERT、XLNet和GPT-2(参见spacy-transformers包)
  • 也称为"启动器模型"
  • 关注spaCy v.3!

新管道组件

共指消解

→ 链接引用同一事物/人的实体
→ 例如,“他"指的是"Nader”
Hugging Face的neuralcoref包与spaCy配合使用

实体链接(EL)

文本中所有这些Byron都是谁?

EL示例

Johny Carson:美国脱口秀主持人,还是美式足球运动员?
Russ Cochran:美国高尔夫球手,还是出版商?
Rose:英国足球运动员,还是电视剧《神秘博士》中的角色?

EL框架

步骤0:假设NER已经在原始文本上发生,因此我们有实体+标签
步骤1:候选生成:为提及创建可能的WikiData ID列表
步骤2:实体链接:将这些候选消歧为最可能的ID

文本 → NER → NER提及 → 每个提及的候选列表 → 候选生成 → EL → 每个提及的一个实体ID

Ms Byron would become known as the first programmer.
Byron: PERSON
Q7259 Q5679: Lord George Gordon Byron
Q272161: Anne Isabella Byron
Q7259: Ada Lovelace

新闻准确性

→ 在165K篇维基百科文章上训练卷积神经网络模型
→ 用于评估的手动注释新闻数据:360个实体链接
→ 添加共指消解:
• 同一共指链中的所有实体应链接到同一实体
• 分配链中置信度最高的KB ID
• 性能(EL+先验)下降到70.9% → 需要进一步工作

上下文语料库统计黄金标签准确性
随机基线--33.4%
仅实体链接x-60.1%
先验概率基线-x67.2%
EL + 先验概率xx71.4%
Oracle KB性能xx85.2%

总结

spaCy是一个生产就绪的Python NLP库,可让您快速实现文本挖掘解决方案,并且可扩展和可重新训练。3.0版将带来许多酷炫的新功能!

Thinc是一个新的深度学习库,广泛使用类型注释并支持配置文件。

Prodigy是某机构的注释工具,由主动学习提供支持。

@explosion_ai @oxykodit @spacy.io

问题?

没有愚蠢的问题——所以让我们假设也没有愚蠢的答案。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值