当前位置: 首页 > news >正文

自定义Graph Component:1.2-其它Tokenizer具体实现

  本文主要介绍了Rasa中相关Tokenizer的具体实现,包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer,后者包括BertTokenizer和AnotherWhitespaceTokenizer。

一.JiebaTokenizer
  JiebaTokenizer类整体代码结构,如下所示:

  加载自定义字典代码,如下所示[3]:

@staticmethod
def _load_custom_dictionary(path: Text) -> None:"""Load all the custom dictionaries stored in the path.  # 加载存储在路径中的所有自定义字典。More information about the dictionaries file format can be found in the documentation of jieba. https://github.com/fxsjy/jieba#load-dictionary"""print("JiebaTokenizer._load_custom_dictionary()")import jiebajieba_userdicts = glob.glob(f"{path}/*")  # 获取路径下的所有文件。for jieba_userdict in jieba_userdicts:  # 遍历所有文件。logger.info(f"Loading Jieba User Dictionary at {jieba_userdict}")  # 加载结巴用户字典。jieba.load_userdict(jieba_userdict)  # 加载用户字典。

  实现分词的代码为tokenize()方法,如下所示:

def tokenize(self, message: Message, attribute: Text) -> List[Token]:"""Tokenizes the text of the provided attribute of the incoming message."""  # 对传入消息的提供属性的文本进行tokenize。print("JiebaTokenizer.tokenize()")import jiebatext = message.get(attribute)  # 获取消息的属性tokenized = jieba.tokenize(text)  # 对文本进行标记化tokens = [Token(word, start) for (word, start, end) in tokenized]  # 生成标记return self._apply_token_pattern(tokens)

  self._apply_token_pattern(tokens)数据类型为List[Token]。Token的数据类型为:

class Token:# 由将单个消息拆分为多个Token的Tokenizers使用def __init__(self,text: Text,start: int,end: Optional[int] = None,data: Optional[Dict[Text, Any]] = None,lemma: Optional[Text] = None,) -> None:"""创建一个TokenArgs:text: The token text.  # token文本start: The start index of the token within the entire message.  # token在整个消息中的起始索引end: The end index of the token within the entire message.  # token在整个消息中的结束索引data: Additional token data.  # 附加的token数据lemma: An optional lemmatized version of the token text.  # token文本的可选词形还原版本"""self.text = textself.start = startself.end = end if end else start + len(text)self.data = data if data else {}self.lemma = lemma or text

  特别说明:JiebaTokenizer组件的is_trainable=True。


二.MitieTokenizer
  MitieTokenizer类整体代码结构,如下所示:

  核心代码tokenize()方法代码,如下所示:

def tokenize(self, message: Message, attribute: Text) -> List[Token]:"""Tokenizes the text of the provided attribute of the incoming message."""  # 对传入消息的提供属性的文本进行tokenizeimport mitietext = message.get(attribute)encoded_sentence = text.encode(DEFAULT_ENCODING)tokenized = mitie.tokenize_with_offsets(encoded_sentence)tokens = [self._token_from_offset(token, offset, encoded_sentence)for token, offset in tokenized]return self._apply_token_pattern(tokens)

  特别说明:mitie库在Windows上安装可能麻烦些。MitieTokenizer组件的is_trainable=False。


三.SpacyTokenizer
  首先安装Spacy类库和模型[4][5],如下所示:

pip3 install -U spacy
python3 -m spacy download zh_core_web_sm

  SpacyTokenizer类整体代码结构,如下所示:

  核心代码tokenize()方法代码,如下所示:

def tokenize(self, message: Message, attribute: Text) -> List[Token]:"""Tokenizes the text of the provided attribute of the incoming message."""  # 对传入消息的提供属性的文本进行tokenizedoc = self._get_doc(message, attribute)  # doc是一个Doc对象if not doc:return []tokens = [Token(t.text, t.idx, lemma=t.lemma_, data={POS_TAG_KEY: self._tag_of_token(t)})for t in docif t.text and t.text.strip()]

  特别说明:SpacyTokenizer组件的is_trainable=False。即SpacyTokenizer只有运行组件run_SpacyTokenizer0,没有训练组件。如下所示:


