自定义Graph Component:1.1-JiebaTokenizer具体实现

news2024/11/18 7:43:28

  JiebaTokenizer类继承自Tokenizer类,而Tokenizer类又继承自GraphComponent类,GraphComponent类继承自ABC类(抽象基类)。本文使用《使用ResponseSelector实现校园招聘FAQ机器人》中的例子,主要详解介绍JiebaTokenizer类中方法的具体实现。

0.JiebaTokenizer类中方法列表
  下面是JiebaTokenizer类中所有方法和属性列表,也包括从其它类中继承来的方法和属性,如下所示:

  JiebaTokenizer类(默认参数)中本身方法执行顺序,如下所示:

JiebaTokenizer.supported_languages()
JiebaTokenizer.required_packages()
JiebaTokenizer.get_default_config()
JiebaTokenizer.create()
JiebaTokenizer.__init__()
JiebaTokenizer.train()
JiebaTokenizer.persist()
JiebaTokenizer.load()
JiebaTokenizer.tokenize()

  默认参数没有执行2个方法,如下所示:

_load_custom_dictionarypipeline(*)方法
_copy_files_dir_to_dir(*)方法

  接下来自然而然的问题是,如何在config.yml中给JiebaTokenizer自定义参数呢?可参考get_default_config()方法,如下所示:

def get_default_config() -> Dict[Text, Any]:
    return {
        # default don't load custom dictionary  # 默认不加载自定义字典
        "dictionary_path": None,  # 自定义字典的路径
        # Flag to check whether to split intents  # 检查是否拆分intent的标志
        "intent_tokenization_flag": False,
        # Symbol on which intent should be split  # intent应该拆分的符号
        "intent_split_symbol": "_",
        # Regular expression to detect tokens  # 用于检测tokens的正则表达式
        "token_pattern": None,
        # Symbol on which prefix should be split  # 前缀应该拆分的符号
        "prefix_separator_symbol": None,
    }

1.supported_languages(*)方法
解析:支持的语言,即[“zh”]。如下所示:

@staticmethod
def supported_languages() -> Optional[List[Text]]:
    """Supported languages (see parent class for full docstring)."""  # 支持的语言(请参阅父类的完整文档字符串)。
    print("JiebaTokenizer.supported_languages()")

    return ["zh"]

2.get_default_config(*)方法
解析:返回默认配置,如下所示:

@staticmethod
def get_default_config() -> Dict[Text, Any]:
    """Returns default config (see parent class for full docstring)."""  # 返回默认配置(请参阅父类的完整文档字符串)。
    print("JiebaTokenizer.get_default_config()")

    return {
        # default don't load custom dictionary  # 默认不加载自定义字典
        "dictionary_path": None,
        # 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  # 用于检测tokens的正则表达式
        "token_pattern": None,
        # Symbol on which prefix should be split  # 前缀应该拆分的符号
        "prefix_separator_symbol": None,
    }

3.__init__(*)方法
解析:执行到create()方法的cls(config, model_storage, resource)时,实际调用的是def __init__()。如下所示:

def __init__(
    self, config: Dict[Text, Any], model_storage: ModelStorage, resource: Resource
) -> None:
    """Initialize the tokenizer."""  # 初始化标记器。
    print("JiebaTokenizer.__init__()")

    super().__init__(config)
    self._model_storage = model_storage
    self._resource = resource

4.create(*)方法
解析:创建一个新组件,如下所示:

@classmethod
def create(
    cls,
    config: Dict[Text, Any],
    model_storage: ModelStorage,
    resource: Resource,
    execution_context: ExecutionContext,
) -> JiebaTokenizer:
    """Creates a new component (see parent class for full docstring)."""  # 创建一个新组件(请参阅父类的完整文档字符串)。
    print("JiebaTokenizer.create()")

    # Path to the dictionaries on the local filesystem.
    dictionary_path = config["dictionary_path"]

    if dictionary_path is not None:
        cls._load_custom_dictionary(dictionary_path)
    return cls(config, model_storage, resource)

(1)config: Dict[Text, Any]

{
	'dictionary_path': None,
	'intent_split_symbol': '_',
	'intent_tokenization_flag': False,
	'prefix_separator_symbol': None,
	'token_pattern': None
}

(2)model_storage: ModelStorage

(3)resource: Resource

{
	name = 'train_JiebaTokenizer0', 
	output_fingerprint = '318d7f231c4544dc9828e1a9d7dd1851'
}

(4)execution_context: ExecutionContext

其中,cls(config, model_storage, resource)实际调用的是def __init__()

5.required_packages(*)方法
解析:此组件运行所需的任何额外python依赖项,即[“jieba”]。如下所示:

@staticmethod
def required_packages() -> List[Text]:
    """Any extra python dependencies required for this component to run."""  # 此组件运行所需的任何额外python依赖项。
    print("JiebaTokenizer.required_packages()")

    return ["jieba"]

6._load_custom_dictionary(*)方法
解析:从模型存储加载自定义字典,如下所示:

@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 jieba

    jieba_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)  # 加载用户字典。

