意图识别模型微调训练 根据自己准备的数据CPU就能训练微调意图模型-亲测验证有效

意图识别模型微调训练 根据自己准备的数据CPU就能训练微调意图模型-亲测验证有效

意图识别作用

在问答对话中,准确理解用户的意图是构建有效回答的关键。意图识别,即 判断用户想要什么 ,相当于为系统定向选择场景,帮助系统更精确的选择回复路径。

在这里插入图片描述

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

运行环境

Python 3.8

下载代码
git clone https://github.com/Linear95/bert-intent-slot-detector.git

pycharm开发工具导入项目

训练数据准备

示例代码里自带了测试数据在:data/SMP2019下,我们参考这些测试数据,根据自己的业务制作训练数据

训练数据:

以json格式给出,每条数据包括三个关键词:
text表示待检测的文本,
intent代表文本的类别标签,
slots是文本中包括的所有槽位以及对应的槽值,以字典形式给出。
在data/路径下,新创建目录如:data/20241031。

训练数据放入data/20241031/train.json文件中,部分示例数据例如下:

 {
    "text": "打开空调",
    "domain": "DEVICE_CONTROL",
    "intent": "DEVICE_CONTROL",
    "slots": {
      "question": "打开空调",
      "device_desc": "空调"
    }
  },
  {
    "text": "帮我生成一首诗",
    "domain": "COMMON",
    "intent": "COMMON",
    "slots": {
      "question": "帮我生成一首诗"
    }
  }

复制data/SMP2019/split_data.py放入data/20241031目录,然后运行,会将20241031的所有数据拆分成一个训练集split_train.json和一个测试集split_test.json

运行split_data.py程序 报错时:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 35: illegal multibyte sequence

增加编码格式:encoding=‘utf-8’

open(‘train.json’, ‘r’, encoding=‘utf-8’) as f

生产意图标签和槽位标签

复制data/SMP2019/extract_labels.py放入data/20241031目录,然后运行extract_labels.py程序,会生成意图标签intent_labels.txt文件和槽位标签slot_labels.txt文件。
同样报错时:UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 35: illegal multibyte sequence
同样也是要增加编码格式:encoding=‘utf-8’

open(‘train.json’, ‘r’, encoding=‘utf-8’) as f

  • 意图标签:

以txt格式给出,每行一个意图,未识别意图以[UNK]标签表示。在data/20241031/intent_labels.txt文件下:

[UNK]
COMMON
CARD_QUERY
DEVICE_QUERY
...
  • 槽位标签:

与意图标签类似,以txt格式给出。包括三个特殊标签: [PAD]表示输入序列中的padding token, [UNK]表示未识别序列标签, [O]表示没有槽位的token标签。对于有含义的槽位标签,又分为以’B_'开头的槽位开始的标签, 以及以’I_'开头的其余槽位标记两种。
在data/20241031/slot_labels.txt文件下:

[PAD]
[UNK]
[O]
I_question
B_question
I_device_desc
B_device_desc
I_name
B_name
...
根据准备的数据,训练意图模型

可以直接修改train.py代码,然后运行
在这里插入图片描述

if __name__ == '__main__':
    #训练自己的数据,生成意图模型
    parser = argparse.ArgumentParser()

    # environment parameters
    parser.add_argument("--cuda_devices", type=str, default='0', help='set cuda device numbers')
    parser.add_argument("--no_cuda", action='store_true', default=False, help='whether use cuda device for training')

    # model parameters
    parser.add_argument("--tokenizer_path", type=str, default='bert-base-chinese',
                        help="pretrained tokenizer loading path")
    parser.add_argument("--model_path", type=str, default='bert-base-chinese', help="pretrained model loading path")

    # data parameters
    parser.add_argument("--train_data_path", type=str,
                        default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\split_train.json',
                        help="training data path")
    parser.add_argument("--test_data_path", type=str,
                        default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\split_test.json',
                        help="testing data path")
    parser.add_argument("--slot_label_path", type=str,
                        default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\slot_labels.txt',
                        help="slot label path")
    parser.add_argument("--intent_label_path", type=str,
                        default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\intent_labels.txt',
                        help="intent label path")

    # training parameters
    parser.add_argument("--save_dir", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\saved_model',
                        help="directory to save the model")
    parser.add_argument("--max_training_steps", type=int, default=0,
                        help='max training step for optimizer, if larger than 0')
    parser.add_argument("--gradient_accumulation_steps", type=int, default=1,
                        help="number of updates steps to accumulate before performing a backward() pass.")
    parser.add_argument("--saving_steps", type=int, default=300, help="parameter update step number to save model")
    parser.add_argument("--logging_steps", type=int, default=10,
                        help="parameter update step number to print logging info.")
    parser.add_argument("--eval_steps", type=int, default=10,
                        help="parameter update step number to print logging info.")
    parser.add_argument("--saving_epochs", type=int, default=1, help="parameter update epoch number to save model")

    parser.add_argument("--batch_size", type=int, default=32, help='training data batch size')
    parser.add_argument("--train_epochs", type=int, default=5, help='training epoch number')

    parser.add_argument("--learning_rate", type=float, default=5e-5, help='learning rate')
    parser.add_argument("--adam_epsilon", type=float, default=1e-8, help="epsilon for Adam optimizer")
    parser.add_argument("--warmup_steps", type=int, default=0, help="warmup step number")
    parser.add_argument("--weight_decay", type=float, default=0.0, help="weight decay rate")
    parser.add_argument("--max_grad_norm", type=float, default=1.0, help="maximum norm for gradients")

    args = parser.parse_args()

    train(args)

