自定义NLU组件

你可以创建一些自定义组件来执行NLU当前没有提供支持的特定任务(例如:情感分析)。下面是rasa.nlu.components.Component类详述和你需要实现的方法。
你可以通过添加模块路径来添加自定义组件到你的管道中。所以如果你有一个模块叫做 sentiment 包含一个 SentimentAnalyzer 类。

image.png

另外,请你务必阅读 组件的生命周期 的部分。

首先是,你需要使用这个架构,它包含了你应该实现的最重要的方法:

import typing
from typing import Any, Optional, Text, Dict, List, Type
from rasa.nlu.components import Component
from rasa.nlu.config import RasaNLUModelConfig
from rasa.nlu.training_data import Message, TrainingData
if typing.TYPE_CHECKING:
from rasa.nlu.model import Metadata

class MyComponent(Component):
   '"A new component"'

    # Which components are required by this component.
    # Listed components should appear before the component itself in the pipeline.
    @classmethod
    def required_components(cls) -> List[Type[Component]]:
        """Specify which components need to be present in the pipeline."""

        return []

    # Defines the default configuration parameters of a component
    # these values can be overwritten in the pipeline configuration
    # of the model. The component should choose sensible defaults
    # and should be able to create reasonable results with the defaults.
    defaults = {}

    # Defines what language(s) this component can handle.
    # This attribute is designed for instance method: `can_handle_language`.
    # Default value is None which means it can handle all languages.
    # This is an important feature for backwards compatibility of components.
    language_list = None

    def __init__(self, component_config: Optional[Dict[Text, Any]] = None) -> None:
        super().__init__(component_config)

    def train(
        self,
        training_data: TrainingData,
        config: Optional[RasaNLUModelConfig] = None,
        **kwargs: Any,
    ) -> None:
        """Train this component.

        This is the components chance to train itself provided
        with the training data. The component can rely on
        any context attribute to be present, that gets created
        by a call to :meth:`components.Component.pipeline_init`
        of ANY component and
        on any context attributes created by a call to
        :meth:`components.Component.train`
        of components previous to this one."""
        pass

    def process(self, message: Message, **kwargs: Any) -> None:
        """Process an incoming message.

        This is the components chance to process an incoming
        message. The component can rely on
        any context attribute to be present, that gets created
        by a call to :meth:`components.Component.pipeline_init`
        of ANY component and
        on any context attributes created by a call to
        :meth:`components.Component.process`
        of components previous to this one."""
        pass

    def persist(self, file_name: Text, model_dir: Text) -> Optional[Dict[Text, Any]]:
        """Persist this component to disk for future loading."""

        pass

    @classmethod
    def load(
        cls,
        meta: Dict[Text, Any],
        model_dir: Optional[Text] = None,
        model_metadata: Optional["Metadata"] = None,
        cached_component: Optional["Component"] = None,
        **kwargs: Any,
    ) -> "Component":
        """Load this component from file."""

        if cached_component:
            return cached_component
        else:
            return cls(meta)

note:

如果你创建一个自定义的tokenizer,你应该实现rasa.nlu.tokenizers.tokenizer.Tokenizer 的方法。train 和 process 已经实现并且你只需要重写 tokenize 方法。train 和 process 将会自动添加一个特殊的token(CLS) 到token列表的最后,这是管道的下游需要的。

note:

如果你创建一个自定义featurizer,你应该返回一个特征序列。例如,你的featurizer应该返回一个矩阵的尺寸(字符的数量X特征维度)。CLStoken的特征向量应该包含完整消息的特征。

组件:

class rasa.nlu.components.Component(component_config=None):

在管道中一个组件是信息处理单元。

组件按照管道顺序收集。每个组件都被一个接一个地调用。他适用于初始化,训练,持久化和加载组件。如果一个组件在管道中首先出现,那么这个方法将被首先调用。

例如,处理输入的信息,每个组件的 process 方法将会被调用。在处理过程中(以及训练,持久化和初始化)组件会把信息传递给另一个组件。通过给所谓的管道上下文提供属性,将信息传递给其他组件。管道上下文包含一个组件用来完成自己的处理的前一个组件的所有信息。例如,一个特征分析器组件可以提供由管道中的另一个组件用来进行意图分类的功能。

classmethod required_components():

指定需要在管道中提供哪些组件。

Returns:

所需组件的类名列表

Return type

List[Type[Component]]

classmethod required_packages():

指明需要安装哪些python包。

例如:["spacy"]. 更具体的说,这些事可导入的python包名,比如sklearn,而不是依赖关系意义上包,比如scikit-learn

如果没有安装所需的包,在训练期间请求的列表让我们更早的失败

Returns:

必须的包名列表

Return type:

List[str]

 classmethod create(component_config, config):

创建这个组件(在训练开始之前)。

方法可以访问所有配置参数。

Parameters:

  • component_config — 组件的配置参数

  • config— 方法的配置参数

Returns:

创建的组件

Return type:

Component

provide_context():

在一个新的管道,初始化这个组件

这个函数将在训练开始和使用解释器处理第一条信息之前被调用。组件有机会向上下文添加信息,在训练和信息处理期间这些信息通过管道传递。大多数的组件不需要去实现这个方法。他主要是初始化架构环境,如MITIE和spacy(如:为管道加载单词向量)

return:

更新组件的配置

return type:

Optional[Dict[str, Any]]

train(training_data, config=None, **kwargs):

训练这个组件.

这是组件训练他自己拥有的训练数据。组件依赖出现的任何上下文属性,任何组件都会通过调用rasa.nlu.components.Component.create() 创建,以及通过调用此组件之前的组件的rasa.nlu.components.Component.train():
创建的任何上下文属性。
Parameters:

  • training_data—rasa.nlu.training_data.training_data.TrainingData

  • config—模型的配置参数

Return type:

None

 process(message, **kwargs)

处理传入的消息。

这是处理传入消息的组件。组件依赖出现的任何上下文属性,任何组件都会通过调用rasa.nlu.components.Component.create() 创建,以及通过调用此组件之前的组件的rasa.nlu.components.Component.process() :
创建的任何上下文属性。

Parameters:

message— rasa.nlu.training_data.message.Message 去处理

return type:

None

 persist(file_name, model_dir)

将此组件持久化到磁盘以备将来加载。

Parameters:

  • file_name—模型的文件名

  • model_dir—模型的存储的路径

returns:

一个可选的字典,包含关于存储模型的任何信息。

return type:

Optional[Dict[str, Any]]

prepare_partial_processing(pipeline, context):

设置管道和上下文用于部分处理。

管道是管道中在此之前并且已经完成培训的组件的列表(因此可以安全地用于处理消息)。

Parameters:

  • pipeline—组件列表

  • context—处理的上下文

return type:

None

 partially_process(message):

在训练期间允许所有的组件处理信息。

传递的消息将由管道中此消息之前的所有组件处理。

Parameters:

message— rasa.nlu.training_data.message.Message 去处理。

returns:

rasa.nlu.training_data.message.Message 处理。

return type:

Message

 classmethod can_handle_language(language):

检查组件是否支持特定的语言。

当你需要时这个方法可以被重写(如:动态的决定支持哪种语言)

Parameters:

language— 要检查的语言

Returns:

如果组件可以处理特定的语言,为True,否则为False。

Return type:

bool

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