Transformer课程 业务对话机器人Rasa 3.x NLU Training Data
NLU Training Data
NLU训练数据存储有关用户消息的结构化信息。
自然语言理解(NLU)的目标是从用户消息中提取结构化信息。这通常包括用户的意图及其消息包含的任何实体。您可以向训练数据中添加额外的信息,如正则表达式和查找表,以帮助模型正确识别意图和实体。
Training Examples
NLU训练数据由按意图分类的示例用户话语组成。为了更方便地使用您的意图,请为它们指定与用户想要实现的意图相关的名称,并保持小写,避免使用空格和特殊字符。
注意:/ 符号保留为分隔符,用于将检索意图与响应文本标识符分开。确保不要以你的意图的名义使用它。
Entities
实体是用户消息中的结构化信息片段。要使实体提取工作正常,您需要指定训练数据来训练ML模型,或者需要定义正则表达式来使用基于字符模式的RegexEntityExtractor提取实体。
在决定需要提取哪些实体时,请考虑助手需要哪些信息来实现其用户目标。用户可能会提供任何用户目标都不需要的其他信息;您不需要将它们提取为实体。
有关如何在训练数据中注释实体的详细信息,请参见训练数据格式。
Synonyms
同义词#
同义词将提取的实体映射到提取的文本以外的值。当用户以多种方式引用同一事物时,可以使用同义词。考虑提取实体的最终目标,并从中找出哪些值应被视为等效值。
假设您有一个实体 account 帐户,用于查找用户的余额。可能的账户类型之一是 credit“信用”。您的用户也将其 credit“信用”账户称为“信用账户”和“信用卡账户”。
在这种情况下,您可以将“信用卡账户”和“信用账户”定义为“信用”的同义词:
nlu:
- synonym: credit
examples: |
- credit card account
- credit account
然后,如果这些短语中的任何一个被提取为一个实体,它将被映射到值credit。
提供训练示例
同义词映射仅在提取实体后发生。这意味着您的训练示例应包括同义词示例(信用卡帐户和信用帐户),以便模型将学习将它们识别为实体,并将其替换为信用。
有关如何在训练数据中包含同义词的详细信息,请参见训练数据格式。
Regular Expressions#
您可以结合管道中的RegexFeatureizer和RegexEntityExtractor组件,使用正则表达式改进意图分类和实体提取。
Regular Expressions for Intent Classification
通过在管道中包含RegexFeatureizer组件,可以使用正则表达式改进意图分类。使用RegexFeatureizer时,regex不作为对意图进行分类的规则。它只提供了意图分类器将用于学习意图分类模式的功能。目前,所有意图分类器都使用可用的正则表达式特性。
在本例中,正则表达式的名称是人类可读的描述。它可以帮助您记住正则表达式的用途,它是相应模式功能的标题。它不必匹配任何意图或实体名称。“help”请求的正则表达式可能如下所示
nlu:
- regex: help
examples: |
- \bhelp\b
被匹配的意图可以是问候、帮助我、帮助或其他任何事情。
尝试以尽可能少的单词匹配的方式创建正则表达式。例如,使用\bhelp\b代替 help.*,因为后者可能匹配整个消息,而前者只匹配一个单词。
提供训练示例
RegexFeatureizer为意图分类器提供功能,但它不能直接预测意图。包括足够多包含正则表达式的示例,以便意图分类器可以学习使用正则表达式功能。
Regular Expressions for Entity Extraction
如果实体具有确定性结构,则可以通过以下两种方式之一使用正则表达式:
- 正则表达式作为特征#
可以使用正则表达式为NLU管道中的RegexFeatureizer组件创建功能。
将正则表达式与RegexFeatureizer一起使用时,正则表达式的名称无关紧要。使用RegexFeatureizer时,正则表达式提供了一个功能,可以帮助模型了解意图/实体与符合正则表达式的输入之间的关联
提供训练示例
RegexFeatureizer为实体提取器提供功能,但它不能直接预测实体。包括足够多包含正则表达式的示例,以便实体提取器可以学习使用正则表达式功能。
用于实体提取的正则表达式功能目前仅受CRFEntityExtractor和DIETClassifier组件的支持。其他实体提取器,如MitieEntityExtractor或SpacEntityExtractor,不会使用生成的特征,它们的存在也不会改善这些提取器的实体识别。
- Regular Expressions for Rule-based Entity Extraction#
可以使用NLU管道中的RegexEntityExtractor组件使用正则表达式进行基于规则的实体提取。
使用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模型可以在训练时将其注册为实体。
Lookup Tables
查找表是用于生成不区分大小写的正则表达式模式的单词列表。它们可以与正则表达式的使用方式相同,与管道中的RegexFeatureizer和RegexEntityExtractor组件结合使用。
可以使用查找表来帮助提取具有一组已知可能值的实体。让你的查找表尽可能具体。例如,要提取国家名称,可以添加世界上所有国家的查找表:
nlu:
- lookup: country
examples: |
- Afghanistan
- Albania
- ...
- Zambia
- Zimbabwe
在将查找表与RegexFeatureizer一起使用时,请提供足够多的示例,说明要匹配的意图或实体,以便模型可以学习将生成的正则表达式用作功能。将查找表与RegexEntityExtractor一起使用时,请提供至少两个实体的注释示例,以便NLU模型可以在训练时将其注册为实体。
Entities Roles and Groups
通过将单词注释为自定义实体,可以在训练数据中定义某些概念。例如,可以通过注释城市来标识城市:
I want to fly from [Berlin]{"entity": "city"} to [San Francisco]{"entity": "city"} .
但是,有时您希望为实体添加更多细节。
例如,要构建一个应该预订航班的助手,助手需要知道上面示例中的两个城市中的哪个是出发城市,哪个是目的地城市。柏林和旧金山都是城市,但它们在信息中扮演着不同的角色。要区分不同的角色,除了实体标签外,还可以指定角色标签。
I want to fly from [Berlin]{"entity": "city", "role": "departure"} to [San Francisco]{"entity": "city", "role": "destination"}.
还可以通过在实体标签旁边指定组标签来对不同的实体进行分组。例如,组标签可用于定义不同的订单。在下面的示例中,组标签指定了哪些配料与哪些披萨搭配,以及每个披萨的大小。
Give me a [small]{"entity": "size", "group": "1"} pizza with [mushrooms]{"entity": "topping", "group": "1"} and
a [large]{"entity": "size", "group": "2"} [pepperoni]{"entity": "topping", "group": "2"}
有关如何在训练数据中定义具有角色和组的实体的详细信息,请参见训练数据格式。
提取器返回的实体对象将包括检测到的角色/组标签。
{
"text": "Book a flight from Berlin to SF",
"intent": "book_flight",
"entities": [
{
"start": 19,
"end": 25,
"value": "Berlin",
"entity": "city",
"role": "departure",
"extractor": "DIETClassifier",
},
{
"start": 29,
"end": 31,
"value": "San Francisco",
"entity": "city",
"role": "destination",
"extractor": "DIETClassifier",
}
]
}
实体角色和组目前仅由DIETClassifier和CRFEntityExtractor支持。
为了正确地使用具有角色和组的实体训练模型,请确保为实体和角色或组标签的每个组合提供足够的训练示例。为了使模型能够泛化,请确保在训练示例中有一些变化。例如,你应该包括像从x飞到y这样的例子,而不仅仅是从x飞到y。
要使用特定角色/组填充实体中的插槽,需要为插槽定义from_entity插槽映射,并指定所需的角色/组。例如:
entities:
- city:
roles:
- departure
- destination
slots:
departure:
type: any
mappings:
- type: from_entity
entity: city
role: departure
destination:
type: any
mappings:
- type: from_entity
entity: city
role: destination
Entity Roles and Groups influencing dialogue predictions
如果你想通过角色或群组影响对话预测,你需要修改你的故事以包含所需的角色或群组标签。您还需要在域文件中列出实体的相应角色和组。
假设您希望根据用户的位置输出不同的句子。例如,如果用户刚从伦敦抵达,您可能想问一下伦敦之行如何。但是,如果用户正在前往马德里的途中,您可能希望用户在这里过得愉快。您可以通过以下两个故事来实现这一点:
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
BILOU Entity Tagging
DIETClassifier和CRFEntityExtractor具有选项BILOU_flag,这是指机器学习模型在处理实体时可以使用的标记模式。BILOU是开始、内部、最后、外部和单位长度的缩写。
例如,训练示例
[Alex]{"entity": "person"} is going with [Marty A. Rick]{"entity": "person"} to [Los Angeles]{"entity": "location"}.
与普通标记模式相比,BILOU标记模式更丰富。这可能有助于提高机器学习模型在预测实体时的性能。
不一致的BILOU标签
当选项BILOU_flag设置为True时,模型可能会预测不一致的BILOU标签,例如B-person I-location L-person。Rasa开源使用一些启发式方法来清理不一致的BILOU标记。例如,B-person I-location L-person将更改为B-person I-person L-person。