什么是 DIETClassifier?
Source: Dev.to
什么是 DIETClassifier?
DIET 代表 Dual Intent and Entity Transformer(双意图与实体转换器)。
它是一个单一的神经网络,能够执行:
- 意图分类
- 实体抽取
不同于仅关注实体的 CRFEntityExtractor,DIET 同时学习:
- 整句话的含义(意图)
- 每个 token 的角色(实体标签)
这种共享学习使模型能够利用意图层面的上下文来提升实体预测,反之亦然。
为什么要引入 DIET?
传统的流水线通常是这样:
- 意图分类器 → 预测意图
- 实体抽取器 → 独立预测实体
这种分离的缺点:
- 特征计算重复
- 意图与实体之间缺乏共享理解
- 需要训练、调优和维护更多模型
DIET 通过使用一个模型学习共享嵌入并同时优化两个任务来解决这些问题,尤其在训练数据有限时能够获得更好的性能。
DIET 的工作原理
DIET 基于 Transformer 架构。高层次上,它:
- 对输入文本进行分词
- 将 token 转换为嵌入向量
- 通过 Transformer 层建模上下文
并预测:
- 句子嵌入 → 意图
- Token 级别标签 → 实体
不同于 CRF 中的手工特征,DIET 自动学习特征。
使用 DIET 进行意图分类
在意图分类时,DIET:
- 对整句话进行嵌入
- 与学习到的意图嵌入进行比较
- 使用相似度得分选择最佳意图
示例
“预订一张飞往巴黎的机票。”
模型会学习到该句子的嵌入最接近 book_flight 意图,从而使 DIET 能够很好地泛化到同义句和未见过的表达。
使用 DIET 进行实体抽取
DIET 执行 token 级别的分类,类似于 CRF。每个 token 会得到诸如 B-entity、I-entity、O 等标签。
Book O
a O
flight O
from O
New B-location
York I-location
to O
Paris B-location
不同之处在于,DIET 使用 Transformer 产生的上下文嵌入,而不是手工设计的特征。
训练数据格式
DIET 使用与 CRF 相同的标注 NLU 数据。
version: "3.1"
nlu:
- intent: book_flight
examples: |
- Book a flight from [New York](location) to [Paris](location)
- Fly from [Berlin](location) to [London](location)
没有针对意图或实体的单独配置;DIET 从同一份数据中同时学习两者。
内部工作(简化版)
运行时,DIET:
- 对消息进行分词
- 生成嵌入向量
- 通过 Transformer 层
预测:
- 带置信度的意图
- 每个 token 的实体标签
- 实体 token 的分组
示例输出
{
"intent": {
"name": "book_flight",
"confidence": 0.92
},
"entities": [
{
"entity": "location",
"value": "Paris",
"start": 23,
"end": 28
}
]
}
何时使用 DIETClassifier?
当你希望使用单一模型同时处理意图和实体时,DIETClassifier 是默认选择,尤其在以下情况下:
- 语言灵活且对话式
- 需要长期可扩展性或构建生产级助手
CRFEntityExtractor 和 RegexEntityExtractor 在高度结构化或确定性的实体场景下仍有价值,但 DIET 已成为现代 Rasa NLU 流水线的核心。