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”]。该图显示了此管道培训期间的呼叫顺序:


在使用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管道处理每个输入的多个意图】

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容