这里写目录标题

  • 一、前言
  • 二、语言模型组件
    • 1、MitieNLP
    • 2、SpacyNLP
  • 三、分词器
    • 1、WhitespaceTokenizer
    • 2、JiebaTokenizer
    • 3、MitieTokenizer
    • 4、SpacyTokenizer
    • 5、自定义分词器

一、前言

RASA在处理对话时,整体流程是pipeline结构,自然语言理解(NLU)、对话状态追踪(DST)以及对话策略学习(DPL)一系列流程处理下来,再判断执行下一个动作。其中,NLU组件主要是将用户的输入处理成结构化输出。该组件主要用途为实体抽取、意图分类、响应选择、预处理等。NLU组件也是一个可细分pipeline结构,过程是Tokenize->Featurize->NER Extract->Intent Classify。

二、语言模型组件

如果开发者想在pipline中使用预训练的词向量,以下组件会加载所需的预训练模型。RASA中间内置的预训练模型可以通过过以下组件进行加载。

1、MitieNLP

mitie 基于dlib库开发,dlib是一个c++高性能机器学习库。所以对性能有要求的信息抽取场景,可以考虑使用mitie。mitie现有的资料比较少,github最近更新也是五六年前了。从mitie代码中看到它的NER使用structural_sequence_labeling_trainer.实现的细节见https://www.aaai.org/Papers/ICML/2003/ICML03-004.pdf 文中指出,MITIE的NER是HMM 和SVM相结合做的。相比单纯的HMM,这种方法是基于最大margin 标准。这相比纯CRF或者最大熵的HMM有很多优势:
1)可以通过核函数学习非线性的判断关系
2)可以处理overlapping features.

但毕竟是基于传统机器学习的方式,相对于BERT这种海量语料预训练模型来说,效果还是稍差一点,这个可以使用RASA的NLU评估工具跑分试一下[NLU pipelines评估]。但MITIE有无可比拟的速度优势,在算力敏感的情况下自己权衡选择,RASA已经不做官方推荐了。

RASA中配置MitieNLP,需要在config.yml文件中pipline中配置。

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

开发者还可以使用 MITIE 工具来训练自己的预训练语言模型。为此:

  1. 获取一个处理干净的语言语料库(维基百科转储作品)作为训练语料。
  2. 在语料库上运用MITIE Wordrep 工具。这可能需要几个小时/几天,具体取决于开发者的数据集和工作站。您需要 128GB 的 RAM 才能运行 wordrep – 是的,这很多:尝试扩展您的交换空间。
  3. 将新的路径设置为配置文件中组件 total_word_feature_extractor.dat的model参数。MitieNLP有关如何训练 MITIE 词向量的完整示例,请查看使用 Rasa NLU 构建自己的中文 NLU 系统,这是一篇从中文维基百科转储中创建 MITIE 模型的博文。

2、SpacyNLP

spaCy是一个用Python和Cython编写的高级自然语言处理的库。它跟踪最新的研究成果,并将其应用到实际产品。spaCy带有预训练的统计模型和单词向量,目前支持60多种语言。它用于标记任务,解析任务和命名实体识别任务的卷积神经网络模型,在非常快速的情况下,达到比较好的效果,并且易于在产品中集成应用。在github上接近24k的stars,并且更新比较活跃。最新发布的spaCy3.4也集成了Transformer相关模型。

使用spaCy时,文本字符串的第一步是将其传递给NLP对象。NLP对象本质上是由几个文本预处理操作组成的管道,输入文本字符串通过管道后,最终输出文档,完成各种功能。spacy的中文模型的下载地址:https://github.com/explosion/spacy-models。
Spacy工具在各大NLP任务中的效果如下:

RASA中配置spacynlp,需要在config.yml文件中pipline中配置。

pipeline:
- name: "SpacyNLP"# language model to loadmodel: "en_core_web_md"# when retrieving word vectors, this will decide if the casing# of the word is relevant. E.g. `hello` and `Hello` will# retrieve the same vector, if set to `False`. For some# applications and models it makes sense to differentiate# between these two words, therefore setting this to `True`.case_sensitive: False

有关如何下载 spaCy 模型的更多信息,请转到 安装 SpaCy。

除了 SpaCy 的已有预训练语言模型,开发者还可以使用此组件添加自己训练好的 spaCy 模型。具体请参考Spacy的官方文档:Models & Languages · spaCy Usage Documentation 。

三、分词器

