SiameseUniNLU通用自然语言理解模型,基于提示(Prompt)+文本(Text)的构建思路,通过设计适配于多种任务的Prompt,并利用指针网络(Pointer Network)实现片段抽取(Span Extraction),从而实现对命名实体识别、关系抽取、事件抽取、属性情感抽取、情感分类、文本分类、文本匹配、自然语言推理、阅读理解等多类自然语言理解任务的统一处理。和市面上已有的自然语言理解类模型不同的是:
更通用
:UniNLU为各种理解类任务都设计了相应适配的Prompt,并通过大量训练,使得一个模型几乎可以解决所有自然语言理解类任务,支持的任务包括:
更高效:UniNLU基于孪生神经网络的思想,将预训练语言模型(PLM)的前 N-n 层改为双流,后 n 层改为单流。语言模型的底层更多的是实现局部的简单语义信息的交互,顶层更多的是深层信息的交互,因此前N-n层不需要让Prompt和Text做过多的交互。
模型基于structbert-base-chinese在千万级远监督数据+有监督数据预训练得到,模型框架如下图:
镜像中已经提供了一个可用的conda虚拟环境:nlp。若环境不可用或出现运行错误,可在新建conda环境,并把以下依赖包保存为"requirements.txt", 执行命令安装:
addict
datasets
dill
Jinja2
modelscope
mpmath
multidict
multiprocess
networkx
numpy
packaging
pandas
pillow
pytz
PyYAML
regex
requests
safetensors
scipy
setuptools
simplejson
sortedcontainers
sympy
tokenizers
torch
tqdm
transformers
triton
tzdata
urllib3
wheel
yarl
激活conda虚拟环境:
conda activate nlp
运行测试代码:
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
semantic_cls = pipeline(
task=Tasks.siamese_uie,
model="/root/workspace/nlp_structbert_siamese-uninlu_chinese-base",
)
# 命名实体识别 {实体类型: None}
print(
semantic_cls(
input="1944年毕业于北大的名古屋铁道会长谷口清太郎等人在日本积极筹资,共筹款2.7亿日元,参加捐款的日本企业有69家。",
schema={"人物": None, "地理位置": None, "组织机构": None},
)
)
# 文本分类,文本标签通过英文逗号“,”隔开,拼接在输入文本前面并用“|”分隔
print(
semantic_cls(
input="民生故事,文化,娱乐,体育,财经,房产,汽车,教育,科技,军事,旅游,国际,证券股票,农业三农,电竞游戏|学校召开2018届升学及出国深造毕业生座谈会就业指导",
schema={"分类": None},
)
)
# 情感分类,情感标签通过英文逗号“,”隔开,拼接在输入文本前面并用“|”分隔;同时也支持情绪分类任务,换成相应情绪标签即可,e.g. "无情绪,积极,愤怒,悲伤,恐惧,惊奇"
print(
semantic_cls(
input="正向,负向|有点看不下去了,看作者介绍就觉得挺矫情了,文字也弱了点。后来才发现 大家对这本书评价都很低。亏了。",
schema={"情感分类": None},
)
)
# 自然语言推理,文本关系标签通过英文逗号“,”隔开,拼接在输入文本前面并用“|”分隔;输入文本由两段文本组成,并分别用“段落1”和“段落2”区分
print(
semantic_cls(
input="蕴含,矛盾,中立|段落1:是,但是你比如说像现在这种情况,是不是就是说咱们离它就绝对人类是再也没有任何可能性了;段落2:我对人类可能性有所思考",
schema={"段落2和段落1的关系是:": None},
)
)
# 选择类阅读理解,选项通过英文逗号“,”隔开,拼接在输入文本前面并用“|”分隔
print(
semantic_cls(
input="飞机票太贵,时间来不及,坐飞机头晕,飞机票太便宜|A:最近飞机票打折挺多的,你还是坐飞机去吧。B:反正又不是时间来不及,飞机再便宜我也不坐,我一听坐飞机就头晕。",
schema={"B为什么不坐飞机?": None},
)
)
# 抽取类阅读理解
print(
semantic_cls(
input="大莱龙铁路位于山东省北部环渤海地区,西起位于益羊铁路的潍坊大家洼车站,向东经海化、寿光、寒亭、昌邑、平度、莱州、招远、终到龙口,连接山东半岛羊角沟、潍坊、莱州、龙口四个港口,全长175公里,工程建设概算总投资11.42亿元。铁路西与德大铁路、黄大铁路在大家洼站接轨,东与龙烟铁路相连。大莱龙铁路于1997年11月批复立项,2002年12月28日全线铺通,2005年6月建成试运营,是横贯山东省北部的铁路干线德龙烟铁路的重要组成部分,构成山东省北部沿海通道,并成为环渤海铁路网的南部干线。铁路沿线设有大家洼站、寒亭站、昌邑北站、海天站、平度北站、沙河站、莱州站、朱桥站、招远站、龙口西站、龙口北站、龙口港站。大莱龙铁路官方网站",
schema={"大莱龙铁路位于哪里?": None},
)
)