Rasa|Rasa 入门教程 NLU 系列(二)

rasa_tutorial_nlu_background.png Rasa 入门教程 NLU 系列包括六个部分,前面介绍了Rasa 入门教程 NLU 系列(一),本文主要介绍 Rasa 框架中的 NLU 系列中的第二部分:训练数据格式。Rasa NLU 是一种开源自然语言处理工具,用于对话机器人中的意图分类、响应检索和实体提取。
本文的目录结构:

  1. 数据格式
  2. 提高意图分类和实体识别
  3. 数据标准化
  4. 生成更多实体示例
1. 数据格式 NLU 模型的数据格式有两种:Markdown 或 JSON,训练数据存储在一个文件中或者一个目录下的多个文件中,通常使用 Markdown 格式。
1.1 Markdown 格式
Markdown 是易读易写的 Rasa NLU 格式,示例中使用 Markdown 的链接语法来表示实体,比如:[entity](entitiy name)
## intent:check_balance - what is my balance - how much do I have on my [savings](source_account) - how much do I have on my [savings account](source_account:savings) - Could I pay in [yen](currency)?## intent:greet - hey - hello## synonym:savings - pink pig## regex:zipcode - [0-9]{5}## lookup:currencies - Yen - USD - Euro## lookup:additional_currencies path/to/currencies.txt

Rasa NLU 的训练数据分为以下几个部分:
  1. 通用示例
  2. 同义词
  3. 正则表达式
  4. 查找表
其中通用示例部分是必须有的,其他部分虽然不是必须的,但是有助于 NLU 模型的训练学习,让 NLU 模型的预测更准确。
同义词部分是将提取的实体映射到相同的名称,例如:“我的储蓄账户”映射为“储蓄”。但是,这仅仅在提取实体之后才会发生,因此你需要提供同义词的示例,以便 Rasa 可以学习提取。
查找表部分可以直接指定为列表,也可以指定为 txt 文件(单词或短语以换行分隔)。一旦加载训练数据,这些文件用于生成不区分大小的正则表达式模式,该模式会添加到正则表达式部分中。比如:在上面的例子中,将提供货币名称列表,以便更容易提取该实体。
1.2 JSON 格式
JSON 格式的最外层字段是 rasa_nlu_data,包含 common_examples entity_synonyms regex_features lookup_tables 字段,其中最重要的是common_examples 字段。
{ "rasa_nlu_data": { "common_examples": [], "regex_features" : [], "lookup_tables": [], "entity_synonyms": [] } }

common_examples 是用来训练你的模型,你应该将所有训练示例放在 common_examples 数组中,正则表达式是辅助分类器检测实体或者意图并提高性能的工具。
2. 提高意图分类和实体识别 2.1 通用示例
通用示例由三部分组成:text intententities。前两个是字符串,最后一个是数组。
  • text 用户消息(必填)
  • intent 意图,与用户消息相关的意图(可选)
  • entities 实体,需要被识别的特定文本(可选)
实体使用 startend 值指定,共同构成一个 Python 样式范围以应用于字符串,比如:text="show me chinese restaurants",然后 text[8:15]=='chinese'。实际上,实体可以跨越多个单词,也不必与示例中的字符串一一对应,这样有助于将同义词或拼写错误的词映射到同一个词上。
## intent:restaurant_search - show me [chinese](cuisine) restaurants

2.2 正则表达式
正则表达式用于支持意图分类和实体提取。例如:如果你的实体具有确定性结构(比如邮政编码、电子邮箱地址等),则可以使用正则表达式来简化对该实体的检测。对于邮政编码示例如下:
## regex:zipcode - [0-9]{5}## regex:greet - hey[^\\s]*

示例中并没有定义实体、也没有定义意图,仅仅是个描述,你可以记住该正则表达式的用途和对应模式特征的标题。使用正则表达式有助于改善意图分类性能。
尽可能少的使用单词匹配的方式来创建正则表达式,例如:使用 hey[^\s]* 而不是 hey.*,第一个可能只匹配一个单词,第二个可能匹配整个消息。
用于实体提取的正则表达式功能,目前只有CRFEntityExtractor 组件支持,其他实体提取器不支持(MitieEntityExtractor SpacyEntityExtractor)。目前,所有的意图分类器都是支持正则表达式功能的。
2.3 查找表
查找表可以直接指定为列表,也可以指定为 txt 文件(单词或短语以换行分隔)。例如:data/test/lookup_tables/plates.txt 可能包括:
tacos beef mapo tofu burrito lettuce wrap

可以通过以下方式加载:
## lookup:plates data/test/lookup_tables/plates.txt

或者直接将元素包含在查找表中:
## lookup:plates - tacos - beef - mapo tofu - burrito - lettuce wrap

在数据训练过程中提供查找表,内容将由一个大写和不区分大小写的正则表达式模式组成,该模式在训练示例中查找完全匹配的内容。这些正则表达式可以匹配多个令牌,因此 lettuce wrap 将匹配为 get me a lettuce wrap ASAP ,编码为 [0 0 0 1 1 0] 。这些正则表达式的处理方式与直接在训练数据中指定的正则表达式处理方式是相同的。
注意:为了使查找表有效,你的训练数据中必须有一些匹配示例,否则模型不会学习使用查找表匹配功能。在向查找表添加数据时要小心存在错误数据或者其他噪音数据,这可能会影响性能,请确保查找表中的数据为干净数据。
3. 数据标准化 3.1 实体同义词
实体同义词是指具有相同值的实体,比如:
## intent:search - in the center of [NYC](city:New York City) - in the centre of [New York City](city)

在上面示例中,实体 city 的值均为 New York City。每当找到相同的文本时,该值将使用同义词代替消息中的实际文本。在训练数据中定义同义词,你需要在 pipeline 中定义 EntitySynonymMapper 组件。另外,你也可以添加一个 entity_synonyms 数组来为一个实体值定义多个同义词。比如:
## synonym:New York City - NYC - nyc - the big apple

4. 生成更多的示例 有时生成更多实体示例会很有帮助,比如你有餐厅名称数据库。在社区中也有一些工具来帮助生成更多的实体示例。你也可以使用 Chatito(一种使用简单的 DSL 或 Tracy 以 rasa 格式生成训练数据集的工具)工具来创建一些训练数据集。但是,生成更多的示例通常会导致过拟合,如果有大量实体值,建议使用查找表功能。
作者:关于我
备注:转载请注明出处。
【Rasa|Rasa 入门教程 NLU 系列(二)】如发现错误,欢迎留言指正。

    推荐阅读