词性标注任务是将给定句子中的每个单词从给定标签组 (tag set)中赋予一个词性标签 (part-of-speech tag)。中文词性标注任务示例: 中文词性标注可以采用分词后的词序列作为输入, 模型输出每个词的词性标签。基于预训练语言模型的词性标注模型通常采用联合分词+词性标注的序列标注模型。这里我们基于通用新闻领域CTB9标注数据训练模型, 采用无监督统计特征增强的StructBERT+softmax序列标注模型,序列标注标签体系(B、I、E、S),四个标签分别表示标签处于该单词的起始、中间、终止位置或者改单词独立成词; 以StructBERT预训练语言模型为底座的序列标注模型可以参考下面的模型图: StructBERT预训练语言模型可以参考 StructBERT: Icorporatig Laguage Structures ito Pre-traiig for Deep Laguage Uderstadig。为了进一步提升中文词性标注模型的效果,在StructBERT模型基础上, 通过在预训练过程中增加大规模无监督词汇边界统计信息可以有效提升预训练模型对词汇边界的识别能力。我们实验验证融合词汇边界信息的预训练模型Boudary Aware StructBERT (BAStructBERT)模型在绝大多数中文序列标注任务上有进一步的效果提升。BAStructBERT模型结构和基础的StructBERT模型一致, BAStructBERT模型的预训练流程示意图如下所示, 更加详细的模型结构和实验结果将在后续公开的论文中介绍。 CTB标注数据采用的标签体系: 本模型主要用于给输入中文句子的分词以及词性标注结果。用户可以自行尝试输入中文句子。具体调用方式请参考代码示例。 在安装ModelScope完成之后即可使用chiese-part-of-speech(中文词性标注)的能力, 默认单句长度不超过512。 本模型基于CTB9数据集(通用新闻领域)上训练,在垂类领域中文文本上的中文词性标注效果会有降低,请用户自行评测后决定如何使用。 本模型采用新闻领域词性标注数据集CTB9标注训练。 CTB6数据集标注数据样例: 数据预处理成(B、I、E、S)标签体系的数据格式, 每一个独立的单字对应一个独立的标签, 预处理后数据样例如下: 模型采用2张NVIDIA V100机器训练, 超参设置如下: 模型在CTB不同年份的测试数据评估结果(F1 score): 如果需要基于自己的数据对分词模型进行二次训练, 建议可以采用ModelScope提供的序列标注理解框架 准备训练配置,将下面的代码保存为trai.yaml。 该配置中的数据集为示例数据集CTB6中文pos训练数据,如需使用自定义数据或调整参数,可参考《AdaSeq模型训练最佳实践》,准备数据或修改配置文件。AdaSeq中也提供了大量的模型、论文、比赛复现示例,欢迎大家使用。 运行命令开始训练。在GPU上训练需要至少6G显存,可以根据实际GPU情况调整batch_size等参数。 二进制模型文件和相关配置文件会保存在 StructBERT模型可以参考论文BAStructBERT通用领域中文词性标注模型介绍
模型描述
标签
描述
含义
标签
描述
含义
AD
adverbs
副词
M
Measure word(icludig classifiers)
量词,例子:“个”
AS
Aspect marke
体态词,体标记(例如:了,在,着,过)
MSP
Some particles
例子:“所”
BA
把 i ba-cost
“把”、“将”的词性标记
NN
Commo ous
普通名词
CC
Coordiatig cojuctio
并列连词,“和”
NR
Proper ous
专有名词
CD
Cardial umbers
数字,“一百”
NT
Temporal ous
时序词,表示时间的名词
CS
Subordiatig coj
从属连词(例子:若,如果,如…)
OD
Ordial umbers
序数词,“第一”
DEC
的 for relative-clause etc
“的”词性标记
ON
Oomatopoeia
拟声词,“哈哈”
DEG
Associative
联结词“的”
P
Prepositio (excludig 把 ad 被)
介词
DER
i V-de costructio, ad V-de-R
“得”
PN
proous
代词
DEV
before VP
地
PU
Puctuatios
标点
DT
Determier
限定词,“这”
SB
i log bei-costructio
例子:“被,给”
ETC
Tag for words, i coordiatio phrase
等,等等
SP
Setece-fial particle
句尾小品词,“吗”
FW
Foreig words
例子:ISO
VA
Predicative adjective
表语形容词,“红”
IJ
iterjetio
感叹词
VC
Copula
系动词,“是”
JJ
Nou-modifier other tha ous
VE
有 as the mai verb
“有”
LB
i log bei-costructio
例子:被,给
VV
Other verbs
其他动词
LC
Localizer
定位词,例子:“里”
期望模型使用方式以及适用范围
如何使用
代码范例
from modelscope.models import Model
from modelscope.pipelies import pipelie
from modelscope.utils.costat import Tasks
# Versio less tha 1.1 please use TokeClassificatioPreprocessor
from modelscope.preprocessors import TokeClassificatioTrasformersPreprocessor
pipelie_is = pipelie(task=Tasks.part_of_speech)
result = pipelie_is(iput="今天天气不错,适合出去游玩")
prit (result)
# {'output': [{'type': 'NT', 'start': 0, 'ed': 2, 'spa': '今天'}, {'type': 'NN', 'start': 2, 'ed': 4, 'spa': '天气'}, {'type': 'VA', 'start': 4, 'ed': 6, 'spa': '不错'}, {'type': 'PU', 'start': 6, 'ed': 7, 'spa': ','}, {'type': 'VV', 'start': 7, 'ed': 9, 'spa': '适合'}, {'type': 'VV', 'start': 9, 'ed': 11, 'spa': '出去'}, {'type': 'VV', 'start': 11, 'ed': 13, 'spa': '游玩'}]}
model_id = 'damo/lp_structbert_part-of-speech_chiese-base'
model = Model.from_pretraied(model_id)
tokeizer = TokeClassificatioTrasformersPreprocessor(model.model_dir)
pipelie_is = pipelie(task=Tasks.toke_classificatio, model=model, preprocessor=tokeizer)
result = pipelie_is(iput="今天天气不错,适合出去游玩")
prit (result)
#{'output': [{'type': 'NT', 'start': 0, 'ed': 2, 'spa': '今天'}, {'type': 'NN', 'start': 2, 'ed': 4, 'spa': '天气'}, {'type': 'VA', 'start': 4, 'ed': 6, 'spa': '不错'}, {'type': 'PU', 'start': 6, 'ed': 7, 'spa': ','}, {'type': 'VV', 'start': 7, 'ed': 9, 'spa': '适合'}, {'type': 'VV', 'start': 9, 'ed': 11, 'spa': '出去'}, {'type': 'VV', 'start': 11, 'ed': 13, 'spa': '游玩'}]}
模型局限性以及可能的偏差
训练数据介绍
模型训练流程
预处理
上海_NR 二月_NT 十日_NT 电_NN (_PU 记者_NN 谢金虎_NR 、_PU 张持坚_NR )_PU
上 海 二 月 十 日 电 ( 记 者 谢 金 虎 、 张 持 坚 ) B-NR E-NR B-NT E-NT B-NT E-NT S-NN S-PU B-NN E-NN B-NR I-NR E-NR S-PU B-NR I-NR E-NR S-PU
训练
trai_epochs=10
max_sequece_legth=256
batch_size=64
learig_rate=5e-5
optimizer=AdamW
数据评估及结果
CTB5
CTB6
CTB9
95.04
95.16
94.91
模型训练示例代码
pip istall adaseq
yaml
文件示例如下:experimet:
exp_dir: experimets/
exp_ame: ctb6_pos
seed: 42
task: word-segmetatio
dataset:
data_file:
trai: https://modelscope.c/api/v1/datasets/digku/chiese_pos_ctb6/repo?Revisio=master&FilePath=trai.txt
dev: https://modelscope.c/api/v1/datasets/digku/chiese_pos_ctb6/repo?Revisio=master&FilePath=dev.txt
test: https://modelscope.c/api/v1/datasets/digku/chiese_pos_ctb6/repo?Revisio=master&FilePath=test.txt
data_type: coll
preprocessor:
type: sequece-labelig-preprocessor
max_legth: 256
tag_scheme: BIES
data_collator: SequeceLabeligDataCollatorWithPaddig
model:
type: sequece-labelig-model
embedder:
model_ame_or_path: damo/lp_structbert_part-of-speech_chiese-base
dropout: 0.1
use_crf: true
trai:
max_epochs: 1
dataloader:
batch_size_per_gpu: 32
optimizer:
type: AdamW
lr: 2.0e-5
param_groups:
- regex: crf
lr: 2.0e-1
lr_scheduler:
type: LiearLR
start_factor: 1.0
ed_factor: 0.0
total_iters: 30
evaluatio:
dataloader:
batch_size_per_gpu: 64
metrics:
- type: er-metric
- type: er-dumper
model_type: sequece_labelig
dump_format: coll
adaseq trai -c trai.yaml
./experimets/ctb6_pos/${yymmddHHMMSS.ffffff}/output/
yaml
配置中采用的crf解码方式, 所以最后训练得到分词模型是BERT-crf结构而非BERT-softmax结果(实测两者的效果很接近)。在推理阶段, 为了能做BERT-crf结构的推理, 我们可以采用ModelScope内置的针对NER任务的pipelie进行推理, 示例代码如下:from modelscope.utils.costat import Tasks
from modelscope.pipelies import pipelie
# pipelie = pipelie(Tasks.amed_etity_recogitio, ${model_save_path})
pipelie = pipelie(Tasks.amed_etity_recogitio, "./experimets/ctb6_pos/${yymmddHHMMSS.ffffff}/output/")
pipelie('美好世界')
# 输出结果如下:
# {'output': [{'type': 'JJ', 'start': 0, 'ed': 2, 'spa': '美好'}, {'type': 'NN', 'start': 2, 'ed': 4, 'spa': '世界'}]}
引用
@article{wag2019structbert,
title={Structbert: Icorporatig laguage structures ito pre-traiig for deep laguage uderstadig},
author={Wag, Wei ad Bi, Bi ad Ya, Mig ad Wu, Che ad Bao, Zuyi ad Xia, Jiaga ad Peg, Liwei ad Si, Luo},
joural={arXiv preprit arXiv:1908.04577},
year={2019}
}
点击空白处退出提示
评论