当前位置: 首页 > news >正文

中国建设银银行招聘网站网站开发是前端还是后端

中国建设银银行招聘网站,网站开发是前端还是后端,一般网站要多大空间,天津招标信息网官网解锁数据潜力#xff1a;信息抽取、数据增强与UIE的完美融合 1.信息抽取#xff08;Information Extraction#xff09; 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务#xff0c;其目的在于从一段自然文本中提取出我们想要的关键信息结构。 举例来讲#xff0…解锁数据潜力信息抽取、数据增强与UIE的完美融合 1.信息抽取Information Extraction 1.1 IE简介 信息抽取是 NLP 任务中非常常见的一种任务其目的在于从一段自然文本中提取出我们想要的关键信息结构。 举例来讲现在有下面这样一个句子 新东方烹饪学校在成都。 我们想要提取这句话中所有有意义的词语例如 机构新东方烹饪学校城市成都 这个关键词提取任务就叫做**命名实体识别Named Entity Recognition, NER**任务文中的「新东方烹饪学校」和「成都」就被称为实体Entity。 如果我们还想进一步的知道这些词语之间的关系例如 实体 1关系名实体 2新东方烹饪学校所在地成都 这种提取实体之间关系的任务就叫做**关系抽取Relation Extraction, RE**任务。 1.2 信息抽取的几种方法 1.2.1 序列标注Sequence Labeling 序列标注通常是指对文中的每一个字以下简称 token进行分类即本质是 token classification 任务。 我们对第一小节中的例子做序列标注任务得到的结果如下 新东...学校在成都B - 机构I - 机构I - 机构 * NI - 机构I - 机构OB - 城市I - 城市 可以看到我们对句子中的每一个字token都打上了一个类别标签我们期望模型要做的事就是去学会每一个字所属的类别是什么。 Note: 这里用的标注方法是「BIO 标记法」其中「B-」代表该位置 token 是某一个实体词语span的起始 token「I-」代表该位置 token 处于某一个词语的中间或结尾「O」则代表该位置 token 不在任何一个实体词语中。除了「BIO 标记法」外还有许多其他的标注方式如 BIOES 等其本质思路都很类似。 1.2.2 指针网络Pointer Network 序列标注模型有一个天然的缺陷无法解决解决实体重叠overlap的问题。 举例来讲如果今天我们不仅要提取「机构」还同时要提取「机构类型」那么我们期望的提取结果应该为 机构新东方烹饪学校机构类型学校城市成都 可以看到对于「学校」这两个字即属于「新东方烹饪学校」机构这个词也存在于「学校」机构类型这个词那我们在给这两个字打标签的时候究竟应该打成哪个类别呢 新东…学校在成都B - 机构I - 机构I - 机构OB - 城市I - 城市 由此我们可以看到因为在进行分类时我们通常对一个字token只赋予一个标签这就导致了 token classification 不能很好的解决实体重叠一字多标签的复杂情况。 Note: 存在一些技巧可以解决该问题例如可以从单字单分类CE衍生到单字多分类BCE这里不展开讨论。 指针网络Pointer Network通过分别对每一个实体单独做预测来解决了实体之前的重叠冲突问题。 例如我们现在要同时预测「机构」和「机构类型」这两个实体那么我们就可以设计一个多头网络Multi-Head来分别预测这两个实体的实体词。 其中 「机构」实体头中「起始」向量代表这一句话中是「机构」词语的首字例子中为「新」 「机构」实体中「结束」向量代表这一句话中时「机构」词语的尾字例子中为「校」。 通过「起始」和「结束」向量中的首尾字索引就能找到对应实体的词语。 可以看到通过构建多头的任务指针网络能够分别预测「机构」和「机构类型」中的实体词起始 / 终止位置即「学校」这个词语在两个任务层中都能被抽取出来。 1.3. UIE —— 基于 prompt 的指针网络 1.3.1 UIE 中的 prompt 是什么 多头指针网络能够很好的解决实体重叠问题但缺点在于不够灵活。 假定今天我们已经通过指针网络训练好了一个提取「机构」、「机构类型」的模型即将交付时甲方突然提出一个新需求我们想再多提取一个「机构简称」的属性。 草一种植物。 从 2.2 节中的示意图中我们可以看到每一个实体类型会对应一个单独的网络头。 这就意味着我们不仅需要重标数据还需要为新属性添加一个新的网络头即模型结构会随着实体类型个数改变而发生变化。 那能不能有一种办法去固定住模型的结构不管今天来多少种类型要识别都能使用同样的模型结构完成呢 我们思考一下模型结构变化的部分是和实体类型强绑定的「头」部分。 而不同「头」之间结构其实是完全一样的一个「起始」向量 一个「终止」向量。 既然「头」结构完全一样我们能不能干脆直接使用一个「头」去提取不同实体类型的信息呢 不同「头」之间的区别在于它们关注的信息不同「机构头」只关注「机构」相关的实体词「城市头」只关注「城市」相关的实体词。 那么我们是不是可以直接在模型输入的时候就告诉模型我现在需要提取「某个头」的信息。 这个用来告诉模型做具体任务的参数就叫 prompt我们把它拼在输入中一并喂给模型即可。 通过上图可以看到我们将不同的「实体类型」作为 prompt 参数喂给模型用于「激活」模型参数跟当前「实体类型」相关的参数从而输出不同的抽取结果。 Note: 「通过一个输入参数去激活一个大模型中的不同参数从而完成不同任务的思路」并不是首次出现在 meta-learning 中也存在相关的研究这里的 prompt 参数和 meta-parameter 有着非常类似的思路。 通过引入 promptUIE 也能很方便的解决实体之间的关系抽取Relation Extraction任务例如 1.3.2 UIE 的实现 看完了基本思路我们来一起看看 UIE 是怎么实现的吧。 模型部分 UIE 的模型代码比较简单只需要在 encoder 后构建一个起始层和一个结束层即可 class UIE(nn.Module):def __init__(self, encoder):init func.Args:encoder (transformers.AutoModel): backbone, 默认使用 ernie 3.0Reference:https://github.com/PaddlePaddle/PaddleNLP/blob/a12481fc3039fb45ea2dfac3ea43365a07fc4921/model_zoo/uie/model.pysuper().__init__()self.encoder encoderhidden_size 768self.linear_start nn.Linear(hidden_size, 1)self.linear_end nn.Linear(hidden_size, 1)self.sigmoid nn.Sigmoid()def forward(self,input_ids: torch.tensor,token_type_ids: torch.tensor,attention_maskNone,pos_idsNone,) - tuple:forward 函数返回开始/结束概率向量。Args:input_ids (torch.tensor): (batch, seq_len)token_type_ids (torch.tensor): (batch, seq_len)attention_mask (torch.tensor): (batch, seq_len)pos_ids (torch.tensor): (batch, seq_len)Returns:tuple: start_prob - (batch, seq_len)end_prob - (batch, seq_len)sequence_output self.encoder(input_idsinput_ids,token_type_idstoken_type_ids,position_idspos_ids,attention_maskattention_mask,)[last_hidden_state]start_logits self.linear_start(sequence_output) # (batch, seq_len, 1)start_logits torch.squeeze(start_logits, -1) # (batch, seq_len)start_prob self.sigmoid(start_logits) # (batch, seq_len)end_logits self.linear_end(sequence_output) # (batch, seq_len, 1)end_logits torch.squeeze(end_logits, -1) # (batch, seq_len)end_prob self.sigmoid(end_logits) # (batch, seq_len)return start_prob, end_prob ** 训练部分** 训练部分主要关注一下 loss 的计算即可。 由于每一个 token 都是一个二分类任务因此选用 BCE Loss 作为损失函数。 分别计算起始 / 结束向量的 BCE Loss 再取平均值即可如下所示 criterion torch.nn.BCELoss() ...start_prob, end_prob model(input_idsbatch[input_ids].to(args.device),token_type_idsbatch[token_type_ids].to(args.device),attention_maskbatch[attention_mask].to(args.device)) start_ids batch[start_ids].to(torch.float32).to(args.device) # (batch, seq_len) end_ids batch[end_ids].to(torch.float32).to(args.device) # (batch, seq_len) loss_start criterion(start_prob, start_ids) # 起止向量loss - (1,) loss_end criterion(end_prob, end_ids) # 结束向量loss - (1,) loss (loss_start loss_end) / 2.0 # 求平均 - (1,) loss.backward() ... 该项目将借用transformers库来实现paddlenlp版本中UIE已实现 UIE 预训练模型自动下载 UIE Fine-Tuning 脚本 信息抽取、事件抽取数据增强DA策略提升 recall 信息抽取、事件抽取自分析负例生成Auto Neg策略提升 precision 环境安装 本项目基于 pytorch transformers 实现运行前请安装相关依赖包 pip install -r ../requirements.txttorch transformers4.22.1 datasets2.4.0 evaluate0.2.2 matplotlib3.6.0 rich12.5.1 scikit-learn1.1.2 requests2.28.12. 数据集准备 项目中提供了一部分示例数据数据来自DuIE数据集中随机抽取的100条数据在 data/DuIE 。 若想使用自定义数据训练只需要仿照示例数据构建数据集构建prompt和content即可 {content: 谭孝曾是谭元寿的长子也是谭派第六代传人, result_list: [{text: 谭元寿, start: 4, end: 7}], prompt: 谭孝曾的父亲} {content: 在圣保罗书院中学毕业后曾钰成又在中学会考及大学入学考试中名列全港前十名, result_list: [{text: 曾钰成, start: 12, end: 15}], prompt: 人物} {content: 在圣保罗书院中学毕业后曾钰成又在中学会考及大学入学考试中名列全港前十名, result_list: [{text: 圣保罗书院, start: 1, end: 6}], prompt: 曾钰成的毕业院校} ...doccano导出数据如下所示 {text: 谭孝曾是谭元寿的长子也是谭派第六代传人, entities: [{id: 42517, label: 人物, start_offset: 0, end_offset: 3, text: 谭孝曾}, {id: 42518, label: 人物, start_offset: 4, end_offset: 7, text: 谭元寿}], relations: [{id: 0, from_id: 42517, to_id: 42518, type: 父亲}]} ...可以运行 doccano.py 来将标注数据doccano转换为训练数据prompt。 3. 模型训练 修改训练脚本 train.sh 里的对应参数, 开启模型训练 python train.py \--pretrained_model uie-base-zh \--save_dir checkpoints/DuIE \--train_path data/DuIE/train.txt \--dev_path data/DuIE/dev.txt \--img_log_dir logs/ \--img_log_name UIE Base \--batch_size 32 \--max_seq_len 256 \--learning_rate 5e-5 \--num_train_epochs 20 \--logging_steps 10 \--valid_steps 100 \--device cuda:0正确开启训练后终端会打印以下信息 ...0%| | 0/1 [00:00?, ?ba/s] 100%|██████████| 1/1 [00:0000:00, 6.91ba/s] 100%|██████████| 1/1 [00:0000:00, 6.89ba/s] global step 10, epoch: 1, loss: 0.00244, speed: 2.08 step/s global step 20, epoch: 1, loss: 0.00228, speed: 2.17 step/s global step 30, epoch: 1, loss: 0.00191, speed: 2.17 step/s global step 40, epoch: 1, loss: 0.00168, speed: 2.14 step/s global step 50, epoch: 1, loss: 0.00149, speed: 2.11 step/s global step 60, epoch: 1, loss: 0.00138, speed: 2.15 step/s global step 70, epoch: 2, loss: 0.00123, speed: 2.29 step/s global step 80, epoch: 2, loss: 0.00112, speed: 2.12 step/s global step 90, epoch: 2, loss: 0.00102, speed: 2.15 step/s global step 100, epoch: 2, loss: 0.00096, speed: 2.15 step/s Evaluation precision: 0.80851, recall: 0.84444, F1: 0.82609 best F1 performence has been updated: 0.00000 -- 0.82609 ...在 logs/UIE Base.png 文件中将会保存训练曲线图 4. 模型预测 完成模型训练后运行 inference.py 以加载训练好的模型并应用 if __name__ __main__:from rich import printsentences [谭孝曾是谭元寿的长子也是谭派第六代传人。]# NER 示例for sentence in sentences:ner_example(model,tokenizer,device,sentencesentence, schema[人物])# SPO 抽取示例for sentence in sentences:information_extract_example(model,tokenizer,device,sentencesentence, schema{人物: [父亲],})NER和事件抽取在schema的定义上存在一些区别 NER的schema结构为 List 类型列表中包含所有要提取的 实体类型。 信息抽取的schema结构为 Dict 类型其中 Key 的值是所有 主语Value 对应该主语对应的所有 属性。 事件抽取的schema结构为 Dict 类型其中 Key 的值是所有 事件触发词Value 对应每一个触发词下的所有 事件属性。 python inference.py得到以下推理结果 [] NER Results: {人物: [谭孝曾, 谭元寿] }[] Information-Extraction Results: {谭孝曾: {父亲: [谭元寿]}, 谭元寿: {父亲: []} }5. 数据增强Data Augmentation 信息抽取/事件抽取的数据标注成本较高因此我们提供几种针对小样本下的数据增强策略。 包括 正例SwapSPO、Mask Then Fill 负例自分析负例生成Auto Neg 所有实现均在 Augmenter.py 中为了便于使用我们将其封装为 web 服务以方便调用 平台使用 streamlit 搭建因此使用前需要先安装三方包 pip install streamlit1.17.0随后运行以下命令开启标注平台 streamlit run web_da.py --server.port 8904在浏览器中访问 ip 端口默认8904即可打开标注平台。 5.1 正例SwapSPO 策略介绍 Swap SPO 是一种基于规则的简单数据增强策略。 将同一数据集中相同 P 的句子分成一组并随机交换这些句子中的 S 和 O。 策略输入 《夜曲》 是 周杰伦 作曲 的一首歌。 《那些你很冒险的梦》 是当下非常火热的一首歌作曲 为 林俊杰。 Swap SPO 后的输出 《夜曲》 是当下非常火热的一首歌作曲 为 周杰伦。 5.2 正例Mask Then Fill 策略介绍 Mask Then Fill 是一种基于生成模型的信息抽取数据增强策略。 对于一段文本我们其分为「关键信息段」和「非关键信息段」包含关键词片段称为「关键信息段」。 下面例子中标粗的为 关键信息片段其余的为 非关键片段。 大年三十 我从 北京 的大兴机场 飞回 了 成都。 我们随机 [MASK] 住一部分「非关键片段」使其变为 大年三十 我从 北京 [MASK] 飞回 了 成都。 随后将该句子喂给 filling 模型T5-Fine Tuned还原句子得到新生成的句子 大年三十 我从 北京 首都机场作为起点飞回 了 成都。 Note: filling 模型是一个生成模型示例中我们使用中文 T5 微调得到 DuIE 数据集下的模型暂未开源。您可以参考 这里 微调一个更适合您自己数据集下的 filling 模型并将训练好的模型路径填写至 web_da.py 中对应的位置。 ... device cpu # 指定设备 generated_dataset_height 800 # 生成样本展示高度 max_show_num 500 # 生成样本最大保存行数 max_seq_len 128 # 数据集单句最大长度 batch_size 128 # 负例生成时的batch_sizefilling_model_path 这里 # fine-tuned filling model ...5.3 负例自分析负例生成Auto Neg策略介绍 信息抽取中通常会存在 P混淆 的问题例如 王文铭76岁是西红市多鱼村的大爷。 当我们同时生成 年龄 和 去世年龄 这种非常近义的 prompt 进行抽取时可能会出现 误召回 的情况 prompt: 王文铭的年龄 answer: 76岁 - 正确 prompt: 王文铭的去世年龄 answer: 76岁 - 错误因此我们基于一个已训练好的模型自动分析该模型在 训练集 下存在哪些易混淆的 P并为这些 P 自动生成负例以提升模型的 Precision 指标。 将新生成的负例加入 原始训练数据集重新训练模型即可。 5.4 各种 DA 策略的实验效果 在 DuIE 100 条数据下测试各种 DA 策略的效果如下所示以下 P / R / F1 均取 F1 最高的 Epoch 指标 DA PolicyPrecisionbestRecallbestF1bestbaseline0.80850.84440.8260Swap SPO0.8409↑0.82220.8314↑Auto Neg0.8297↑0.8666↑0.8478↑Mask Then Fill0.9000↑1.0000↑0.9473↑Mask Then Fill Auto Neg0.9777↑0.9777↑0.9777↑ 原作者实现地址https://github.com/universal-ie/UIE paddle官方https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie https://github.com/HarderThenHarder/transformers_tasks/blob/main/UIE 更多优质内容请关注公号汀丶人工智能会提供一些相关的资源和优质文章免费获取阅读。
http://www.zqtcl.cn/news/158630/