7.train(*)方法
解析:将字典复制到模型存储,如下所示:

def train(self, training_data: TrainingData) -> Resource:
    """Copies the dictionary to the model storage."""
    print("JiebaTokenizer.train()")

    self.persist()  # 持久化。
    return self._resource

  其中,返回的self._resource内容如下所示:


8.tokenize(*)方法(重点)
解析:对传入消息的提供属性的文本进行tokenize,如下所示:

def tokenize(self, message: Message, attribute: Text) -> List[Token]:
    """Tokenizes the text of the provided attribute of the incoming message."""
    print("JiebaTokenizer.tokenize()")

    import jieba

    text = message.get(attribute)  # 获取消息的属性

    tokenized = jieba.tokenize(text)  # 对文本进行标记化
    tokens = [Token(word, start) for (word, start, end) in tokenized]  # 生成标记

    return self._apply_token_pattern(tokens)

  其中,message.data内容为{'intent': 'goodbye', 'text': '拜拜'}。其它字段具体数值,如下所示:


9.load(*)方法
解析:从模型存储加载自定义字典,如下所示:

@classmethod
def load(
    cls,
    config: Dict[Text, Any],
    model_storage: ModelStorage,
    resource: Resource,
    execution_context: ExecutionContext,
    **kwargs: Any,
) -> JiebaTokenizer:
    """Loads a custom dictionary from model storage."""  # 从模型存储加载自定义字典。
    print("JiebaTokenizer.load()")

    dictionary_path = config["dictionary_path"]

    # If a custom dictionary path is in the config we know that it should have been saved to the model storage.  # 如果配置中有自定义字典路径,我们知道它应该已保存到模型存储中。
    if dictionary_path is not None:
        try:
            with model_storage.read_from(resource) as resource_directory:
                cls._load_custom_dictionary(str(resource_directory))
        except ValueError:
            logger.debug(
                f"Failed to load {cls.__name__} from model storage. "
                f"Resource '{resource.name}' doesn't exist."
            )
    return cls(config, model_storage, resource)


10._copy_files_dir_to_dir(*)方法
解析:执行persist(*)方法时会调用该方法,如下所示:

@staticmethod
def _copy_files_dir_to_dir(input_dir: Text, output_dir: Text) -> None:
    print("JiebaTokenizer._copy_files_dir_to_dir()")

    # make sure target path exists  # 确保目标路径存在
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    target_file_list = glob.glob(f"{input_dir}/*")
    for target_file in target_file_list:
        shutil.copy2(target_file, output_dir)

11.persist(*)方法
解析:持久化自定义字典,如下所示:

def persist(self) -> None:
    """Persist the custom dictionaries."""
    print("JiebaTokenizer.persist()")

    dictionary_path = self._config["dictionary_path"]
    if dictionary_path is not None:
        with self._model_storage.write_to(self._resource) as resource_directory:
            self._copy_files_dir_to_dir(dictionary_path, str(resource_directory))

12._model_storage属性
解析:用来初始化JiebaTokenizer类的属性,详见构造函数。

13._resource属性
解析:用来初始化JiebaTokenizer类的属性,详见构造函数。

参考文献:
[1]https://github.com/RasaHQ/rasa/blob/main/rasa/nlu/tokenizers/jieba_tokenizer.py
[2]使用ResponseSelector实现校园招聘FAQ机器人:https://mp.weixin.qq.com/s/ZG3mBPvkAfaRcjmXq7zVLA

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

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

相关文章

JavaScript_动态表格_添加功能

1、动态表格_添加功能.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: ce…

Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程 软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架&#xff01;全实战详细教学&#xff0c;仅此一套&#xff01;的第1集视频&#xff0c;该合集共计11集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

ElasticSearch学习和使用 (使用head软件可视化es数据)

使用步骤 直接使用 Elasticsearch的安装和使用 下载Elasticsearch6.2.2的zip包&#xff0c;并解压到指定目录&#xff0c;下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2运行bin目录下的elasticsearch.bat启动Elasticsearch安…

【Python】python读取,显示,保存图像的几种方法

一、PIL&#xff1a;Python Imaging Library&#xff08;pillow&#xff09; PIL读取图片不直接返回numpy对象&#xff0c;可以用numpy提供的函数np.array()进行转换&#xff0c;亦可用Image.fromarray()再从numpy对象转换为原来的Image对象&#xff0c;读取&#xff0c;显示&…

Deepsort项目详解

一、目标追踪整体代码 代码目录如下图所示&#xff1a; 、 追踪相关代码&#xff1a; 检测相关代码和权重 调用 检测 和 追踪的代码&#xff1a; 首先代码分为三个部分&#xff1a; 目标追踪的相关代码和权重目标检测相关代码和权重&#xff0c;这里用的是yolov5.5目标检…

c语言练习11周(6~10)

输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。 题干 输入任意字串&#xff0c;将串中除了首尾字符的其他字符升序排列显示&#xff0c;串中字符个数最多20个。输入样例gfedcba输出样例gbcdefa 选择排序 #include<s…

java--JDBC学习