分词器主要是将文本拆分为token。如果开发者想将意图拆分为多个标签,例如用于预测多个意图或为分层意图结构建模,请将以下tag与任何分词器一起使用:

  • intent_tokenization_flag指示是否标记意图标签。将其设置为True,以便标签化意图标签。
  • intent_split_symbol 设置分割意图标签的分隔符字符串,默认为下划线(_)。

1、WhitespaceTokenizer

空格分词器,每个空格间隔的文本,都将分为一个token,典型英文句子的分词,主要作用于用户消息、响应(如果存在)和意图(如果指定)。该分词器不支持中文分词。

RASA主要是在config.yaml文件中配置,配置方式如下:

pipeline:
- name: "WhitespaceTokenizer"# Flag to check whether to split intents"intent_tokenization_flag": False# Symbol on which intent should be split"intent_split_symbol": "_"# Regular expression to detect tokens"token_pattern": None

intent_tokenization_flag 和 intent_split_symbol 是在nlu返回多意图的时候使用。当intent_tokenization_flag设置为False,nlu只返回一个置信度最高的意图。但有些时候,一句话包含多个意图,例如:

## intent: affirm+ask_transport
- Yes. How do I get there?
- Sounds good. Do you know how I could get there from home?

用户的回答包含2层意思,首先是同意我的建议,另外是询问怎么去。这时候,需要将intent_tokenization_flag设置为True,然后在训练数据里面编写多意图对应的话术,多个意图中间用intent_split_symbol去分割。在运行的时候,用户说“Sounds good. Do you know how I could get there from home?”,Rasa nlu就会返回affirmask_transport这个意图。

2、JiebaTokenizer

jieba分词器,仅可以在中文分词使用,支持自定义词库分词,主要作用于用户消息、响应(如果存在)和意图(如果指定)。词库的配置方法如下:

pipeline:
- name: "JiebaTokenizer"dictionary_path: "path/to/custom/dictionary/dir"# Flag to check whether to split intents"intent_tokenization_flag": False# Symbol on which intent should be split"intent_split_symbol": "_"# Regular expression to detect tokens"token_pattern": None

其中,dictionary_path是字典文件所在路径。

3、MitieTokenizer

开发者使用MitieNLP进行分词时,前提是需要配置Mitie语言模型,一般在使用全套MiteNLP的时候使用。开发者如果使用BERT进行Featurizer提取,那Tokenizer就可以任选一个,比如中文用Jieba,英文用空格分词就行。

pipeline:
- name:"MitieTokenizer"# Flag to check whether to split intents"intent_tokenization_flag":False# Symbol on which intent should be split"intent_split_symbol":"_"# Regular expression to detect tokens"token_pattern": None

4、SpacyTokenizer

开发者使用SpacyNLP进行分词时,前提是需要配置Spacy语言模型,一般在使用全套SpacyNLP的时候使用。

pipeline:
- name: "SpacyTokenizer"# Flag to check whether to split intents"intent_tokenization_flag": False# Symbol on which intent should be split"intent_split_symbol": "_"# Regular expression to detect tokens"token_pattern": None

5、自定义分词器

如果上述分词器不满足要求,可以自定义分词器。要实现自定义分词器,需要继承Tokenizer和Component类,需要重载的函数有:init,train,tokenize,具体模板如下:

class CustomTokenizer(Tokenizer, Component):provides = [MESSAGE_TOKENS_NAMES[attribute] for attribute in MESSAGE_ATTRIBUTES]def train(self, training_data: TrainingData, config: RasaNLUModelConfig, **kwargs: Any) -> None:for example in training_data.training_examples:for attribute in MESSAGE_ATTRIBUTES: if example.get(attribute) is not None:example.set(MESSAGE_TOKENS_NAMES[attribute],self.tokenize(example.get(attribute), attribute),)# 主要是要实现对应的tokenize
def tokenize(self, text: Text) -> List[Token]:pass

简单做个总结,需要加载语言模型的分词器有Mitie,SpaCy。其中Mitie没有中文预训练模型,如果实现中文对话系统,需要自行准备语料训练Mitie语言模型。其中SpaCy有现成的中文模型,可以直接加载使用。如果需要使用LanguageModelFeaturizer中的各种BERT大模型,在分词器阶段就可以任意配置一个分词器即可,一般中文配置jiebaTokenizer,英文配置WhitespaceTokenizer,但是必须需要配置。