四.WhitespaceTokenizer
  WhitespaceTokenizer主要是针对英文的,不可用于中文。WhitespaceTokenizer类整体代码结构,如下所示:

  其中,predict_schema和train_schema,如下所示:

  rasa shell nlu --debug结果,如下所示:

  特别说明:WhitespaceTokenizer组件的is_trainable=False。


五.BertTokenizer
  rasa shell nlu --debug结果,如下所示:

  BertTokenizer代码具体实现,如下所示:
"""
https://github.com/daiyizheng/rasa-chinese-plus/blob/master/rasa_chinese_plus/nlu/tokenizers/bert_tokenizer.py
"""
from typing import List, Text, Dict, Any
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
from rasa.shared.nlu.training_data.message import Message
from transformers import AutoTokenizer
from rasa.nlu.tokenizers.tokenizer import Tokenizer, Token@DefaultV1Recipe.register(DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=False
)
class BertTokenizer(Tokenizer):def __init__(self, config: Dict[Text, Any] = None) -> None:""":param config: {"pretrained_model_name_or_path":"", "cache_dir":"", "use_fast":""}"""super().__init__(config)self.tokenizer = AutoTokenizer.from_pretrained(config["pretrained_model_name_or_path"],  # 指定预训练模型的名称或路径cache_dir=config.get("cache_dir"),  # 指定缓存目录use_fast=True if config.get("use_fast") else False  # 是否使用快速模式)@classmethoddef required_packages(cls) -> List[Text]:return ["transformers"]  # 指定依赖的包@staticmethoddef get_default_config() -> Dict[Text, Any]:"""The component's default config (see parent class for full docstring)."""return {# 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,# Symbol on which prefix should be split"prefix_separator_symbol": None,}def tokenize(self, message: Message, attribute: Text) -> List[Token]:text = message.get(attribute)  # 获取文本encoded_input = self.tokenizer(text, return_offsets_mapping=True, add_special_tokens=False)  # 编码文本token_position_pair = zip(encoded_input.tokens(), encoded_input["offset_mapping"])  # 将编码后的文本和偏移量映射成一个元组tokens = [Token(text=token_text, start=position[0], end=position[1]) for token_text, position in token_position_pair]  # 将元组转换成Token对象return self._apply_token_pattern(tokens)

  特别说明:BertTokenizer组件的is_trainable=False。


六.AnotherWhitespaceTokenizer
  AnotherWhitespaceTokenizer代码具体实现,如下所示:

from __future__ import annotations
from typing import Any, Dict, List, Optional, Textfrom rasa.engine.graph import ExecutionContext
from rasa.engine.recipes.default_recipe import DefaultV1Recipe
from rasa.engine.storage.resource import Resource
from rasa.engine.storage.storage import ModelStorage
from rasa.nlu.tokenizers.tokenizer import Token, Tokenizer
from rasa.shared.nlu.training_data.message import Message@DefaultV1Recipe.register(DefaultV1Recipe.ComponentType.MESSAGE_TOKENIZER, is_trainable=False
)
class AnotherWhitespaceTokenizer(Tokenizer):"""Creates features for entity extraction."""@staticmethoddef not_supported_languages() -> Optional[List[Text]]:"""The languages that are not supported."""return ["zh", "ja", "th"]@staticmethoddef get_default_config() -> Dict[Text, Any]:"""Returns the component's default config."""return {# This *must* be added due to the parent class."intent_tokenization_flag": False,# This *must* be added due to the parent class."intent_split_symbol": "_",# This is a, somewhat silly, config that we pass"only_alphanum": True,}def __init__(self, config: Dict[Text, Any]) -> None:"""Initialize the tokenizer."""super().__init__(config)self.only_alphanum = config["only_alphanum"]def parse_string(self, s):if self.only_alphanum:return "".join([c for c in s if ((c == " ") or str.isalnum(c))])return s@classmethoddef create(cls,config: Dict[Text, Any],model_storage: ModelStorage,resource: Resource,execution_context: ExecutionContext,) -> AnotherWhitespaceTokenizer:return cls(config)def tokenize(self, message: Message, attribute: Text) -> List[Token]:text = self.parse_string(message.get(attribute))words = [w for w in text.split(" ") if w]# if we removed everything like smiles `:)`, use the whole text as 1 tokenif not words:words = [text]# the ._convert_words_to_tokens() method is from the parent class.tokens = self._convert_words_to_tokens(words, text)return self._apply_token_pattern(tokens)

  特别说明:AnotherWhitespaceTokenizer组件的is_trainable=False。


参考文献:
[1]自定义Graph Component:1.1-JiebaTokenizer具体实现:https://mp.weixin.qq.com/s/awGiGn3uJaNcvJBpk4okCA
[2]https://github.com/RasaHQ/rasa
[3]https://github.com/fxsjy/jieba#load-dictionary
[4]spaCy GitHub:https://github.com/explosion/spaCy
[5]spaCy官网:https://spacy.io/
[6]https://github.com/daiyizheng/rasa-chinese-plus/blob/master/rasa_chinese_plus/nlu/tokenizers/bert_tokenizer.py

相关文章:

自定义Graph Component:1.2-其它Tokenizer具体实现

本文主要介绍了Rasa中相关Tokenizer的具体实现,包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer,后者包括BertTokenizer和AnotherWhitespaceTokenizer。 一.JiebaTokenizer   Ji…...

docker-compose 部署 MySQL 8

目录 前言MySQL 配置文件(my.cnf)docker-compose.yml安装卸载 前言 Windows/Linux 系统通过 docker-compose 部署 MySQL8.0。 MySQL 配置文件(my.cnf) # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时…...

Java设计模式-结构型模式-适配器模式

适配器模式 适配器模式应用场景案例类适配器模式对象适配器模式接口适配器模式适配器模式在源码中的使用 适配器模式 如图:国外插座标准和国内不同,要使用国内的充电器,就需要转接插头,转接插头就是起到适配器的作用 适配器模式&…...

CCF编程能力等级认证GESP—C++4级—样题1

CCF编程能力等级认证GESP—C4级—样题1 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)第一题 绝对素数第二题 填幻方 参考答案单选题判断题编程题1编程题…...

Git用pull命令后再直接push有问题

在gitlab新建一个项目&#xff0c;然后拉取到本地&#xff0c;用&#xff1a; git init git pull <远程主机名> 然后就是在本地工作区增加所有文件及文件夹。再添加、提交&#xff0c;都没问题&#xff1a; 但是&#xff0c;git push出问题&#xff1a; 说明本地仓库和…...

C语言不可不敲系列:跳水比赛排名问题

目录 1题干&#xff1a; 2解题思路&#xff1a; 3代码: 4运行结果: 5总结: 1题干&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果 A选手说&#xff1a;B第二&#xff0c;我第三&#xff1b; B选手说&#xff1a;我第二&#xff0c;E第四&am…...

Python与ArcGIS系列(二)获取地图文档

目录 0 简述1 获取当前地图文档2 获取磁盘中的地图文档3 获取地图文档的图层0 简述 本篇开始介绍实际代码操作,即利用arcpy(python 包)执行地理数据分析、数据转换、数据管理和地图自动化。通过arcpy调用ArcGIS中任意工具,将其与其他python工具结合使用,形成自己的工作流…...

Ansible自动化部署工具-role模式安装filebeat实际案例分析

语法以及实际案例 平时我们在进行日志收集的时候&#xff0c;往往会在每台机器上安装filebeat&#xff0c;并且由于每台机器运行服务的不同&#xff0c;那么收集日志的配置文件也是不一样的&#xff0c;如何快速高效的部署filebeat以及拥有不同的配置文件就是我们要思考的问题&…...

B2B企业如何打造独立站:从策略到实施的全面指南

随着数字化转型的加速&#xff0c;B2B企业越来越认识到独立站的重要性。然而&#xff0c;如何建设一个优秀的独立站&#xff0c;以及如何将独立站与企业的整体战略相结合&#xff0c;是许多企业面临的挑战。本文将详细探讨B2B企业如何从策略到实施打造一个成功的独立站。 一、…...

JAVA 中集合取交集

日常工作 经常需要取两个数据集的交集。对常用的List 和Set集合做了一个测试 public static void main(String[] args) {List<Integer> list1 Lists.newArrayList();List<Integer> list2 Lists.newArrayList();Set<Integer> set3 Sets.newHashSet();Set&l…...

Android13 Launcher3 定制

去掉Google搜索栏 aosp/packages/apps/Launcher3/src_build_config/com/android/launcher3/BuildConfig.java 修改QSB_ON_FIRST_SCREEN为false public static final boolean QSB_ON_FIRST_SCREEN false;去掉抽屉菜单&#xff0c;所有应用都放到桌面 增加控制变量 aosp/pac…...

其他word转化为PDF的方式

将 Word 文档转换为 PDF 格式&#xff0c;除了使用 COM 自动化外&#xff0c;还有其他一些方法可以在 Java 中实现。这些方法通常更加可靠和跨平台。以下是一些常用的方法&#xff1a; 1. 使用 Apache POI 和 Apache PDFBox 这种方法涉及使用 Apache POI 库读取 Word 文档&am…...

【Axure】axure rp 导入元件库和使用,主流元件库下载使用

vant 元件库下载&#xff1a;Vant4 设计资源 element UI 元件库下载&#xff1a;element ui 设计资源 Andt Design Vue 下载设计资源&#xff1a;Andt Design Vue Andt Design Pro下载设计资源&#xff1a;Andt Design Pro Arco Design 设计资源&#xff1a;Arco Design …...

ISP 处理流程

#灵感# 摆烂时间太长了&#xff0c;感觉知识忘光光了。重新学习&#xff0c;常学常新。 因为公司文档都不让摘抄、截取&#xff0c;所以内容是工作的一些自己记录和网络内容&#xff0c;不对的欢迎批评指正。 1、ISP概述 ISP是Image Signal Processor 的简称&#xff0c;也就…...

【计算思维】少儿编程蓝桥杯青少组计算思维题考试真题及解析C

【科技素养】少儿编程蓝桥杯青少组计算思维题考试真题及解析 1.天平的左右两端分别放有一些砝码&#xff0c;如下图所示&#xff0c;右边的砝码不变&#xff0c;从左边最多拿走几个砝码&#xff0c;可以使天平左右两边平衡&#xff1a; A、1 B、2 C、3 D、4 2.把下面的图形…...

百望云斩获“新华信用金兰杯”ESG优秀案例 全面赋能企业绿色数字化

近年来&#xff0c;中国ESG蓬勃发展&#xff0c;在政策体系构建、ESG信披ESG投资和国际合作等方面都取得了阶段性成效&#xff0c;ESG生态不断完善。全社会对ESG的认识及实践也在不断深化&#xff0c;ESG实践者的队伍在不断发展壮大。 ESG作为识别企业高质量发展的重要指标&…...

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds&#xff1a; ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…...

2023年亚太杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …...

【广州华锐互动】VR居家防火逃生模拟演练增强训练的真实性

VR软件开发公司广州华锐互动在消防培训领域已开发了多款VR产品&#xff0c;今天为大家介绍VR居家防火逃生模拟演练系统&#xff0c;这是一种基于虚拟现实技术的消防教育训练设备&#xff0c;通过模拟真实的火灾场景&#xff0c;让使用者身临其境地体验火灾逃生过程&#xff0c;…...

PaddleClas学习1——使用PPLCNet模型对车辆属性进行识别(python)

使用PPLCNet模型对车辆属性进行识别 1. 配置PaddlePaddle,PaddleClas环境1.1 安装PaddlePaddle(1)创建 docker 容器(2)退出/进入 docker 容器(3) 安装验证1.2 安装python3.8(可选)1.3 安装 PaddleClas2. 模型推理2.1 下载官方提供的车辆属性模型2.2 基于 Python 预测引…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...