【工程实践】使用Roformer-sim(SimBERTv2 )做数据增强

前言

        此文仅记录以Roformer-sim为基础模型做数据增强的过程,Roformer-sim模型细节请移步:SimBERTv2来了!融合检索和生成的RoFormer-Sim模型 - 科学空间|Scientific Spaces

https://github.com/ZhuiyiTechnology/roformer-sim

1.功能介绍

        可以用作数据增强与文本相似度计算。

2.安装与使用

2.1 安装

        代码依赖的运行环境为 tensorflow 1.14、keras 2.2.5、bert4keras 0.10.6。

        由于代码的运行依赖于tensor flow1.14,与现有base环境中的tensorflow版本冲突,所以为了避免环境中各个库的互相影响,在实践时新建了conda 环境。

2.1.1 创建

conda create --name DataAug python=3.6

2.1.2 激活

conda activate DataAug

2.1.3 下载依赖项

pip install tensorflow==1.14 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install keras==2.2.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install bert4keras==0.10.6 -i https://pypi.tuna.tsinghua.edu.cn/simple/

2.1.4 下载资源

git clone https://github.com/ZhuiyiTechnology/roformer-sim

2.1.5 下载模型

2.2 使用

2.2.1 运行generate.py

        将其中的模型文件路径替换,运行generate.py即可。

2.2.2 问题

        假设报错:TensorFlow binary was not compiled to use: AVX2 FMA,那么在开头添加:

import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' os.environ['KERAS_BACKEND']='tensorflow'

2.2.3 开启服务

        使用flask和tensorflow进行配合开启服务时,会报错。后期选择使用FastAPI开启服务。

#! -*- coding: utf-8 -*-
# RoFormer-Sim base 基本例子
# 测试环境:tensorflow 1.14 + keras 2.3.1 + bert4keras 0.10.6
#import flask
#from flask import request
import numpy as np
import json
import uvicorn
from fastapi import FastAPI

from bert4keras.backend import keras, K
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import sequence_padding, AutoRegressiveDecoder
from bert4keras.snippets import uniout
import os 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
os.environ['KERAS_BACKEND']='tensorflow'
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
maxlen = 64

# 模型配置
config_path = '/ssd/dongzhenheng/Pretrain_Model/chinese_roformer-sim-char-ft_L-12_H-768_A-12/bert_config.json'
checkpoint_path = '/ssd/dongzhenheng/Pretrain_Model/chinese_roformer-sim-char-ft_L-12_H-768_A-12/bert_model.ckpt'
dict_path = '/ssd/dongzhenheng/Pretrain_Model/chinese_roformer-sim-char-ft_L-12_H-768_A-12/vocab.txt'
            

# 建立分词器
tokenizer = Tokenizer(dict_path, do_lower_case=True)  # 建立分词器

# 建立加载模型
roformer = build_transformer_model(
    config_path,
    checkpoint_path,
    model='roformer',
    application='unilm',
    with_pool='linear'
)

encoder = keras.models.Model(roformer.inputs, roformer.outputs[0])
seq2seq = keras.models.Model(roformer.inputs, roformer.outputs[1])


class SynonymsGenerator(AutoRegressiveDecoder):
    """seq2seq解码器
    """
    @AutoRegressiveDecoder.wraps(default_rtype='probas')
    def predict(self, inputs, output_ids, step):
        token_ids, segment_ids = inputs
        token_ids = np.concatenate([token_ids, output_ids], 1)
        segment_ids = np.concatenate([segment_ids, np.ones_like(output_ids)], 1)
        return self.last_token(seq2seq).predict([token_ids, segment_ids])

    def generate(self, text, n=1, topp=0.95, mask_idxs=[]):
        token_ids, segment_ids = tokenizer.encode(text, maxlen=maxlen)
        for i in mask_idxs:
            token_ids[i] = tokenizer._token_mask_id
        output_ids = self.random_sample([token_ids, segment_ids], n,
                                        topp=topp)  # 基于随机采样
        return [tokenizer.decode(ids) for ids in output_ids]


synonyms_generator = SynonymsGenerator(
    start_id=None, end_id=tokenizer._token_end_id, maxlen=maxlen
)


def gen_synonyms(text, n,k, mask_idxs):
    ''''含义: 产生sent的n个相似句,然后返回最相似的k个。
    做法:用seq2seq生成,并用encoder算相似度并排序。
    '''
    r = synonyms_generator.generate(text, n, mask_idxs=mask_idxs)
    r = [i for i in set(r) if i != text]
    r = [text] + r
    X, S = [], []
    for t in r:
        x, s = tokenizer.encode(t)
        X.append(x)
        S.append(s)
    X = sequence_padding(X)
    S = sequence_padding(S)
    Z = encoder.predict([X, S])
    Z /= (Z**2).sum(axis=1, keepdims=True)**0.5
    argsort = np.dot(Z[1:], -Z[0]).argsort()
    return [r[i + 1] for i in argsort[:k]]

app = FastAPI()
@app.get("/sentence/{sentence}")
async def get_item(sentence:str):
    resp = {}
    result = gen_synonyms(text=sentence,n=50,k=20,mask_idxs=[])
    resp['result'] = result
    return json.dumps(resp, ensure_ascii=False)

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=9516)
#发送请求
prefix_url = 'http://0.0.0.0:9516/DataAugment?'
params = {
      'sentence':text
         }
response = requests.get(prefix_url,params)
result_list = response.json()['resp']
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PK-Sim是一款用于药物动力学和药效学建模与仿真的软件工具。它可以帮助研究人员和药物开发人员预测药物在人体内的行为,优化药物剂量和给药方案,并评估药物的疗效和安全性。 PK-Sim使用教程可以分为以下几个步骤: 1. 安装和启动:首先,您需要从PK-Sim官方网站下载并安装PK-Sim软件。安装完成后,启动软件。 2. 创建项目:在PK-Sim中,您可以创建一个新的项目来进行建模和仿真。在创建项目时,您需要选择适当的模型类型和参数设置。 3. 建立模型:在项目中,您可以使用PK-Sim提供的模型库来构建药物动力学和药效学模型。您可以选择合适的生理学模型、药物模型和生理学参数,并进行参数设置。 4. 设定实验方案:在模型建立完成后,您可以设定实验方案来模拟不同的给药方案和剂量。您可以设置给药途径、给药时间和剂量等参数。 5. 运行仿真:完成实验方案设置后,您可以运行仿真来模拟药物在人体内的行为。PK-Sim将根据模型和实验方案计算药物的浓度和效应等参数。 6. 分析结果:仿真完成后,您可以分析和评估仿真结果。PK-Sim提供了丰富的结果分析工具,包括药物浓度曲线、药物效应曲线和药物动力学参数等。 以上是PK-Sim的基本使用教程。如果您需要更详细的指导和操作步骤,建议您参考PK-Sim官方网站提供的用户手册和教程视频。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值