rasa pipline (官网翻译)

2021-8-30

一. Language Models语言模型

如果你想使用预训练的语言模型词向量,那么可以使用下面的配置加载词向量

MitieNLP

  • 简介 MITIE initializer

  • 输出 Nothing

  • 要求 Nothing

  • 描述

    初始化MITIE框架,每个MITIE的组件都依赖于这个部分,因此MitieNLP应该放在pipline处理的开始。

  • 配置

    这部分的处理需要一个语言模型文件,在配置中要显示配置出来。

    pipeline:
    - name: "MitieNLP"
      # language model to load
      model: "data/total_word_feature_extractor.dat"
    

如果想了解更多的信息,请前往安装MITIE

同样,你也可以使用MITIE训练自己的词向量,步骤如下:

  1. 准备大规模的干净的语料

  2. 在你的语料库上构建并运行MITIE Wordrep工具。根据您的数据集和工作站,这可能需要几个小时/几天的时间。您将需要128GB的RAM来运行wordrep—是的,要求空间确实很大,尝试扩展您的交换。

  3. 将新的total_word_feature_extractor.dat路径设置为配置文件中MitieNLP组件的模型参数。

    训练MITIE词向量的完整示例, 请查看用Rasa NLU 构建自己的中文NLU系统。使用中文维基百科训练的模型。

二. Tokenizers分词

分词器将文本分割成字符。如果你想将意图拆分为多个标签,例如用于预测多个意图或建模层次意图结构,使用以下标志与任何标记赋予器:

  • Intent_tokenization_flag表示是否将意图标签进行分词处理。将其设置为True,则意图标签也会被分词处理。
  • Intent_split_symbol设置分隔符字符串来分割意图标签,默认为下划线(_)。

JiebaTokenizer结巴分词

  • 简介 中文的分词器

  • 输出 tokens for user messages, responses (if present), and intents (if specified)

  • 要求 Nothing

  • 描述

    中文的分词器。

    Note

    如果要使用改分词器,请安装 pip3 install jieba


三. Featurizers特征化

文本特征器分为两类:稀疏特征器和密集特征器。稀疏特征器是返回带有许多缺失值的特征向量的特征器,例如零。由于这些特征向量通常会占用大量的内存,我们将它们存储为稀疏特征。稀疏特征只存储非零值及其在向量中的位置。因此,我们节省了大量的内存,并能够在更大的数据集上进行训练。

所有的特征器都可以返回两种不同的特征:序列特征和句子特征。

  • 序列特征是一个(单词数量x特征维数)大小的矩阵。矩阵包含序列中每个单词的特征向量。这允许我们训练序列模型。

  • 句子特征由(1 ×特征维数)大小矩阵表示。它包含了完整语句的特征向量。句子特征可用于任何词袋模型。因此,相应的分类器可以决定使用哪种特征。注意:序列特征和句子特征的特征维数不一定相同。

RegexFeaturizer

  • 简介 使用正则表达式创建用户消息的向量表示形式。

  • 输出 sparse_featuresfor user messages andtokens.pattern

  • 要求 tokens

  • 类型 稀疏特征

  • 描述

    创建实体提取和意图分类的特征。在训练期间,regexfeatuizer会创建一个在训练数据格式中定义的正则表达式列表。对于每个regex,将设置一个特性来标记该表达式是否在用户消息中找到。所有的特征随后将被输入意图分类器/实体提取器以简化分类(假设分类器在训练阶段已经学习了,这个集合特征表明了一个特定的意图/实体)。实体提取的正则表达式特性目前只支持CRFEntityExtractor和DIETClassifier组件!

  • 配置

    通过添加case_sensitive: False选项使特性器不区分大小写,默认为case_sensitive: True。

    要正确处理不使用空格分隔单词的语言,比如中文,用户需要添加use_word_boundaries: False选项,默认为use_word_boundaries: True。

    pipeline:
    - name: "RegexFeaturizer"
      # Text will be processed with case sensitive as default
      "case_sensitive": True
      # use match word boundaries for lookup table
      "use_word_boundaries": True
    


四. Entity Extractors 实体抽取

从用户信息中抽取实体,比如人命,地名。

Note

如果您使用多个实体提取器,我们建议每个提取器都以一组独占的实体类型为目标。例如,使用Duckling提取日期和时间,使用DIETClassifier提取人名。否则,如果多个提取器针对相同的实体类型,很可能会多次提取实体。

例如,如果您使用两个或多个通用提取器,如MitieEntityExtractor、DIETClassifier或CRFEntityExtractor,那么您的训练数据中的实体类型将被所有这些提取器找到并提取。如果您用实体类型填充的槽是文本类型的,那么pipline中的最后一个提取器将获胜。如果槽的类型是list,那么所有结果都将添加到列表中,包括重复的结果。

即使提取器关注不同的实体类型,也会发生另一种不太明显的重复/重叠提取情况。想象一下,一个送餐机器人和一个用户信息,比如“I would like to order the Monday special”。假设,如果您的时间提取器的性能不是很好,它可能会在这里提取Monday 作为订单的时间,而您的其他提取器可能会提取Monday special 作为点的餐。如果遇到这种类型的重叠实体,添加额外的训练数据以改进提取器可能是有意义的。如果这还不够,您可以添加一个自定义组件,根据您自己的逻辑解决实体提取中的冲突。

