Rasa教程系列-NLU-1-训练集格式

拥有回忆 提交于 2020-01-13 23:24:40

1. 数据格式

NLU模块的训练可以使用 Markdown 或 JSON格式的数据。可以是单个文件也可以是某个目录下的多个文件。推荐使用Markdown格式~用起来简单。

1.1 Markdown格式

作为Rasa NLU的一种格式,Markdown最易于阅读和书写。NLU中的examples以无序列表语法的形式给出,如-,*,+。examples 通过 intent 进行组合,实体和实体的名字通过 markdown 的链接形式给出,如[entity](entity name)。下面给出一个NLU数据集的Markdown实例:

- what is my balance <!-- no entity -->
- how much do I have on my [savings](source_account) <!-- entity "source_account" has value "savings" -->
- how much do I have on my [savings account](source_account:savings) <!-- synonyms, method 1-->
- Could I pay in [yen](currency)?  <!-- entity matched by lookup table -->

## intent:greet
- hey
- hello

## synonym:savings   <!-- synonyms, method 2 -->
- pink pig

## regex:zipcode
- [0-9]{5}

## lookup:additional_currencies  <!-- specify lookup tables in an external file -->
path/to/currencies.txt

Rasa NLU 数据集可以结构化为4个部分:

  • 常见示例(common example)
  • 同义词(synonyms)
  • 正则化特征(regex features)
  • 查找表(lookup tables)

虽然常见示例是唯一必填部分,但是其他部分有助于减少训练NLU模型所需要的例子,并提升NLU模型预测的置信度。

同义词可以将提取出来的实体映射到同一个名字,如例子中将"savings account" 映射为"savings"。但是,这个仅仅发生在实体被提取出来之后,因此需要提供含有同义词表述的实例,使得Rasa能够通过学习将实体提取出来。

查找表Lookup tables 可以以纯文本txt文件的形式提供,并以newline分隔words或者phrases。当加载训练数据的时,这些文件生成大小写不敏感的正则化模式,并添加到正则化特征。
注意:
常见示例、正则表达式特性和查找表仅仅为最终NLU模型提供线索,并通过在训练期间为机器学习算法提供额外的特性。因此,不能假设只有一个单一的例子就足以让模型足够鲁棒性地识别例子所有变体中的意图和/或实体。
另外,需要注意的是/符号是被保留的分隔符,将检索意图与响应文本标识符分隔开。确保不要在意图名中使用该符号。

1.2 Json 格式

Json格式由top level对象rasa_nlu_data所包含,对应的keys有:common_examples(最为重要), entity_synonymsregex_features。具体示例如下:

{
    "rasa_nlu_data": {
        "common_examples": [],
        "regex_features" : [],
        "lookup_tables"  : [],
        "entity_synonyms": []
    }
}

common_examples中的数据用以训练NLU模型。与Markdown格式一样Regex features用以辅助意图和实体分类。

2. 改善意图分类和实体识别

2.1 常见示例(Common Examples)

常见示例common examples主要由三个部分组成:text,intent,entities。前两个是字符串,最后一个是数组。

  • text是用户消息,必填
  • intent是text对应的意图,选填
  • entities是text中需要被标识出来的部分,选填

Entities带有start开始和end结束值,组成python格式的范围选择,比如text=“show me chinese restaurants”,那么text[8:15]==‘chinese’。实体可以跨多个单词,实际上,value属性不必与example中的子串准确对应。如此可以映射同义词,或误拼写的词,到相同的一个value

## intent:restaurant_search
- show me [chinese](cuisine) restaurants

2.2 正则特征(Regular Expression Features)

正则表达式有助于意图分类和实体提取。举个例子,如果你的实体具有固定的结构(如邮编,或email地址),那么可以使用正则表达式提取这些实体。如邮编可以用下面的表达式:

## regex:zipcode
- [0-9]{5}
​
## regex:greet
- hey[^\\s]*

这个名字并没有定义实体或意图,这个仅仅是用户可读的描述,仅仅用以区分对应的正则表达式。正如上面的例子中,可以使用正则化特征提高意图分类的性能。

尽量的使用更加紧缩的匹配形式,如使用hey[^\s]*替换hey.*。由于后一个表达式会匹配到更多无效的信息。正则特征目前仅支持CRFEntityExtractor组件。其他的实体提取器,类似MitieEntityExtractorSpacyEntityExtractor当前并不能使用正则特征。当前,所有的意图分类器可以使用所有的正则特征。

注意:
正则特征并没有定义实体或意图。他们仅仅提供了模式用来帮助分类器识别实体和相关的意图。因此,还是需要提供意图和实体的例子。

2.3 查找表(lookup tables)

查找表可以包括在训练数据中。外部提供的数据必须要以newline进行分隔。比如data/test/lookup_tables/plates.txt可以包含:

tacos
beef
mapo tofu
burrito
lettuce wrap

对该查找表的加载如下:

## lookup:plates
data/test/lookup_tables/plates.txt

当在训练数据中提供查找表时,内容被组合成一个大型、不区分大小写的regex模式,该模式在训练示例中查找精确匹配。这些正则表达式匹配多个token,所以如lettuce wrap在句子get me a lettuce wrap ASAP中将会匹配出[0 0 0 1 1 0]。这些正则表达式的处理与训练数据中直接指定的正则表达式模式相同。

利用list的实现是:

## lookup:plates
- tacos
- beef
- mapo tofu
- burrito
- lettuce wrap

注意:
为了查找表能够有效的被使用,训练数据中必须要有一些示例被匹配上。否则,模型不会使用查找表特征。

警告:
往查找表中添加数据时候要谨慎。如果查找表中存在错的正例或其他噪声,会损害性能。因此,确保查找表中的数据都是干净的。

3. 标准化数据

3.1 实体同义词

如果定义的实体具有相同的名字,那么他们会被解析成同义词。如下:

## intent:search
- in the center of [NYC](city:New York City)
- in the center of [New York City](city)

正如上面所述,在两个例子中,city的值是New York City。 尽管第一个例子中的text的值是NYC。将value属性定义为实体的start和end索引之间的文本,从而实现同义词定义。无论相同的text被找到,这个值还是会使用同义词替代消息中确切的文本。

为了在训练数据中使用同义词,需要pipeline中包含EntitySynonmMapper组件。见Components

另一种的同义词的定义方式如下:

## synonym:New York City
- NYC
- nyc
- the big apple

注意:
同义词的添加,并不会提高模型对实体的识别能力。实体必须在使用同义词替换之前识别出来

4. 生成更多实体例子

有一些工具可以辅助生成大量的实体示例。如,Chatito。但是,人造示例,可能会出导致过拟合,更好的方式是使用查找表,而不是大量的实体值。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!