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

news2025/1/14 0:50:21


这里写目录标题

    • 一、前言
    • 二、语言模型组件
      • 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 load
  model: "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 load
  model: "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,但是必须需要配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞分析】Apache ShardingSphere-Proxy <5.3.0 身份认证绕过

漏洞简介 2022年12月22日,Apache 官方公告发布 ShardingSphere-Proxy 5.3.0 之前版本存在身份绕过漏洞(CVE-2022-45347)。当 ShardingSphere-Proxy 使用 MySQL 作为后端数据库时,由于 ShardingSphere-Proxy 在客户端认证失败后没…

Linux-脚本安装jdk(使用jdk压缩包方式)

1、下载Linux版jdk oracle官网:Java Downloads | Oracle 2、上传jdk到linux 在linux中软件一般安装到/usr/local目录中 3、将jdk解压 解压命令: tar -zxvf jdk-8u301-linux-x64.tar.gz 将解压后的jdk改名为jdk8 mv jdk1.8.0_301 jdk8 4、配置jdk环境变量 使用vi打开/etc/p…

Java 面试题 (六) --------- 框架相关

1、什么是 Spring 框架?Spring 框架有哪些主要模块? Spring是一个控制反转和面向切面的容器框架。 Spring有七大功能模块: 1、Core Core模块是Spring的核心类库,Core实现了IOC功能。 2、AOP Apring AOP模块是Spring的AOP库&…

FLTK的UI设计工具FLUID使用方法总结

tags: FLTK C GUI 写在前面 终于又捡起来FLTK了, 先来看看怎么通过FLUID创建一个图形界面并完成回调函数的创建, 参考的是官方教程中关于创建一个CubeView程序的例子, 教程里面很多都与最新版本的FLTK界面不太一致, 但是通过我的摸索还是找出了方法. 下面来分享一下. 创建类…

centos7搭建mysql5.6

检查是否安装mysql rpm -qa | grep mysql 检查已安装的Mariadb rpm -qa | grep -i mariadb 卸载已安装的Mariadb数据库 rpm -qa | grep mariadb | xargs rpm -e --nodeps 下载mysql5.6安装包文件 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm安…

详解什么是Polygon跨链桥| Tokenview

Polygon是一个Layer2网络,用于解决以太坊的吞吐量和主权挑战。尽管以太坊是最受欢迎的区块链开发平台,但它的吞吐量很低,不适合某些应用程序。Polygon提供特定于应用程序的、与以太坊兼容的侧链,将独立链的可扩展性和独立性与以太…

自学开发技术,从入门到入行

今天我们不谈技术,也不聊业务,说说学习技术的心得。 说到学习这种事情,无论是学什么,都需要持之以恒,拥有坚持的决心才有可能会学到一些东西。如果只是三天打鱼,两天晒网的态度,不出差错的话&a…

ORB-SLAM2 --- Tracking::TrackLocalMap函数

目录 1.函数作用 2.函数步骤 3.code 4.函数解释 ORB-SLAM2 --- Tracking::UpdateLocalKeyFrames函数https://blog.csdn.net/qq_41694024/article/details/128307627 1.函数作用 在跟踪得到当前帧初始姿态后,现在对local map进行跟踪得到更多的匹配&#xff0…

《迷你世界》亿级玩家都在用的游戏场景推荐系统长啥样?

导读:中国TOP1沙盒游戏,如何解决数据存储难题? 提到推荐系统,很多人都在电商购物、资讯或娱乐平台中体验过。比如,你刚在某电商APP买了一部手机,过两天再登录时,首页推荐中必定有耳机、手机壳等…

【信息安全】seed-labs实验-Secret-Key Encryption Lab

目录Task 1: Frequency AnalysisTask 2: Encryption using Different Ciphers and ModesTask 4: PaddingTask 5: Error Propagation – Corrupted Cipher TextTask 6: Initial Vector (IV) and Common MistakesTask 6.1. IV ExperimentTask 6.2. Common Mistake: Use the Same …

python源代码打包成为exe文件

目录标题前言下载安装模块(pyinstaller)执行打包命令1、在cmd中进入项目文件2、执行pyinstaller命令成exe文件3、找到exe文件报错以及解决报错X1解决方法:报错X2解决方法:写在最后前言 大家都知道我们在pycharm中编写的源代码&am…

如何在 15 分钟内度量 DORA 指标?

在这篇文章中,我们将介绍 DevOps 四个关键指标——DORA 指标是什么,其度量难点,以及如何基于开源工具快速实现 DORA 指标的持续追踪。如果你熟悉 DORA 指标,可以直接跳到本文第二部分。 什么是 DORA 指标? DORA 的全…

设备树的使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、设备树的概念?二、设备树的作用三、如何使用设备树1.设备树的位置2.设备树的语法认识DTC、DTS、DTSI、DTB设备节点信息3.添加自己的设备树节点4.…

STM32MP157驱动开发——SPI驱动

STM32MP157驱动开发——SPI驱动一、简介1.SPI介绍2.STM32MP1 SPI介绍3. ICM-20608 简介4.Linux下的SPI框架二、驱动开发1)IO 的 pinctrl 子节点创建与修改2)SPI 设备节点的创建与修改3)ICM20608驱动4)测试App5)运行测试…

【分享】订阅用友U8集简云连接器同步费用审批数据至用友U8系统

方案简介 集简云通过与钉钉连接平台深度融合,实现OA审批通过后,将采购、报销、收款、售后等费用审批单数据自动同步至用友U8系统,大大提高了企业日常采购、报销、付款等的工作效率,实现企业业务流程的自动化,为企业降…

Docker的数据管理

目录 一、数据卷 二、数据卷容器 三、容器互联 容器中管理数据主要有两种方式: 数据卷(Data Volumes)数据卷容器(Data Volume Dontainers) 一、数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可…

5点电容式触摸屏控制芯片GT811介绍

5点电容式触摸屏控制芯片GT811简介 5点电容式触摸屏控制芯片GT811,采用投射式电容检测原理,由16个驱动通道与10个感应通道组成触摸检测网络,通过内置模拟放大电路、数字运算模块,及高性能MPU得到实时准确的触摸信息,并…

rocketmq安装

链接:https://pan.baidu.com/s/14ziQH62MeYmM8N6JsH5RcA 提取码:yyds 下载rocketmq-all-4.9.3-bin-release.zip 下载、修改配置 mkdir -p /app/rocketmq cd /app/rocketmqunzip rocketmq-all-4.9.3-bin-release.zip cd rocketmq-4.9.3/修改 配置文件&…

F28335第十六篇——Flash操作

文章目录前言配置方法擦除函数编写和校验函数前言 本文主要介绍如何对DSP28335进行Flash操作。 本文主要参考资料: TI.Flash2833x_API_Readme DSP的Flash操作需要借助官方提供API。官方提供的API主要完成Flash的擦除,编写,校验三种功能。…

八、Java 15 新特性

八、Java 15 新特性 JDK 15 在 2020 年 9 月 15 号正式发布了!根据发布的规划,这次发布的 JDK 15 将是一个短期的过度版,只会被 Oracle 支持(维护)6 个月,直到明年 3 月的 JDK 16 发布此版本将停止维护。而…