Rasa NLU-Choosing a Pipeline

选择NLU管道允许您自定义模型并对数据集进行微调。

The Short Answer

如果您总的训练数据少于1000个,并且您的语言有spaCy模型,请使用pretrained_embeddings_spacy管道:

language: "en"

pipeline: "pretrained_embeddings_spacy"

如果您有1000个或更多标记的话语,请使用supervised_embeddings管道:

language: "en"

pipeline: "supervised_embeddings"

A Longer Answer

两个最重要的管道是supervised_embeddingspretrained_embeddings_spacy。两者最大的区别是pretrained_embeddings_spacy管道使用来自Glove或者fastText预训练词向量。另一方面,supervised_embeddings管道,并不使用任何预训练的词向量,而是拟合你自己指定的数据。

  1. pretrained_embeddings_spacy
    pretrained_embeddings_spacy管道的优点是,如果您有一个训练样本,例如:“I want to buy apples”,并且要求Rasa预测“get pears”的意图,您的模型已经知道“苹果”和“梨“非常相似。如果您没有很多训练数据,这将特别有用。

  2. supervised_embeddings
    supervised_embeddings管道的优点是可以为您的domain(域)自定义单词向量。例如,在一般英语中,“balance”一词与“symmetry”密切相关,但与“cash”一词非常不同。在银行业领域,“balance”和“cash”密切相关,您希望您的模型能够捕捉到这一点。此管道不使用特定于语言的模型,因此它可以使用您可以标记的任何语言(以空格或使用自定义tokenizer(标记生成器))。

你可以在这 阅读更多关于此主题的更多信息。

MITIE

您还可以将MITIE用作管道中的单词向量源,请参阅MITIE。 MITIE后端适用于小型数据集,但如果您有超过几百个示例,则训练可能需要很长时间。

但是,我们不建议您使用它,因为在将来的版本中可能会弃用mitie支持。

为你的数据比较不同的管道

Rasa为您提供了直接比较这两个管道的性能的工具,请参阅比较NLU管道。

Class imbalance

如果存在大的类不平衡,分类算法通常表现不佳,例如,如果您有一些意图的训练数据,而其他类的训练数据很少。为了缓解这个问题,rasa的supervised_embeddings管道使用一个balanced批处理策略。

Multiple Intents

如果要将意图分成多个标签,例如对于预测多个意图或建模分层意图结构,您只能使用有监督的嵌入管道。为此,请在Whitespace Tokenizer中使用这些标志:

  • intent_split_symbol:设置分隔符字符串以拆分意图标签。默认_

这是一个关于如何在Rasa Core和NLU中使用多个意图的教程。

这是一个示例配置:

language: "en"

pipeline:
- name: "WhitespaceTokenizer"
  intent_split_symbol: "_"
- name: "CountVectorsFeaturizer"
- name: "EmbeddingIntentClassifier"

了解Rasa NLU管道

在Rasa NLU中,传入消息由一系列组件处理。这些组件在所谓的处理流水线中一个接一个地执行。有用于实体提取,用于意图分类,响应选择,预处理等的组件。如果要添加自己的组件,例如运行拼写检查或进行情绪分析,请查看自定义NLU组件。

每个组件处理输入并创建输出。输出可以由管道中此组件之后的任何组件使用。有些组件只生成管道中其他组件使用的信息,还有其他组件生成输出属性,这些属性将在处理完成后返回。例如,对于“I am looking for Chinese food”的句子,输出是:

{
    "text": "I am looking for Chinese food",
    "entities": [
        {"start": 8, "end": 15, "value": "chinese", "entity": "cuisine", "extractor": "CRFEntityExtractor", "confidence": 0.864}
    ],
    "intent": {"confidence": 0.6485910906220309, "name": "restaurant_search"},
    "intent_ranking": [
        {"confidence": 0.6485910906220309, "name": "restaurant_search"},
        {"confidence": 0.1416153159565678, "name": "affirm"}
    ]
}

这是作为预配置管道pretrained_embeddings_spacy中的不同组件的结果的组合而创建的。例如,entities属性由CRFEntityExtractor组件创建。

组件生命周期

每个组件都可以从Component基类实现几个方法;在管道中,将按特定顺序调用这些不同的方法。让我们假设,我们在配置中添加了以下管道:“pipeline”:[“ComponentA”,“ComponentB”,“Last Component”]。该图显示了此管道培训期间的呼叫顺序:


Rasa NLU-Choosing a Pipeline_第1张图片

在使用create函数创建第一个组件之前,会创建一个所谓的上下文(它只不过是一个python dict)。此上下文用于在组件之间传递信息。例如,一个组件可以计算训练数据的特征向量,将其存储在上下文中,另一个组件可以从上下文中检索这些特征向量并进行意图分类。