MitieEntityExtractor

  • 简介 MITIE entity extraction (using a MITIE NER trainer)

  • 输出 entities

  • 要求 MitieNLP and tokens

  • 输出示例

    {
        "entities": [{
            "value": "New York City",
            "start": 20,
            "end": 33,
            "confidence": null,
            "entity": "city",
            "extractor": "MitieEntityExtractor"
        }]
    }
    
  • 描述

    MitieEntityExtractor使用MITIE实体提取来查找消息中的实体。底层分类器使用多类线性支持向量机,具有稀疏线性核和自定义特征。MITIE组件不提供实体置信度值。

    Note

    此实体提取器内部会自己进行特征提取,不需要依赖任何 featurizer特征化处理。

  • 配置

    pipeline:
    - name: "MitieEntityExtractor"
    

RegexEntityExtractor正则实体提取器

  • 简介 使用在训练数据中定义的查找表和/或正则表达式提取实体

  • 输出 entities

  • 要求 Nothing

  • 描述

    该组件使用训练数据中定义的 lookup tablesregexes 提取实体。该组件检查用户消息是否包含某个查找表的条目或匹配某个正则表达式。如果找到匹配,则将值提取为实体。

    该组件只使用名称等于训练数据中定义的实体之一的正则表达式特性。确保每个实体至少标注一个示例。

    Note

    当您将此提取器与MitieEntityExtractor、CRFEntityExtractor或DIETClassifier组合使用时,可能会导致多个实体提取。特别是如果许多训练句子都有实体注释,您也为这些实体类型定义了正则表达式。有关多次提取的更多信息,请参阅实体提取器部分开始处的大信息框。

    如果您似乎同时需要这个RegexEntityExtractor和前面提到的另一个统计提取器,我们建议您考虑以下两个选项之一。

    当您对每种提取器类型都具有独占实体类型时,建议使用选项1。为了确保提取器不会相互干扰,对于每个regex/lookup实体类型只注释一个示例句子,而不是更多。

    当您希望使用正则表达式匹配作为统计提取器的附加信号,但又没有单独的实体类型时,选项2是有用的。在这种情况下,您将希望

    1)在管道中的提取器之前添加regexfeataturizer

    2)在训练数据中注释所有的实体示例

    3)从管道中删除RegexEntityExtractor。这样,您的统计提取器将收到关于存在正则表达式匹配的附加信号,并将能够从统计上确定何时依赖这些匹配,何时不依赖。

  • 配置

    通过添加case_sensitive: True选项使实体提取器区分大小写,默认为case_sensitive: False。

    要正确处理不使用空格分隔单词的语言,比如中文,用户需要添加use_word_boundaries: False选项,默认为use_word_boundaries: True。

  • pipeline:
    - name: "MitieIntentClassifier"
    
    pipeline:
    - name: RegexEntityExtractor
      # text will be processed with case insensitive as default
      case_sensitive: False
      # use lookup tables to extract entities
      use_lookup_tables: True
      # use regexes to extract entities
      use_regexes: True
      # use match word boundaries for lookup table
      "use_word_boundaries": True

EntitySynonymMapper

  • 简介 将同义的实体值映射到相同的值

  • 输出 修改实体抽取器抽取出的实体

  • 要求 An extractor from Entity Extractors

  • 描述

    如果训练数据包含定义的同义词,则该组件将确保检测到的实体值将被映射到相同的值。例如,如果您的训练数据包含以下示例:

    [
        {
          "text": "I moved to New York City",
          "intent": "inform_relocation",
          "entities": [{
            "value": "nyc",
            "start": 11,
            "end": 24,
            "entity": "city",
          }]
        },
        {
          "text": "I got a new flat in NYC.",
          "intent": "inform_relocation",
          "entities": [{
            "value": "nyc",
            "start": 20,
            "end": 23,
            "entity": "city",
          }]
        }
    ]
    

    该组件允许您将实体New York City和NYC映射到NYC。实体提取将返回nyc,即使消息包含NYC。当该组件更改现有实体时,它将自己附加到该实体的处理器列表中。

  • 配置

    pipeline:
    - name: "EntitySynonymMapper"
    

五. Intent Classifiers 意图分类器

意图分类器会把用户输入信息,识别为domain.yml文件中定义的意图

MitieIntentClassifier

  • 简介 MITIE intent classifier (using a text categorizer)

  • 输出 intent

  • 要求 tokens for user message and MitieNLP

  • 输出示例

    {
        "intent": {"name": "greet", "confidence": 0.98343}
    }
    
  • 描述

    此分类器使用MITIE来进行意图分类,内置分类器使用稀疏线性核的的线性SVM多分类器(详情请见 MITIE trainer code中 ,参考train_text_categorizer_classifier函数)

    Note

    此分类器内部会提取特征,不需要依赖任何 featurizer特征化处理

  • 配置

    pipeline:
    - name: "MitieIntentClassifier"
    

SklearnIntentClassifier

  • 简介 Sklearn intent classifier

  • 输出 intent 和 intent_ranking

  • 要求 dense_features for user messages

  • 输出示例

    {
        "intent": {"name": "greet", "confidence": 0.78343},
        "intent_ranking": [
            {
                "confidence": 0.1485910906220309,
                "name": "goodbye"
            },
            {
                "confidence": 0.08161531595656784,
                "name": "restaurant_search"
            }
        ]
    }
    
  • 描述

    Sklearn意图分类器会训练一个线性SVM,其中SVM使用grid search进行优化,并且可以提供其它意图的置信度。SklearnIntentClassifier需要在pipline中进行一个稠密特征化的处理。该稠密特征作为分类器的输入。如果想知道更多关于此算法的资料,请参阅 GridSearchCV 文档。

  • 配置

    在训练SVM过程中,通过超参数搜索来寻找最好的参数集合。在配置文件中可以指定参数搜索集合,如下所示:

    pipeline:
    - name: "SklearnIntentClassifier"
      # Specifies the list of regularization values to
      # cross-validate over for C-SVM.
      # This is used with the ``kernel`` hyperparameter in GridSearchCV.
      C: [1, 2, 5, 10, 20, 100]
      # Specifies the kernel to use with C-SVM.
      # This is used with the ``C`` hyperparameter in GridSearchCV.
      kernels: ["linear"]
      # Gamma parameter of the C-SVM.
      "gamma": [0.1]
      # We try to find a good number of cross folds to use during
      # intent training, this specifies the max number of folds.
      "max_cross_validation_folds": 5
      # Scoring function used for evaluating the hyper parameters.
      # This can be a name or a function.
      "scoring_function": "f1_weighted"
    

KeywordIntentClassifier

  • 简介 简单的关键字匹配意图分类器,用来识别简短的意图

  • 输出 intent

  • 要求 Nothing

  • 输出示例

    {
        "intent": {"name": "greet", "confidence": 1.0}
    }
    
  • 描述

    这个分类器通过搜索用户输入数据的关键字来进行分类,当整个关键词和用户输入信息必须一个字不差,完全匹配时才会识别为相应的意图(多一个字都无法识别)。关键字定义为nlu.yml 中的意图对应示例句子。即整个example 是一个关键字,而不是其中的某个词汇。

    NOTE

    该分类器用于小的项目或冷启动阶段。如果你已经有部分NLU训练数据,可以参阅建议的piplines进行配置,Tuning Your Model.

  • 配置

    在训练SVM过程中,通过超参数搜索来寻找最好的参数集合。在配置文件中可以指定参数搜索集合,如下所示:

    pipeline:
    - name: "KeywordIntentClassifier"
      case_sensitive: True
    

<img src="/Users/chenfan/Documents/mdPic/image-20210708174605132.png" alt="image-20210708174605132" style="zoom: 33%;" />

FallbackClassifier

  • 简介 如果NLU意图分类得分不明确,则使用意图nlu_fallback对消息进行分类。置信度被设置为与回退阈值相同。如果输入句子所有的意图置信度都比较低,那么就会把该句子识别为意图:nlu_fallback

  • 输出 entities,intentandintent_ranking

  • 要求 intent and intent_ranking output from a previous intent classifier

  • 输出示例

    
        {
            "intent": {"name": "nlu_fallback", "confidence": 0.7183846840434321},
            "intent_ranking": [
                {
                    "confidence": 0.7183846840434321,
                    "name": "nlu_fallback"
                },
                {
                    "confidence": 0.28161531595656784,
                    "name": "restaurant_search"
                }
            ],
            "entities": [{
                "end": 53,
                "entity": "time",
                "start": 48,
                "value": "2017-04-10T00:00:00.000+02:00",
                "confidence": 1.0,
                "extractor": "DIETClassifier"
            }]
        }
    
  • 描述

    FallbackClassifier使用intent nlu_fallback对用户消息进行分类,以防之前的意图分类器无法对置信度大于或等于FallbackClassifier的阈值的意图进行分类。当两个排名靠前的意图的置信度得分比二义性阈值更接近时,它还可以预测回退意图。

    您可以使用FallbackClassifier来实现一个Fallback Action,该Action处理带有不确定NLU预测的消息。

    rules:
    
    - rule: Ask the user to rephrase in case of low NLU confidence
      steps:
      - intent: nlu_fallback
      - action: utter_please_rephrase
    
  • 配置

    pipeline:
    - name: "FallbackClassifier"
      threshold: 0.3
    

FallbackClassifier只会在没有其他意图被预测的置信度大于或等于阈值的情况下添加它对nlu_fallback意图的预测。

  • threshold: 该参数设置预测nlu_fallback意图的阈值。如果前一个意图分类器预测的意图的置信度不大于或等于阈值,那么FallbackClassifier将添加一个置信度为1.0的nlu_fallback意图预测。

  • ambiguity_threshold: 如果您配置了一个ambiguity_threshold, FallbackClassifier也会预测nlu_fallback意图,以防两个排名最高的意图的置信分数的差异小于ambiguity_threshold。

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

推荐阅读更多精彩内容