了解Rasa NLU管道中不同类型的组件

412 阅读6分钟

Rasa是一个开源的机器学习框架,用于自动化文本和语音对话。理解消息,举行对话,并连接到消息渠道和API。
今天在这个文章中,我们将介绍Rasa的NLU管道。本指南的目的是解释各组件在Rasa NLU管道中所扮演的角色,同时解释它们如何相互作用。

NLU管线

机器学习管道可以被定义为用于训练机器学习模型的任务序列。
如下图所示,Rasa NLU管道由一连串预定义的任务组成,这些任务被称为 "组件",并有其特定的配置。这可以在Rasa项目的 "config.yml "文件中看到。该文件描述了Rasa用来对意图和实体进行分类的管道的所有步骤。

pipeline:
   - name: WhitespaceTokenizer
   - name: RegexFeaturizer
   - name: LexicalSyntacticFeaturizer
   - name: CountVectorsFeaturizer
   - name: DIETClassifier
   - name: EntitySynonymMapper
   - name: ResponseSelector
   - name: FallbackClassifier

Rasa NLU管道中的组件

根据Rasa的说法,这些组件构成了你的NLU管道,并按顺序工作,将用户的输入处理成结构化的输出。有一些组件用于实体提取、意图分类、响应选择、预处理等等。

Rasa中的组件分为以下几类。

  1. 符号化器
  2. 纹理器
  3. 意图分类器
  4. 实体提取器
  5. 选择器

让我们讨论一下上述每个组件的内容,以及它们在上述管道中的使用情况。

1.符号化器

符号化器将原始文本分解成一个个被称为tokens的片段,并返回一个单词或tokens的列表,这是任何NLU管道的第一步,在文本被机器学习壮举之前必须发生。如上图所示,管道中的第一个组件是 "WhitespaceTokenizer"。它使用白空间作为分隔符对原始文本输入进行标记。

2.纹理器

纹理器将原始输入数据转化为处理过的形式,称为特征向量,它是一种机器可读的表示,被用作机器学习模型的输入。

在Rasa文本中,featurizer被分为两个不同的类别。

a) 稀疏的特征化器

b) 密集特征器

稀疏壮举器是指返回具有大量缺失值(例如零)的特征向量的壮举器。由于这些特征向量通常会占用大量的内存,因此我们将它们存储为稀疏特征。稀疏特征只存储非零的值和它们在向量中的位置。

另一方面,密集型featurizers返回包含预训练嵌入的特征向量。这些向量的长度在50-300范围内。这些向量在每个NLP问题上都比稀疏向量效果好。因此,意义相似的词有相似的表示。
例如。"家 "和 "房子 "在稀疏向量表示中意味着两种不同的东西,在密集特征表示中,它捕捉到这些词之间的相似性。

   - name: RegexFeaturizer
   - name: LexicalSyntacticFeaturizer
   - name: CountVectorsFeaturizer

人们可能对从文本中提取不同类型的特征并串联起来作为机器学习模型的输入感兴趣。正如你在上面的管道中所看到的,我们已经串联使用了三个不同的featurizer,featurizer在某一点上依赖于前面的featurizer的输出。

RegexFeaturizer,使用正则表达式为原始文本数据创建一个稀疏的特征向量表示。

LexicalSyntacticFeaturizer,为原始文本数据创建词法和句法特征,以支持实体提取。

CountVectorsFeaturizer,创建原始文本数据、意图和响应的词包表示。

3.意图分类器

一旦我们为所有的标记和整个句子生成了特征,我们就可以把它交给一个意图分类模型。意图分类器将域文件中定义的意图之一分配给传入的用户消息。我们推荐使用Rasa的DIET模型,它既可以处理意图分类,也可以处理实体提取。它还能从标记和句子的特征中学习。

在上述管道中,我们使用了DIET分类器,它提取实体和意图,并输出实体、意图和意图排名,如下图所示。

{
    "intent": {"name": "greet", "confidence": 0.7800},
    "intent_ranking": [
        {
            "confidence": 0.7800,
            "name": "greet"
        },
        {
            "confidence": 0.1400,
            "name": "goodbye"
        },
        {
            "confidence": 0.0800,
            "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"。当DIETclassifier无法以大于或等于阈值的置信度对一个意图进行分类时,FallbackClassifier将输入的文本信息与名为 "nlu_fallback"的意图进行分类。 当两个排名靠前的意图的置信度比ambiguity_threshold 更接近时,它也可以预测后备意图。与DIETClassifier一样,它也输出实体、意图和意图排名,如下所示。


    {
        "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"
        }]
    }

4.实体提取器

实体提取器从文本数据中提取实体,如人名或地点。即使DIET能够学习如何检测实体,我们也不一定推荐将其用于每一种类型的实体。例如,遵循结构化模式的实体,如电话号码,并不真正需要一个算法来检测它们。

如上面的管道所示,我们使用了 "EntitySynonymMapper "来提取实体,它将同义的实体值映射为相同的值。如果训练数据包含tan实体的定义同义词,这个组件将确保检测到的实体值将被映射到相同的值。例如,如果你的训练数据包含以下具有类似实体的例子,如United Kingdom和UK。这个组件将允许你把实体United Kingdom和UK 映射到'uk' 。实体提取将返回'uk' ,即使信息包含United Kingdom 。当这个组件改变一个现有的实体时,它将自己附加到这个实体的处理器列表中。

5.选择器

在提取了意图和实体之后,人们可能需要从给定的输入文本信息中生成响应,这时选择器的作用就体现出来了,它根据意图的置信度从一组预定义的响应中预测出一个响应。

在上述管道中,我们使用了 "ResponseSelector "组件来返回响应。它输出一个字典,其中的键是响应选择器的检索意图,值包含预测的响应、信心和检索意图下的响应键。

总结

在这篇博文中,我们回顾了Rasa NLU管道中不同类型的组件。了解组件在管道中的交互方式是很好的,因为这将帮助你决定哪些组件与你的模型相关,并相应地定制管道。