(十三)RASA 训练数据
作者简介
作者:孟繁中
原文:https://zhuanlan.zhihu.com/p/334635257
转载者:杨夕
面筋地址:https://github.com/km1994/NLP-Interview-Notes
个人笔记:https://github.com/km1994/nlp_paper_study
假如一个机器人可以和人对话,机器人说什么是最简单的,顶多人工编写几种回答模板即可(NLG除外)。但是要让机器人理解人的意图,却是非常困难,因为人的语言有各种各样,多义词,双关,长句短句等,因此需要些特别多的数据,也就是模拟人的问法,这部分内容在Rasa里面称为训练数据。放在nlu中。从用户问,关联到机器人答的这个流程控制,rasa中有stories和rules两个配置来完成。
Rasa使用YAML作为一种统一和可扩展的方式来管理所有的训练数据,包括NLU数据、故事和规则。可以将训练数据拆分为任意数量的YAML文件,每个文件可以包含NLU数据、故事和规则的任意组合。训练数据解析器使用最上层的key确定训练数据类型。
High-level结构
每个文件可以包含一个或多个key以及相应的训练数据。一个文件可以包含多个key,但每个key在一个文件中只能出现一次。可用key包括:
版本
nlu
故事
规则
您应该在所有YAML培训数据文件中指定版本key。如果未在培训数据文件中指定版本key,Rasa将假定您使用的是已安装的Rasa开源版本支持的最新培训数据格式规范。将跳过Rasa开放源代码版本高于您在计算机上安装的版本的培训数据文件。目前,rasa2.x的最新培训数据格式规范是2.0。
下面是一个范例
version: "2.0"
nlu:
- intent: greet
examples: |
- Hey
- Hi
- hey there [Sara](name)
- intent: faq/language
examples: |
- What language do you speak?
- Do you only handle english?
stories:
- story: greet and faq
steps:
- intent: greet
- action: utter_greet
- intent: faq
- action: utter_faq
rules:
- rule: Greet user
steps:
- intent: greet
- action: utter_greet
要指定测试故事,需要将它们放入一个单独的文件中,并使用前缀test_:
tests/test_stories.yml
stories:
- story: greet and ask language
- steps:
- user: |
hey
intent: greet
- action: utter_greet
- user: |
what language do you speak
intent: faq/language
- action: utter_faq
NLU训练数据格式
NLU训练数据由按意图分类的示例用户对话组成。培训示例还可以包括实体。您还可以向训练数据中添加额外的信息,如正则表达式和查找表,以帮助模型正确识别意图和实体。NLU训练数据在NLU键下定义。可以在此项下添加的项包括:
按用户意图分组的培训示例
例如可选地使用带注释的实体
nlu:
- intent: check_balance
examples: |
- What's my [credit](account) balance?
- What's the balance on my [credit card account]{"entity":"account","value":"credit"}
实体格式是这样的
[<entity-text>]{"entity": "<entity name>", "role": "<role name>",
"group": "<group name>", "value": "<entity synonym>"}
关键字role、group和value在此表示法中是可选的。role和group字段是为实体增加属性,用于区分同类实体,例如出发地和目的地2个地名等。值字段引用同义词。
role和group可以影响对话流程,例如,如果用户刚从伦敦来,你可能想问一下伦敦之行怎么样。但是如果用户在去马德里的路上,您可能会希望用户在这里过得愉快。您可以通过以下两个故事来实现:
stories:
- story: The user just arrived from another city.
steps:
- intent: greet
- action: utter_greet
- intent: inform_location
entities:
- city: London
role: from
- action: utter_ask_about_trip
- story: The user is going to another city.
steps:
- intent: greet
- action: utter_greet
- intent: inform_location
entities:
- city: Madrid
role: to
- action: utter_wish_pleasant_stay
2、同义词
同义词将提取的实体映射到提取的文本之外的值。当用户有多种方式引用同一事物时,可以使用同义词。考虑提取实体的最终目标,并从中找出哪些值应该被视为等价的。假设您有一个实体帐户,您使用它来查找用户的余额。其中一种可能的账户类型是“信用”。您的用户还将他们的“信用”帐户称为“信用帐户”和“信用卡帐户”。在这种情况下,您可以将“信用卡账户”和“信用账户”定义为“信用”的同义词。
nlu:
- synonym: credit
examples: |
- credit card account
- credit account
3、正则表达式
当使用regexfeatureizer时,regex不作为意向分类的规则。它只为意图分类器提供一个Feature,目前,所有意向分类器都使用可以用regex提供的feature。
account_number是一个可读的描述。它可以帮助您记住regex的用途,它不必匹配任何意图或实体名称。
nlu:
- regex: account_number
examples: |
- \d{10,12}
当使用RegexEntityExtractor时,正则表达式的名称应与要提取的实体的名称匹配。例如,您可以通过在培训数据中包含此正则表达式和至少两个带注释的示例来提取10-12位数的帐号:
nlu:
- regex: account_number
examples: |
- \d{10,12}
- intent: inform
examples: |
- my account number is [1234567891](account_number)
- This is my account number [1234567891](account_number)
每当用户消息包含10-12位数字的序列时,它将被提取为帐号实体。RegexEntityExtractor不需要训练示例来学习如何提取实体,但是至少需要两个实体的注释示例,这样NLU模型就可以在训练时将其注册为实体。
4、查找表
查找表用于生成不区分大小写的正则表达式列表。它们可以与使用正则表达式的方式相同,与管道中的regexfeatureizer和RegexEntityExtractor组件结合使用。可以使用查找表来帮助提取具有已知可能值集的实体。保持你的查找表尽可能具体。例如,要提取国家名称,可以添加世界上所有国家的查找表。
nlu:
- lookup: banks
examples: |
- JPMC
- Comerica
- Bank of America