基于 BERT 微调一个意图识别(Intent Classification)模型

基于 BERT 微调一个意图识别(Intent Classification)模型,你的意图类别包括:

  • 查询天气
  • 获取新闻咨询
  • 想听音乐
  • 想添加备忘
  • 查询备忘
  • 获取家政服务
  • 结束对话
  • 增加音量
  • 减小音量
  • 其他

具体实现步骤(详细版)

1. 准备你的数据集

你的数据集应该是这样的格式(通常是 CSV 或 JSON):

text label
今天上海天气怎么样? 查询天气
给我放首轻音乐 想听音乐
新闻头条是什么? 获取新闻咨询
记一下明天开会 想添加备忘
查看一下我的备忘录 查询备忘
叫个钟点工来打扫 获取家政服务
不聊了,再见 结束对话
声音大一点 增加音量
小点声 减小音量
乱说的话 其他

每一行是一个用户输入(text)和它对应的意图(label)。

注意:BERT只能识别数字标签,所以需要把意图文字映射成数字,比如:

python 复制代码
label2id = {
    "查询天气": 0,
    "获取新闻咨询": 1,
    "想听音乐": 2,
    "想添加备忘": 3,
    "查询备忘": 4,
    "获取家政服务": 5,
    "结束对话": 6,
    "增加音量": 7,
    "减小音量": 8,
    "其他": 9
}
id2label = {v: k for k, v in label2id.items()}

2. 安装需要的库
bash 复制代码
pip install transformers datasets torch scikit-learn

3. 代码:BERT意图识别模型训练
python 复制代码
import torch
from datasets import load_dataset, Dataset
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
from sklearn.model_selection import train_test_split

# 1. 准备数据
texts = [
    "今天上海天气怎么样?", "给我放首轻音乐", "新闻头条是什么?",
    "记一下明天开会", "查看一下我的备忘录", "叫个钟点工来打扫",
    "不聊了,再见", "声音大一点", "小点声", "乱说的话"
]
labels = [0, 2, 1, 3, 4, 5, 6, 7, 8, 9]  # 使用数字标签

# 切分成训练集和验证集
train_texts, val_texts, train_labels, val_labels = train_test_split(
    texts, labels, test_size=0.2, random_state=42
)

# 2. 加载分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")

# 3. 对数据进行编码
def tokenize_function(texts):
    return tokenizer(texts, padding="max_length", truncation=True, max_length=32)

train_encodings = tokenize_function(train_texts)
val_encodings = tokenize_function(val_texts)

# 4. 构建 PyTorch Dataset
class IntentDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels
    def __len__(self):
        return len(self.labels)
    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item["labels"] = torch.tensor(self.labels[idx])
        return item

train_dataset = IntentDataset(train_encodings, train_labels)
val_dataset = IntentDataset(val_encodings, val_labels)

# 5. 加载预训练BERT分类模型
model = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=10)

# 6. 设置训练参数
training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=5,
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    evaluation_strategy="epoch",
    save_strategy="epoch",
    logging_dir="./logs",
    logging_steps=10,
    learning_rate=2e-5,
)

# 7. 用Trainer训练
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=val_dataset,
)

trainer.train()

4. 训练好以后,保存模型
python 复制代码
model.save_pretrained("./intent_bert_model")
tokenizer.save_pretrained("./intent_bert_model")

5. 推理(用来预测意图)
python 复制代码
from transformers import pipeline

# 加载保存好的模型
classifier = pipeline("text-classification", model="./intent_bert_model", tokenizer="./intent_bert_model", device=0 if torch.cuda.is_available() else -1)

# 测试
text = "帮我叫个保洁阿姨"
prediction = classifier(text)
predicted_label = int(prediction[0]["label"].split("_")[-1])  # 如果是默认模型格式
print(f"预测的标签是:{id2label[predicted_label]}")

补充说明

  • 数据集:建议你准备更多的数据样本,每个意图至少几十条,效果更好。
  • 小批量数据:小批量很少时,可以使用数据增强方法(例如同义词替换、轻微打乱顺序等)扩充数据。
  • 模型优化:可以调整学习率、batch size、epoch数来进一步优化效果。
  • 多意图识别:如果未来一个句子可能有多个意图,需要做成多标签分类(现在是单标签分类)。

相关推荐
云知谷1 天前
【C++基本功】C++适合做什么,哪些领域适合哪些领域不适合?
c语言·开发语言·c++·人工智能·团队开发
rit84324991 天前
基于MATLAB实现基于距离的离群点检测算法
人工智能·算法·matlab
初学小刘1 天前
深度学习:从图片数据到模型训练(十分类)
人工智能·深度学习
递归不收敛1 天前
大语言模型(LLM)入门笔记:嵌入向量与位置信息
人工智能·笔记·语言模型
之墨_1 天前
【大语言模型】—— 自注意力机制及其变体(交叉注意力、因果注意力、多头注意力)的代码实现
人工智能·语言模型·自然语言处理
2301_821919921 天前
深度学习(四)
pytorch·深度学习
从孑开始1 天前
ManySpeech.MoonshineAsr 使用指南
人工智能·ai·c#·.net·私有化部署·语音识别·onnx·asr·moonshine
涛涛讲AI1 天前
一段音频多段字幕,让音频能够流畅自然对应字幕 AI生成视频,扣子生成剪映视频草稿
人工智能·音视频·语音识别
可触的未来,发芽的智生1 天前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
WWZZ20251 天前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam