相关文章:
1.快递单中抽取关键信息【一】----基于BiGRU+CR+预训练的词向量优化
2.快递单信息抽取【二】基于ERNIE1.0至ErnieGram + CRF预训练模型
3.快递单信息抽取【三】--五条标注数据提高准确率,仅需五条标注样本,快速完成快递单信息任务
1)PaddleNLP通用信息抽取技术UIE【一】产业应用实例:信息抽取{实体关系抽取、中文分词、精准实体标。情感分析等}、文本纠错、问答系统、闲聊机器人、定制训练
2)PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)
!强烈推荐:数据标注平台doccano----简介、安装、使用、踩坑记录
项目连接:https://aistudio.baidu.com/aistudio/projectdetail/4180615?contributionType=1
0. PaddleNLP 一键预测能力 Taskflow API之三大特性
功能全面
- 全场景支持:覆盖NLU和NLG领域十一大经典任务。
- 文档级输入:支持文档级输入,解决预训练模型对输入文本的长度限制问题,大大节省用户输入长文本时的代码开发量。
- 定制化训练:支持用户使用自己的数据集进行定制化训练,通过自定义路径一键使用定制化训练好的模型。
简捷易用
- 开箱即用,学习成本低,几行代码便可完成调用。
产业级效果
- 聚合众多百度自然语言处理领域自研算法以及社区优秀开源模型,模型效果领先。
1. 环境准备
!pip install --upgrade paddlenlp
!pip install pypinyin
!pip install LAC
2. 基础能力
这一章节将会学到的Taskflow技能:
- 利用
PaddleNLP Taskflow
提取句子中的语言学特征:中文分词、词性识别,依存关系,命名实体识别、关系抽取、事件抽取等。
2.0 信息抽取
PaddleNLP 5.16新发开放域信息抽取能力,只有你想不到的schema,没有UIE抽取不到的结果哦!
详情可参考:信息抽取一键预测能力
如需定制化训练,全套代码在此:传送门
实体抽取
from pprint import pprint
from paddlenlp import Taskflow
schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
ie = Taskflow('information_extraction', schema=schema)
pprint(ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")) # Better print results using pprint
[{'时间': [{'end': 6,
'probability': 0.9857378532473966,
'start': 0,
'text': '2月8日上午'}],
'赛事名称': [{'end': 23,
'probability': 0.8503082243989795,
'start': 6,
'text': '北京冬奥会自由式滑雪女子大跳台决赛'}],
'选手': [{'end': 31,
'probability': 0.8981535684051067,
'start': 28,
'text': '谷爱凌'}]}]
关系抽取
#
schema = {'歌曲名称': ['歌手', '所属专辑']} # Define the schema for relation extraction
ie.set_schema(schema) # Reset schema
ie('《告别了》是孙耀威在专辑爱的故事里面的歌曲')
[{'歌曲名称': [{'text': '告别了',
'start': 1,
'end': 4,
'probability': 0.6296147448952354,
'relations': {'歌手': [{'text': '孙耀威',
'start': 6,
'end': 9,
'probability': 0.9988380409852198}],
'所属专辑': [{'text': '爱的故事',
'start': 12,
'end': 16,
'probability': 0.9968462078543183}]}},
{'text': '爱的故事',
'start': 12,
'end': 16,
'probability': 0.28168534139751955,
'relations': {'歌手': [{'text': '孙耀威',
'start': 6,
'end': 9,
'probability': 0.9951413914998}]}}]}]
事件抽取
schema = {'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']} # Define the schema for event extraction
ie.set_schema(schema) # Reset schema
ie('中国地震台网正式测定:5月16日06时08分在云南临沧市凤庆县(北纬24.34度,东经99.98度)发生3.5级地震,震源深度10千米。')
[{'地震触发词': [{'text': '地震',
'start': 56,
'end': 58,
'probability': 0.9977425555988333,
'relations': {'地震强度': [{'text': '3.5级',
'start': 52,
'end': 56,
'probability': 0.998080158269417}],
'时间': [{'text': '5月16日06时08分',
'start': 11,
'end': 22,
'probability': 0.9853299181377793}],
'震中位置': [{'text': '云南临沧市凤庆县(北纬24.34度,东经99.98度)',
'start': 23,
'end': 50,
'probability': 0.7874013050677604}],
'震源深度': [{'text': '10千米',
'start': 63,
'end': 67,
'probability': 0.9937973233053299}]}}]}]
句子级情感分类
schema = '情感倾向[正向,负向]' # Define the schema for sentence-level sentiment classification
ie.set_schema(schema) # Reset schema
ie('这个产品用起来真的很流畅,我非常喜欢')
[{'情感倾向[正向,负向]': [{'text': '正向', 'probability': 0.9990024058203417}]}]
评价维度、观点抽取,对象级情感分析
schema = {'评价维度': ['观点词', '情感倾向[正向,负向]']} # Define the schema for opinion extraction
ie.set_schema(schema) # Reset schema
pprint(ie("地址不错,服务一般,设施陈旧")) # Better print results using pprint
[{'评价维度': [{'end': 2,
'probability': 0.9888138676472664,
'relations': {'情感倾向[正向,负向]': [{'probability': 0.998228967796706,
'text': '正向'}],
'观点词': [{'end': 4,
'probability': 0.9927846479537372,
'start': 2,
'text': '不错'}]},
'start': 0,
'text': '地址'},
{'end': 12,
'probability': 0.9588297379365116,
'relations': {'情感倾向[正向,负向]': [{'probability': 0.9949388606013692,
'text': '负向'}],
'观点词': [{'end': 14,
'probability': 0.9286749937276362,
'start': 12,
'text': '陈旧'}]},
'start': 10,
'text': '设施'},
{'end': 7,
'probability': 0.959285414999755,
'relations': {'情感倾向[正向,负向]': [{'probability': 0.9952498258302498,
'text': '负向'}],
'观点词': [{'end': 9,
'probability': 0.9949358587838901,
'start': 7,
'text': '一般'}]},
'start': 5,
'text': '服务'}]}]
跨任务跨领域抽取
schema = ['寺庙', {'丈夫': '妻子'}]
ie.set_schema(schema)
pprint(ie('李治即位后,让身在感业寺的武则天续起头发,重新纳入后宫。'))
[{'丈夫': [{'end': 2,
'probability': 0.989690572797457,
'relations': {'妻子': [{'end': 16,
'probability': 0.9987625986569526,
'start': 13,
'text': '武则天'}]},
'start': 0,
'text': '李治'}],
'寺庙': [{'end': 12,
'probability': 0.9888578809890554,
'start': 9,
'text': '感业寺'}]}]
2.1 中文分词
分词作为许多NLP任务的第一道工序,如何在不同场景中『用好』、『用对』尤为重要。
Taskflow提供了多种中文分词模式供大家选择,我们列举了几种不同的场景,来示例不同使用方式。
2.1.1 文档级输入
- 支持超长文本输入,无需担心『文本截断』问题
# 首次调用会有模型下载的额外时间开销
seg = Taskflow("word_segmentation")
doc = "苏锦一直记得那个午后,明晃晃的光线穿过教室的窗玻璃洒到自己脸上,有种特别暖和的感觉。那阳光仿佛是能够钻进人的心里,继而延展到身体全部的毛孔中,然后以一种温柔的霸道占据体内各个淋巴细胞。苏锦觉得连自己的每一个气息里都似乎是能流窜出明亮的光。她坐着有些微醉于这份上帝恩赐的福祉当中。是在这样一个午后。她记住了段见城的脸。轮廓俊朗的少年。有着羁傲的眼神和清晰的声线。怎么看这都是少女漫画里必经的情节。教语文的老太太此刻正兀自在讲台上口若悬河的讲解着《孔雀东南飞》,毕竟是已经年过半百的老教师,经历的学生多了,倒也不在乎讲台下那一张张脸上是否挂着的无精打采,昏昏欲睡的表情,按着自己的性子眉飞色舞的描绘着千年前的那段爱情传奇。苏锦一边数着从老太太口里横飞出来的唾沫星子,一边念想着,让理科班这群脑子里已全被物理公式填充了的家伙,去对几千年前焦仲卿和刘兰芝的爱情产生兴趣未免是件太困难的事情了。老太太讲到焦仲卿和刘兰芝双双殉情而死之时咳嗽了一声,提醒底下那群不知已经神游到何方的学生们是时候为文章的主旨做笔记了。苏锦把课文翻到最后,快速扫过大致内容,目光却在那句:府吏闻此事,心知长别离。徘徊庭树下,自挂东南枝上硬生生地停了下来。思绪仿若戛然而止,被某种莫名的感怀而包围,心中有些钝痛,却不知从何而来。“懦弱。”一个略带鄙夷的声音传入苏锦的耳,拦截住了她空白的思绪。苏锦转过头,瞥见后桌的段见城。恍然间有种错觉,这个男生好似是被光线包裹着一般。段见城淡淡说。若他是焦仲卿,定不会让自己和深爱的女子走到这步田地,若是真走到山穷水尽的地步,定是决然赴死。何来徘徊。那清淡口气带着些不屑,却是这般笃定至极。他说,平生最鄙夷懦弱的男子。苏锦静默的注视着这个男生。终究是没有说出话来。苏锦莫名其妙的做了段见城的女友是一年以后的事情。全班在KTV里唱歌,美名曰:升高三前最后的狂欢。包厢里都是拥挤的人,但苏锦却还是能够感受到空调的温度调得异常的低,她躲在冷风吹不到的角落,捧着大杯的雪花啤酒像是喝水一样没有节制,她觉得心里有所郁结并且心思混乱,恍恍惚惚的注视着麦克风被传了一轮又一轮,听着音像里传出或高或低的杂乱音符,而自己却似是置身于别处,与此间的喧嚣起伏无关,只觉得空荡荡。苏锦记得自己与同桌曾谈及过自己这种从暑假开始无法摆脱的混沌状态,同桌是一副了然于胸的模样,义正言辞的对苏锦说,这是高三前期综合症。她说,苏锦你别太看重所谓的高三,高考和大学都只是一个过程而并非最终的意义,我们要以平常心去对待这些。苏锦想,其实自己并非执著什么,而是自幼便对于那些未知的一切充满恐惧。因为无法掌控,所以感到束手无策,身不由己。仿佛有种被命运捏在手里随意摆弄的感觉,特别难受正当苏锦失足于自己庞大的幻觉之时,身边的朋友开始玩起了真心话大冒险之类的游戏。在一边起哄的女生提议游戏从今晚没有唱歌过的人开始,于是因为忙着在沙发上的打牌的段见城那拨人便是首先被开刷的对象,而作为聚众赌博的头子,段见城自然是第一个被逮到。几个暗自对段见城有好感的姑娘早就揣摩好了问题,苏锦被旁边兴奋过头的女生推攘着,神志也渐渐清明起来。不知是谁直白的问出了那句:阿城,你有意中人么?KTV中的嘈杂如同顿时沉淀了一般,纵然空气里似乎还遗留着些噪音过境的痕迹,更多的却是一种屏气凝神的静。段见城沉默的捏着手中那张还没打出去扑克牌,几乎是在所有人的耐心倒塌的前一秒,清晰地说出了苏锦的名字。"
print("1. 输入长度:", len(doc))
print("2. 分词结果:", seg(doc))
1. 输入长度: 1413
2. 分词结果: ['苏锦', '一直', '记得', '那个', '午后', ',', '明晃晃', '的', '光线', '穿过', '教室', '的', '窗', '玻璃', '洒', '到', '自己', '脸上', ',', '有种', '特别', '暖和', '的', '感觉', '。', '那', '阳光', '仿佛', '是', '能够', '钻进', '人', '的', '心里', ',', '继而', '延展', '到', '身体', '全部', '的', '毛孔', '中', ',', '然后', '以', '一种', '温柔', '的', '霸道', '占据', '体内', '各', '个', '淋巴细胞', '。', '苏锦', '觉得', '连', '自己', '的', '每一个', '气息', '里', '都', '似乎', '是', '能', '流窜', '出', ...........
2.1.2 快速模式分词
- 示例如何通过快速模式分词对数据集进行词频统计、构建词表
import time
from collections import defaultdict
from paddlenlp.datasets import load_dataset
from paddlenlp import Taskflow
seg_fast = Taskflow("word_segmentation", mode="fast")
# 加载ChnSentiCorp数据集
train_ds, dev_ds = load_dataset("chnsenticorp", splits=["train", "dev"])
texts = []
for data in train_ds:
texts.append(data["text"])
for data in dev_ds:
texts.append(data["text"])
inputs_length = len(texts)
print("1. 句子数量:", inputs_length)
tic_seg = time.time()
# 快速分词
results = seg_fast(texts)
time_diff = time.time() - tic_seg
print("2. 平均速率:%.2f句/s" % (inputs_length/time_diff))
# 词频统计
word_counts = defaultdict(int)
for result in results:
for word in result:
word_counts[word] += 1
# 打印频次最高的前20个单词及其对应词频
print("3. Top 20 Words:", sorted(word_counts.items(), key=lambda d: d[1], reverse=True)[:20])
100%|██████████| 1909/1909 [00:00<00:00, 7614.49it/s]
1. 句子数量: 10800
Building prefix dict from the default dictionary ...
Dumping model to file cache /tmp/jieba.cache
Loading model cost 0.995 seconds.
Prefix dict has been built successfully.
2. 平均速率:1429.74句/s
3. Top 20 Words: [(',', 59389), ('的', 41468), ('。', 23207), ('了', 15048), (' ', 11426), ('是', 10479), (',', 9204), ('我', 9167), ('很', 6881), ('!', 6169), ('也', 5793), ('在', 5180), ('酒店', 4829), ('不', 4784), ('都', 4604), ('有', 4589), ('就', 4169), ('.', 4099), ('没有', 3594), ('还', 3455)]
2.1.3 精确模式分词
- 使用Taskflow精确模式,实体粒度分词精度最高,语义片段完整,在知识图谱构建等应用中优势明显。
- 实体词容易被切开,例如『陕西省高校管理体制改革实施方案』、『诺戴商务咨询(上海)有限公司』希望能够被完整识别。
from paddlenlp import Taskflow
# 精确模式模型体积较大,可结合机器情况适当调整batch_size,采用批量样本输入的方式。
seg_accurate = Taskflow("word_segmentation", mode="accurate", batch_size=32)
# 批量样本输入,输入为多个句子组成的list,平均速率更快
texts = ["李伟拿出具有科学性、可操作性的《陕西省高校管理体制改革实施方案》", "诺戴商务咨询(上海)有限公司于2016年08月22日成立"]
print(seg_accurate(texts))
[['李伟', '拿出', '具有', '科学性', '、', '可操作性', '的', '《', '陕西省高校管理体制改革实施方案', '》'], ['诺戴商务咨询(上海)有限公司', '于', '2016年08月22日', '成立']]
2.1.4 用户词典
- 快速配置用户词典来对分词结果进行干预
from paddlenlp import Taskflow
seg = Taskflow("word_segmentation")
print(seg("平原上的火焰宣布延期上映"))`
['平原', '上', '的', '火焰', '宣布', '延期', '上映']
- 例如我们想把『平原上的火焰』作为一个完整词来识别,而『上映』希望能够被切开,则可以按照如下格式配置自定义词典文件
user_dict.txt
平原上的火焰
上 映
- 配置后通过
user_dict
一键装载在这里插入代码片
seg = Taskflow("word_segmentation", user_dict="/home/aistudio/user_dict.txt")
print(seg("平原上的火焰宣布延期上映"))
['平原上的火焰', '宣布', '延期', '上', '映']
2.2 词性标注
- 基于百度词法分析工具LAC,训练语料包含近2200万句子,覆盖多种场景
from paddlenlp import Taskflow
tag = Taskflow("pos_tagging")
print(tag("第十四届全运会在西安举办"))
[('第十四届', 'm'), ('全运会', 'nz'), ('在', 'p'), ('西安', 'LOC'), ('举办', 'v')]
2.3 命名实体识别
2.3.1 精确模式
- 基于百度解语的精确模式:最全中文实体标签的命名实体识别工具,不仅适用于通用领域,也适用于生物医疗、教育等垂类领域。包含66种词性及专名类别标签(同类产品的标签数是15个左右)
from paddlenlp import Taskflow
ner = Taskflow("ner")
print(ner(["李伟拿出具有科学性、可操作性的《陕西省高校管理体制改革实施方案》", "诺戴商务咨询(上海)有限公司于2016年08月22日成立"]))
[[('李伟', '人物类_实体'), ('拿出', '场景事件'), ('具有', '肯定词'), ('科学性', '修饰词_性质'), ('、', 'w'), ('可操作性', '修饰词_性质'), ('的', '助词'), ('《', 'w'), ('陕西省高校管理体制改革实施方案', '作品类_实体'), ('》', 'w')], [('诺戴商务咨询(上海)有限公司', '组织机构类_企事业单位'), ('于', '介词'), ('2016年08月22日', '时间类_具体时间'), ('成立', '场景事件')]]`在这里插入代码片`
- 精确模式标签集合
<table>
<tr><td>人物类_实体<td>物体类<td>生物类_动物<td>医学术语类
<tr><td>人物类_概念<td>物体类_兵器<td>品牌名<td>术语类_生物体
<tr><td>作品类_实体<td>物体类_化学物质<td>场所类<td>疾病损伤类
<tr><td>作品类_概念<td>其他角色类<td>场所类_交通场所<td>疾病损伤类_植物病虫害
<tr><td>组织机构类<td>文化类<td>位置方位<td>宇宙类
<tr><td>组织机构类_企事业单位<td>文化类_语言文字<td>世界地区类<td>事件类
<tr><td>组织机构类_医疗卫生机构<td>文化类_奖项赛事活动<td>饮食类<td>时间类
<tr><td>组织机构类_国家机关<td>文化类_制度政策协议<td>饮食类_菜品<td>时间类_特殊日
<tr><td>组织机构类_体育组织机构<td>文化类_姓氏与人名<td>饮食类_饮品<td>术语类
<tr><td>组织机构类_教育组织机构<td>生物类<td>药物类<td>术语类_符号指标类
<tr><td>组织机构类_军事组织机构<td>生物类_植物<td>药物类_中药<td>信息资料
<tr><td>链接地址<td>肯定词<td>个性特征<td>否定词
<tr><td>感官特征<td>数量词<td>场景事件<td>叹词
<tr><td>介词<td>拟声词<td>介词_方位介词<td>修饰词
<tr><td>助词<td>外语单词<td>代词<td>英语单词
<tr><td>连词<td>汉语拼音<td>副词<td>词汇用语
<tr><td>疑问词<td>w(标点)<td><td>
</table>
精准模式对部分类目(如组织机构等),做了更细的划分识别(如,医疗卫生机构、体育组织机构)。
2.3.2 快速模式
- 基于百度词法分析工具LAC,训练语料包含近2200万句子,覆盖多种场景
from paddlenlp import Taskflow
ner_fast = Taskflow("ner", mode="fast")
print(ner_fast("三亚是一个美丽的城市"))
[('三亚', 'LOC'), ('是', 'v'), ('一个', 'm'), ('美丽', 'a'), ('的', 'u'), ('城市', 'n')]
- 快速模式标签集合
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | t | 时间 |
nr | 人名 | ns | 地名 | nt | 机构名 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
2.4 依存句法分析
2.4.1 多种使用方式
from paddlenlp import Taskflow
# 使用BiLSTM作为编码器,速度最快
ddp = Taskflow("dependency_parsing")
print(ddp("2月8日谷爱凌夺得北京冬奥会第三金"))
[{'word': ['2月8日', '谷爱凌', '夺得', '北京冬奥会', '第三金'], 'head': [3, 3, 0, 5, 3], 'deprel': ['ADV', 'SBV', 'HED', 'ATT', 'VOB']}]
# 编码器部分将BiLSTM替换为ERNIE,模型准确率更高!
ddp = Taskflow("dependency_parsing", model="ddparser-ernie-1.0")
print(ddp("2月8日谷爱凌夺得北京冬奥会第三金"))
# 输出概率值和词性标签
ddp = Taskflow("dependency_parsing", prob=True, use_pos=True)
print(ddp("2月8日谷爱凌夺得北京冬奥会第三金"))
- 依存句法分析标注关系集合
Label | 关系类型 | 说明 | 示例 |
---|---|---|---|
SBV | 主谓关系 | 主语与谓词间的关系 | 他送了一本书(他<--送) |
VOB | 动宾关系 | 宾语与谓词间的关系 | 他送了一本书(送-->书) |
POB | 介宾关系 | 介词与宾语间的关系 | 我把书卖了(把-->书) |
ADV | 状中关系 | 状语与中心词间的关系 | 我昨天买书了(昨天<--买) |
CMP | 动补关系 | 补语与中心词间的关系 | 我都吃完了(吃-->完) |
ATT | 定中关系 | 定语与中心词间的关系 | 他送了一本书(一本<--书) |
F | 方位关系 | 方位词与中心词的关系 | 在公园里玩耍(公园-->里) |
COO | 并列关系 | 同类型词语间关系 | 叔叔阿姨(叔叔-->阿姨) |
DBL | 兼语结构 | 主谓短语做宾语的结构 | 他请我吃饭(请-->我,请-->吃饭) |
DOB | 双宾语结构 | 谓语后出现两个宾语 | 他送我一本书(送-->我,送-->书) |
VV | 连谓结构 | 同主语的多个谓词间关系 | 他外出吃饭(外出-->吃饭) |
IC | 子句结构 | 两个结构独立或关联的单句 | 你好,书店怎么走?(你好<--走) |
MT | 虚词成分 | 虚词与中心词间的关系 | 他送了一本书(送-->了) |
HED | 核心关系 | 指整个句子的核心 |
2.4.2 应用示例
- 通过句法分析抽取句子的
主谓宾结构信息
from paddlenlp import Taskflow
ddp = Taskflow("dependency_parsing")
print(ddp("9月9日上午纳达尔在亚瑟·阿什球场击败俄罗斯球员梅德韦杰夫"))
- 下图句子中包含了多种结构化信息:
from utils import SVOInfo
texts = ["9月9日上午纳达尔在亚瑟·阿什球场击败俄罗斯球员梅德韦杰夫", "2月8日谷爱凌夺得北京冬奥会第三金"]
results = ddp(texts)
# 抽取句子中的SVO(主谓宾)结构化信息
svo_info = []
for result in results:
svo_info.append(SVOInfo(result).parse())
for i in range(len(texts)):
print("原文本:", texts[i])
print("包含的主谓宾结构:", svo_info[i])
3. 『产业』应用
这一章节将会学到的Taskflow技能:
- 使用Taskflow来完成情感分析、文本纠错、文本相似度
3.1 情感分析
3.1.1 BiLSTM
- 默认使用的是
BiLSTM
。
from paddlenlp import Taskflow
senta = Taskflow("sentiment_analysis")
print(senta("这个产品用起来真的很流畅,我非常喜欢"))
[{'text': '这个产品用起来真的很流畅,我非常喜欢', 'label': 'positive', 'score': 0.993867814540863}]
3.1.2 SKEP
- 集成百度自研的情感知识增强预训练模型SKEP,利用情感知识构建预训练目标,在海量中文数据上进行预训练,为各类情感分析任务提供统一且强大的情感语义表示能力。
- 在多个公开数据集上模型效果SOTA:
任务 | 数据集合 | 语言 | 指标 | SKEP |
句子级情感 分类 |
SST-2 | 英文 | ACC | 97.60 |
ChnSentiCorp | 中文 | ACC | 96.08 | |
评价对象级的 情感分类 |
SE-ABSA16_PHNS | 中文 | ACC | 65.22 |
观点 抽取 |
COTE_DP | 中文 | F1 | 86.30 |
from paddlenlp import Taskflow
senta = Taskflow("sentiment_analysis", model="skep_ernie_1.0_large_ch")
print(senta("作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。"))
[{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。', 'label': 'positive', 'score': 0.9843240976333618}]
3.2 文本纠错
- ERNIE-CSC在ERNIE预训练模型的基础上,融合了拼音特征的端到端中文拼写纠错模型,整体框架图如下:
- 在中文纠错经典数据集SIGHAN上效果领先:
Metric | SIGHAN 13 | SIGHAN 14 | SIGHAN 15 |
---|---|---|---|
Detection F1 | 0.8348 | 0.6534 | 0.7464 |
Correction F1 | 0.8217 | 0.6302 | 0.7296 |
from paddlenlp import Taskflow
corrector = Taskflow("text_correction")
print(corrector('遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。'))
[{'source': '遇到逆竟时,我们必须勇于面对,而且要愈挫愈勇。', 'target': '遇到逆境时,我们必须勇于面对,而且要愈挫愈勇。', 'errors': [{'position': 3, 'correction': {'竟': '境'}}]}]
3.3 文本相似度
- 基于百度知道2200万对相似句组训练SimBERT达到前沿文本相似效果
from paddlenlp import Taskflow
similarity = Taskflow("text_similarity")
print(similarity([["春天适合种什么花?", "春天适合种什么菜?"], ["小蝌蚪找妈妈怎么样", "小蝌蚪找妈妈是谁画的"]]))
[{'text1': '春天适合种什么花?', 'text2': '春天适合种什么菜?', 'similarity': 0.83395267}, {'text1': '小蝌蚪找妈妈怎么样', 'text2': '小蝌蚪找妈妈是谁画的', 'similarity': 0.81923723}]
3.4 『解语』-知识标注
- 基于百度解语,首个能够覆盖所有中文词汇的词类知识标注工具,旨在为中文文本解析提供全面、丰富的知识标注结果
from paddlenlp import Taskflow
wordtag = Taskflow("knowledge_mining")
# 结果会与TermTree进行绑定,输出termid
print(wordtag("第24届冬季奥林匹克运动会在北京举办"))
[{'text': '第24届冬季奥林匹克运动会在北京举办', 'items': [{'item': '第24届冬季奥林匹克运动会', 'offset': 0, 'wordtag_label': '事件类', 'length': 13}, {'item': '在', 'offset': 13,
'wordtag_label': '介词', 'length': 1, 'termid': '介词_cb_在'}, {'item': '北京', 'offset': 14,
'wordtag_label': '世界地区类', 'length': 2, 'termid': '中国地区_cb_北京市'}, {'item': '举办', 'offset': 16, 'wordtag_label': '场景事件', 'length': 2, 'termid': '场景事件_cb_举办'}]}]
from termtree import TermTree
# 加载百科知识树
termtree = TermTree.from_dir("termtree_type.csv", "TermTree.V1.0")
# 通过termid获取别名
print(termtree._nodes["奖项赛事活动_eb_冬季奥林匹克运动会"]._data['alias'])
# 通过termid获取百度百科链接
print(termtree._nodes['奖项赛事活动_eb_冬季奥林匹克运动会']._data['links'][0]['bdbkUrl'])
['冬奥会', '冬奥', '冬季奥运会']
- 更多TermTree使用方法参考解语:TermTree(百科知识树)
4. 『趣味』应用
这一章节将会学到的Taskflow技能:
- 感受海量数据训练出来的预训练模型的超强能力
- 利用Taskflow打造一个『能说会道、擅长聊天』的机器人
- 利用Taskflow构建一个问答/写诗系统
4.1 交互式闲聊对话
- 基于PLATO-MINI,模型在十亿级别的中文对话数据上进行了预训练,闲聊场景对话效果显著。
from paddlenlp import Taskflow
dialogue = Taskflow("dialogue")
print(dialogue(["你好"]))
- 交互模式
(推荐使用终端terminal进入python解释器进行体验):
4.2 生成式问答
- 基于开源社区优秀中文预训练模型CPM,参数规模26亿,预训练中文数据达100GB。
- 调用示例:
- NOTE:由于项目空间有限,这里只列举了调用方法,为了有更好的使用体验,大家可以另外创建一个项目来体验这部分功能~
4.3 智能写诗
- 基于开源社区优秀中文预训练模型CPM,参数规模26亿,预训练中文数据达100GB。
- 调用示例:
- NOTE:由于项目空间有限,这里只列举了调用方法,为了有更好的使用体验,大家可以另外创建一个项目来体验这部分功能~
5.定制化训练
这一章节将会学到的Taskflow技能:
- 利用自己的数据训练/微调模型,通过Taskflow一键装载并使用
5.1 数据准备和训练
- 参考PaddleNLP SKEP情感分析训练示例,完成数据准备和模型训练。
# 训练步骤省略,提供了训练好的模型权重文件
# 直接下载并保存到/home/aistudio/custom_model路径
!wget https://bj.bcebos.com/paddlenlp/taskflow/demo/model_state.pdparams -P /home/aistudio/custom_model
!wget https://bj.bcebos.com/paddlenlp/taskflow/demo/model_config.json -P /home/aistudio/custom_model
5.2 使用定制化模型
- 通过
task_path
指定自定义模型路径一键加载即可。
from paddlenlp import Taskflow
my_senta = Taskflow("sentiment_analysis", model="skep_ernie_1.0_large_ch", task_path="/home/aistudio/custom_model")
print(my_senta("不错的酒店,服务还可以,下次还会入住的~"))
[{'text': '不错的酒店,服务还可以,下次还会入住的~', 'label': 'positive', 'score': 0.9968485236167908}]
项目连接:https://aistudio.baidu.com/aistudio/projectdetail/4180615?contributionType=1