最初,上下文填充了所有配置值,图像中的箭头显示调用顺序并可视化传递的上下文的路径。在训练并持久化所有组件之后,使用最终上下文字典来持久化模型的元数据。

The "entity" object explained

解析后,实体将作为字典返回。有两个字段显示有关管道如何影响返回的实体的信息:实体的extractor字段告诉您哪个实体提取器找到了此特定实体,processors字段包含更改此特定实体的组件的名称。

同义词的使用也可能导致value字段与text完全不匹配。相反,它将返回训练有素的同义词。

{
  "text": "show me chinese restaurants",
  "intent": "restaurant_search",
  "entities": [
    {
      "start": 8,
      "end": 15,
      "value": "chinese",
      "entity": "cuisine",
      "extractor": "CRFEntityExtractor",
      "confidence": 0.854,
      "processors": []
    }
  ]
}

预配置管道

模板只是完整组件列表的快捷方式。例如,这两种配置是等效的:

language: "en"

pipeline: "pretrained_embeddings_spacy"
language: "en"

pipeline:
- name: "SpacyNLP"
- name: "SpacyTokenizer"
- name: "SpacyFeaturizer"
- name: "RegexFeaturizer"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"
- name: "SklearnIntentClassifier"

以下是包含自定义信息的所有预配置管道模板的列表。

  1. supervised_embeddings
    要使用首选语言训练Rasa模型,请在config.yml或其他配置文件中将supervised_embeddings管道定义为管道:
language: "en"

pipeline: "supervised_embeddings"

supervised_embeddings管道支持任何可以标记化的语言。默认情况下,它使用空格进行分词。您可以通过添加或更改组件来自定义此管道的设置。以下是构成supervised_embeddings管道的默认组件:

language: "en"

pipeline:
- name: "WhitespaceTokenizer"
- name: "RegexFeaturizer"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"
- name: "CountVectorsFeaturizer"
- name: "CountVectorsFeaturizer"
  analyzer: "char_wb"
  min_ngram: 1
  max_ngram: 4
- name: "EmbeddingIntentClassifier"

因此,例如,如果您选择的语言不是空白分词(单词不用空格分隔),您可以用自己的分词生成器替换·WhitespaceTokenizer·。我们支持许多不同的分词器,或者您可以创建自己的标记器。

管道使用CountVectorsFeaturizer的两个实例。第一个基于单词文本特征。第二个是基于字符n-gram的文本特征,保留了单词边界。我们凭经验发现第二个增强剂更强大,但我们决定保留第一个增强剂以使特征化更加强大。

  1. pretrained_embeddings_spacy
    要使用pretrained_embeddings_spacy模板。
language: "en"

pipeline: "pretrained_embeddings_spacy"

有关加载spacy语言模型的更多信息,请参阅预训练的单词向量。要使用组件并单独配置它们:

language: "en"

pipeline:
- name: "SpacyNLP"
- name: "SpacyTokenizer"
- name: "SpacyFeaturizer"
- name: "RegexFeaturizer"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"
- name: "SklearnIntentClassifier"

MITIE

要使用MITIE管道,您必须从语料库中训练单词向量。说明可以在这里.找到。这将为您提供传递给model参数的文件路径。

language: "en"

pipeline:
- name: "MitieNLP"
  model: "data/total_word_feature_extractor.dat"
- name: "MitieTokenizer"
- name: "MitieEntityExtractor"
- name: "EntitySynonymMapper"
- name: "RegexFeaturizer"
- name: "MitieFeaturizer"
- name: "SklearnIntentClassifier"

该管道的另一个版本是使用MITIE的特征抽取器和多类分类器。训练可能非常慢,因此,不建议使用大型数据集。

language: "en"

pipeline:
- name: "MitieNLP"
  model: "data/total_word_feature_extractor.dat"
- name: "MitieTokenizer"
- name: "MitieEntityExtractor"
- name: "EntitySynonymMapper"
- name: "RegexFeaturizer"
- name: "MitieIntentClassifier"

自定义管道

你不必使用模板,你也可以通过列出你想要使用的组件运行一个完全自定义的管道。

pipeline:
- name: "SpacyNLP"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"

这里创建的管道仅仅用于实体识别并没有意图分类。因此Rasa NLU不会预测任何意图。你可以在组件中找到每一个组件的详细信息。

如果你想要在你的管道中使用自定义组件,请查阅自定义NLU组件。

部分功能测试

多意图测试

请参看【如何使用Rasa NLU TensorFlow管道处理每个输入的多个意图】

你可能感兴趣的:(Rasa NLU-Choosing a Pipeline)