相关文章:

  • 中文网页设计模板免费下载超级优化小说
  • 做网站的流程前端做什么网站建设与管理专业学什么
  • 用wordpress做购物网站西安建设工程网站
  • 响应式网站免费模板下载电商怎么做如何从零开始视频
  • 江西网站开发学校联系我们网站制作
  • 做网站首页图片素材营销网站制作要素
  • 云阳网站建设百度对 wordpress 排名
  • 做电商网站需要多少时间网站建设答辩ppt
  • 营销型网站的案例江苏seo网站排名优化
  • 企业网站 备案 网站名称凡科做视频网站
  • 湘潭建设公司网站杭州网站优化
  • 工信部备案网站网站空间服务商
  • 深圳市企业网站seo营销工具桂林百姓网
  • 网站建设所需材料wordpress nginx配置文件
  • 给企业做网站运营广州制作网站公司
  • 一个网站可以有几个关键词网页游戏制作过程
  • 网站可视化后台桥西区网站建设
  • 个人怎么建设网站北京朝阳区最好的小区
  • 企业应该如何建设网站江苏润祥建设集团网站
  • 沈阳网站建设价格wordpress h1标签
  • 找别人做网站一般注意什么三亚专业做网站
  • 企业营销网站的建设罗湖做网站
  • 百度蜘蛛抓取新网站WordPress20w文章
  • 国际贸易网站有哪些可植入代码网站开发
  • 信息服务平台有哪些网站东莞网站关键词
  • 青岛网站定制手机软件开发和网站开发
  • 网站数据库地址是什么看企业网站怎么做到百度秒收
  • 南昌网站建设资讯wordpress dynamo
  • 网站建设招标样本南宁培训网站建设
  • 找回网站备案密码wordpress 2015主题