1
2
3
4
5
6
7
8
英文题目:N-LTP: An Open-source Neural Language Technology Platform for Chinese
中文题目:开源中文神经网络语言技术平台 N-LTP
论文地址:https://arxiv.org/pdf/2009.11616v4.pdf
代码:https://github.com/HIT-SCIR/ltp
发表时间:2021
作者:Wanxiang Che 等,哈工大
出处:EMNLP
被引量:18+

1 读后感

它是一个基于Pytorch的针对中文离线工具,带训练好的模型,最小模型仅 164M。直接支持分词,命名实体识别等六种任务,六种任务基本都围绕分词、确定词的成份、关系。

实测:比想象中好用,如果用于识别人名,效果还可以,直接用于垂直领域,效果一般,可能还需要进一步精调。

Pasted image 20220620152139.png

2 介绍

2.1 文章贡献

  • 支持六项中文自然语言任务。
  • 基于多任务框架,共享知识,减少内存用量,加快速度。
  • 高扩展性:支持用户引入的 BERT 类模型
  • 容易使用:支持多语言接口 C++, Python, Java, Rust
  • 达到比之前模型更好的效果

3 设计和架构

Pasted image 20220620153735.png

图 -2 展示了软件架构,由一个多任务共享的编码层和各任务别实现的解码层组成。

3.1.1 共享编码层

使用预训练的模型 ELECTRA,输入序列是 s=(s1,s2,...,sn),加入符号将其变成 s = ([CLS], s1, s2,..., sn, [SEP]),请见 BERT 原理,输出为对应的隐藏层编码

H = (h[CLS],h1, h2,..., hn, h[SEP])。

3.1.2 中文分词 CWS

将编码后的 H 代入线性解码器,对每个字符分类:

Pasted image 20220620154431.png

y 是每个字符类别为各标签的概率。

3.1.3 位置标注 POS

位置标注也是 NLP 中的一个重要任务,用于进一步的语法解析。目前的主流方法是将其视为序列标注问题。也是将编码后的 H 作为输入,输出位置的标签:

Pasted image 20220620154810.png

y 是该位置字符属于某一标签的概率,其中 i 是位置信息。

3.1.4 命名实体识别 NER

命名实体识别的目标是寻找实体的开始位置和结束位置,以及该实体的类别。工具中使用 Adapted-Transformer 方法,加入方向和距离特征:

Pasted image 20220620155424.png

最后一步也使用线性分类器计算每个词的类别:

Pasted image 20220620155409.png

其中 y 是 NER 属于某一标签的概率。

3.1.5 依赖性解析 DEP

依赖性解析主要是分析句子的语义结构(详见网上示例),寻找词与词之间的关系。软件中具体使用了双仿射神经网络和 einser 算法。

Pasted image 20220620160302.png
Pasted image 20220620160323.png

3.1.6 语义依解析 SDP

与依赖性分析相似,语义依赖分析也是捕捉句子的语义结构。它将句子分析成一棵依存句法树,描述出各个词语之间的依存关系。也即指出了词语之间在句法上的搭配关系,这种搭配关系是和语义相关联的。具体包括:主谓关系 SBV,动宾关系 VOB,定中关系 ATT 等,详见:

从0到1,手把手教你如何使用哈工大NLP工具——PyLTP

具方法是查找语义上相互关联的词对,并找到预定义的语义关系。实现也使用了双仿射模型。

Pasted image 20220620160718.png

当 p>0.5 时,则认为词 i 与 j 之间存在关联。

3.1.7 语义角色标注 SRL

语义角色标注主要目标是识别句子以谓语为中心的结构,具体方法是使用端到端的 SRL 模型,它结合了双仿射神经网络和条件随机场作为编码器,条件随机场公式如下:

Pasted image 20220620162307.png

其中 f 用于计算从 yi,j-1 到 yi,j 的转移概率。

3.1.8 知识蒸馏

为了比较单独训练任务和多任务训练,引入了 BAM 方法:

Pasted image 20220620162821.png

4 用法

4.1 安装

1
$ pip install ltp

4.2 在线 demo

http://ltp.ai/demo.html

4.3 示例代码

4.3.1 旧 API

1
2
3
4
5
6
7
8
9
from ltp import LTP

ltp = LTP()
seg, hidden = ltp.seg(["他叫汤姆去拿外衣。"])
pos = ltp.pos(hidden)
ner = ltp.ner(hidden)
srl = ltp.srl(hidden)
dep = ltp.dep(hidden)
sdp = ltp.sdp(hidden)

其中 seg 函数实现了分词,并输出了切分结果,及各词的向量表示。

4.3.2 新 API

(220923)

1
2
3
4
5
output = ltp.pipeline(["他叫汤姆去拿外衣。"], tasks=["cws", "pos", "ner", "srl", "dep", "sdp"])
# 使用字典格式作为返回结果
print(output.cws) # print(output[0]) / print(output['cws']) # 也可以使用下标访问
print(output.pos)
print(output.sdp)

4.4 精调模型

下载源码

1
$ git clone https://github.com/HIT-SCIR/ltp

在其 ltp 目录中有 task_xx.py,可训练及调优模型,用法详见 py 内部的示例。形如:

1
python ltp/task_segmention.py --data_dir=data/seg --num_labels=2 --max_epochs=10 --batch_size=16 --gpus=1 --precision=16 --auto_lr_find=lr

5 实验

Stanza 是支持一个多语言的 NLP 工具,中文建模效果比较如下:

Pasted image 20220620164258.png
Pasted image 20220620164616.png

另外,实验也证明,使用联合模型速度更快,占用内存更少。

6 使用方法

  • 需要从 huggingface 下载模型,详见 README.md
  • 模型都不大,每个几百兆
  • CPU 版本转换一句不到 1s,大概 50 句/秒
  • 当前版本(230911)感知机算法 Legacy 模型速度非常快,是 LTP v3 的 3.55 倍,开启多线程更可获得 17.17 倍的速度提升,但目前仅支持分词、词性、命名实体任务

7 参考

用法示例:LTP--提取时间人物地点