在这里插入图片描述

也可以不修改代码,使用命令行动态传参的方式运行

可以使用以下命令进行模型训练,这里我们选择在bert-base-chinese预训练模型基础上进行微调:

python train.py \
       --cuda_devices 0 \
       --tokenizer_path "bert-base-chinese" \
       --model_path "bert-base-chinese" \
       --train_data_path "D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\split_train.json" \
       --test_data_path "D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\split_test.json" \
       --intent_label_path "D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\intent_labels.txt" \
       --slot_label_path "D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\slot_labels.txt" \
       --save_dir "D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\\20241031\saved_model" \
       --batch_size 32 \
       --train_epochs 5

在这里插入图片描述
在这里插入图片描述

运行成功后会在data\20241031\saved_model生成微调后的模型
在这里插入图片描述

运行微调后的模型 测试意图识别能力

运行detector.py程序

if __name__ == '__main__':
   
    model_path = 'data/20241031/saved_model/model/model_epoch4'
    tokenizer_path = 'data/20241031/saved_model/tokenizer/'
    intent_path = 'data/20241031/intent_labels.txt'
    slot_path = 'data/20241031/slot_labels.txt'

    model = JointIntentSlotDetector.from_pretrained(
        model_path=model_path,
        tokenizer_path=tokenizer_path,
        intent_label_path=intent_path,
        slot_label_path=slot_path
    )

    while True:
        text = input("input: ")
        print(model.detect(text))

验证识别效果
在这里插入图片描述

参考链接:https://github.com/Linear95/bert-intent-slot-detector

<think>好的,用户的问题是关于如何在Navicat中添加表注释的方法。我需要根据提供的引用内容来回答这个问题。首先,查看用户提供的引用资料,引用[1]提到了在Navicat中生成字段备注的方法,包括通过模型导入数据库并显示字段注释。引用[2]虽然主要讲的是连接Oracle的问题,但可能和表结构相关。 首先,用户问的是表注释,而引用[1]中提到了字段注释,但可能步骤类似。需要确认Navicat中是否可以通过类似的方法添加表注释。可能需要进入表的设计界面,找到注释的输入框。另外,可能通过SQL语句直接修改表的注释,比如使用COMMENT ON TABLE语句,这在Oracle或MySQL中是不同的语法。 接下来,检查是否引用中有直接提到表注释。引用[1]提到的是字段注释,但用户需要的是表注释。可能需要引导用户到表设计界面,寻找注释的选项。或者,如果Navicat的模型功能支持导入表结构后显示注释,可能需要指导用户如何在模型中添加注释,然后同步到数据库。 另外,可能需要区分不同数据库类型,比如MySQL和Oracle在添加注释时的SQL语法不同。用户的问题没有指定数据库类型,所以应该提供通用的方法,或者分别说明。 总结步骤可能包括:1. 使用设计表功能,在界面中添加注释;2. 执行SQL语句添加注释;3. 通过模型工具导入并显示注释。需要确保步骤清晰,并验每个方法的正确性。同时,要确保回答符合用户的需求,可能还需要提醒用户注意数据库类型差异。</think>### 如何在Navicat中添加表注释的方法教程 在Navicat中为表添加注释可以通过以下两种方式实现: --- #### **方法一:通过表设计界面添加** 1. **连接数据库** 打开Navicat,选择对应的数据库(如MySQL、Oracle等)并建立连接[^2]。 2. **进入表设计界面** - 在左侧对象列表中找到目标表,右键点击选择 **“设计表”**(不同数据库可能显示为“设计”或“修改表”)。 - 在表设计界面中,通常会有一个 **“注释”**(Comment)字段,直接输入表注释内容即可。 3. **保存修改** 完成注释输入后,点击 **“保存”** 按钮,注释即生效。 --- #### **方法二:通过SQL语句直接添加** 如果界面操作不支持注释字段,可以通过执行SQL语句实现(以MySQL和Oracle为例): - **MySQL语法** ```sql ALTER TABLE 表名 COMMENT '这是表注释'; ``` - **Oracle语法** ```sql COMMENT ON TABLE 表名 IS '这是表注释'; ``` 在Navicat中新建查询窗口,输入对应SQL语句并执行即可[^1]。 --- #### **验注释是否生效** 1. 在数据库对象列表中右键点击表,选择 **“对象信息”** 或 **“属性”**,查看注释字段。 2. 通过执行SQL查询语句(如 `SHOW CREATE TABLE 表名`)确认注释已添加。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond阿亮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值