章节五:RASA NLU组件介绍--语言模型和分词器相关推荐

  1. 章节七:RASA NLU组件介绍--意图分类器和实体提取器

    目录 一.前言 二.意图分类器 2.1 MitieIntentClassifier 2.2 LogisticRegressionClassifier 2.3 SklearnIntentClassifi ...

  2. 章节六:RASA NLU组件介绍--特征生成器

    目录 一.前言 二.特征生成器 MitieFeaturizer SpacyFeaturizer ConveRTFeaturizer LanguageModelFeaturizer RegexFeatu ...

  3. Java-GUI编程实战之管理系统 Day2【Swing(组件介绍、布局管理器、事件类及监听器类)、基础组件按钮和输入框的用法】

    视频.课件.源码[链接:https://pan.baidu.com/s/13ffqGDzH-DZib6-MFViW3Q 提取码:zjxs] Java-GUI编程实战之管理系统 Day1[项目开发流程. ...

  4. Rasa课程、Rasa培训、Rasa面试系列之: Rasa NLU意图和实体-分词器

    Rasa课程.Rasa培训.Rasa面试系列之: Rasa NLU意图和实体-分词器 在Rasa项目中,NLU管道定义了将非结构化用户消息转换为意图和实体的处理步骤.它由一系列组件组成,可以由开发人员 ...

  5. 【ES实战】ES分词器介绍

    文章目录 ES分词器介绍 什么是分词器 分词器的组成 Character filters Tokenizers Token filters 分词的过程 写入时分词 搜索时分词 测试分词效果 分词器的分 ...

  6. ElasticSearch学习笔记(分词器的介绍使用)

    1)分词的概念 分词Search是一个构建于Lucene之上的优秀的分布式全文检索引擎(服务器),它是使用Java开发的,提供基于RESTful风格的Web服务接口.表面上我们只要将一段冗长的要检索的 ...

  7. 架构师成长记_第八周_10_ES-分词与五种内置分词器

    文章目录 ES-分词 PS: 1. 全局分析方式(_analyze) 2. 指定字段分析方式(索引名/_analyze) ES-五种内置分词器介绍 1 标准分词器 standard 2 非字母分词器 ...

  8. 章节四:RASA 训练数据介绍

    一.前言 一般来说,机器人可以跟人对话,机器人说什么是最难的,顶多是人工编写几种规则和模版来回复即可.但是要让机器人理解人的意图,确实非常难的事情.因为语言具有多样性,多义词,一语双关,长短句等,尤其 ...

  9. Rasa系列教程(一) -- 系统及各组件介绍

    目录 前言 一.传统对话机器人架构 二.对话系统流程 2.1 ASR语音识别 2.2 NLU自然语言理解 2.3 DM对话管理 2.4 NLG自然语言生成 2.5 TTS语音合成 三.Rasa组件介绍 ...

最新文章

  1. Servlet(一)
  2. [HNOI2011]数学作业 分段矩阵乘法
  3. 【uniapp】组件封装与引用
  4. id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了
  5. 关于全局缓存的一种简单实现方法
  6. [css] 怎么使图片宽度自适应呢?
  7. 网页开发部署-开发工具MyEclips+Tomcat+mysql
  8. python读excel字体颜色_python操作excel之设置字体颜色及格式
  9. Qt实现表格内进度条展示数据
  10. matlab 常用 api(七)—— 常见判断(返回 logical)
  11. labelImg安装小记
  12. Vue框架实例成员及项目搭建
  13. 倒不过的“饮食时差”,减肥路上的最大阻碍?
  14. 串口屏储存器不够,自己扩展怎么操作?
  15. 物联网设备安全保护,需要这三道防线
  16. java实现回文数算法
  17. php 链接oracle tns,PHP连接Oracle ORA
  18. oracle访问控制策略查看,ORACLE 安全访问策略VPD与ORA-28132
  19. 正5V+5V电压到负电压5V-5V电路图
  20. 干燥机是什么,作用是?

热门文章

  1. nodejs时间函数
  2. 华工计算机研究生课程表,11级华工研究生课程表.doc
  3. 利用python自动生成证件照
  4. 英语语法笔记by英语兔
  5. MIKE21 教程 3.1 随时间变化的时间序列文件制作(.dfs0文件制作)
  6. 市场调研计划书如何写?
  7. ubuntu制作简陋的deb/rpm包
  8. C#与松下PLC串口通讯发送,接收数据
  9. C++Qt开发-错误退出,退出代码2
  10. IIS 返回405报错解决过程