文章目录 今日内容0 复习昨日1 JDBC概述2 JDBC开发步骤2.1 创建java项目2.2 导入mysql驱动包2.2.1 复制粘贴版本2.2.2 idea导入类库版本 2.3 JDBC编程 3 完成增删改3.1 插入3.2 更新3.3 删除 4 查询结果集ResultSet【重要】5 登录案例【重要】6 作业 今日内容 0 复习昨日 1 JDB…

数据结构:树的存储结构(孩子兄弟表示法,树和森林的遍历)

目录 1.树的存储结构1.双亲表示法&#xff08;顺序存储&#xff09;1.优缺点 2.孩子表示法&#xff08;顺序链式存储&#xff09;3.孩子兄弟表示法&#xff08;链式存储&#xff09;4.森林与二叉树的转换 2.树的遍历1.先根遍历2.后根遍历3.层序遍历 3.森林的遍历1.先序遍历2.中…

汉明距离(Java)

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y&#xff0c;计算并返回它们之间的汉明距离。 方法1:使用内置函数 class Solution {public int hammingDistance(int x, int y) {return Integer.bitCount(x ^ y);} }方法2:移位实…

Flutter:改变手机状态栏颜色,与appBar状态颜色抱持一致

前言 最近在搞app的开发&#xff0c;本来没怎么注意appBar与手机状态栏颜色的问题。但是朋友一说才注意到这两种的颜色是不一样的。 我的app 京东 qq音乐 这样一对比发现是有的丑啊&#xff0c;那么如何实现呢&#xff1f; 实现 怎么说呢&#xff0c;真不会。百度到的一些是…

java的类和继承构造

一些小技巧 类和对象 什么是类&#xff0c;对象&#xff0c;方法&#xff1f; 在下面的 Java 代码中&#xff0c;定义了一个名为 Person 的类&#xff0c;并提供了构造方法来初始化对象的属性。类中定义了 eat、sleep 和 work 三个方法&#xff0c;用于表示人的行为。在 main 方…

ValueError: ‘x‘ and ‘y‘ must have the same size

ValueError: ‘x’ and ‘y’ must have the same size 问题描述 出错代码 axes[0].errorbar(dates_of_observation, observed_lai, yerrstd_lai, fmt"o")X是观测的日期&#xff0c;16天&#xff0c;而且数据也是对应的16个&#xff0c;为什么不对应呢&#xff1f;…

python工具CISCO ASA设备任意文件读取

​python漏洞利用 构造payload&#xff1a; /CSCOT/translation-table?typemst&textdomain/%2bCSCOE%2b/portal_inc.lua&default-language&lang../漏洞证明&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0c;万分感谢。 免…

git的分支及标签使用及情景演示

目录 一. 环境讲述 二.分支 1.1 命令 1.2情景演练 三、标签 3.1 命令 3.2 情景演示 ​编辑 一. 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用如下&#xff1a; 开发环境&#xff1a;用于开发人员进行软件开发、测试和调试。在这个环境中…

git push origin masterEverything up-to-date

按住这个看一下很简单的问题&#xff0c;我在网上看了很多就是没找到能用的&#xff0c;最后找到了这个看起来写的很简单的一个文章&#xff0c;但他写的真的有用。 出现的问题 解决步骤

前端开发引入element plus与windi css

背景 前端开发有很多流行框架&#xff0c;像React 、angular、vue等等&#xff0c;本文主要讲vue 给新手用的教程&#xff0c;其实官网已经写的很清楚&#xff0c;这里再啰嗦只是为了给新手提供一个更加简单明了的参考手册。 一、打开element plus官网选则如图所示模块安装命令…

【学习笔记】Understanding LSTM Networks

Understanding LSTM Networks 前言Recurrent Neural NetworksThe Problem of Long-Term DependenciesLSTM Networks The Core Idea Behind LSTMsStep-by-Step LSTM Walk ThroughForget Gate LayerInput Gate LayerOutput Gate Layer Variants on Long Short Term MemoryConclus…

go学习之接口知识

文章目录 接口1.接口案例代码展示2.基本介绍3.基本语法4.应用场景介绍5.注意事项和细节6.接口编程经典案例7.接口与继承之间的比较8.面向对象编程--多态1&#xff09;基本介绍2&#xff09;快速入门3&#xff09;接口体现多态的两种形式 9.类型断言1&#xff09;先看一个需求2&…

odoo16 库存初始化 excel导入问题2

产品导入模板: excel内容: 导入测试 查看可能的值,发现没有ml,在计量单位中增加ml选项(不选创建,知道为什么不,仔细想想,创建不知ml是什么单位) 位置不能在此导入,故取消 测试正常 导入成功 总结:产品导入时,位置无法指定,只建产品名称,计量单位,采购单位,

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.3)

混沌系统在图像加密中的应用&#xff08;基于哈密顿能量函数的混沌系统构造1.3&#xff09; 前言一类三维非哈密顿系统的构造与动态特性分析1.相关理论基础2.类Nos-Hoove系统构造的思路及实现3.基于哈密顿能量理论的Nos-Hoove系统的分析与仿真3.1 平衡点分析3.2 不同强度激励下…