跳到主内容

添加一个分词器

分词器将文本字符串转换为一系列词元(tokens)。Ludwig 在预处理过程中,会为数据集中指定分词器的每个文本列的每一行调用分词器。然后,它会收集一个唯一词元列表,并为每个唯一词元分配一个整数索引。这个唯一的有序词元列表被称为 词汇表(vocabulary),编码器将使用它将词元转换为嵌入向量,解码器将使用它将输出预测转换为词元。

分词器主要负责将字符串分割成词元列表,也可以选择执行其他处理,通常是为了减小词汇表的大小。分词器可能执行的一些处理示例包括:

  • 按分隔符进行分割,例如下划线“_”或逗号“,”。
  • 移除标点符号
  • 移除停用词,例如英语中的“a”、“an”、“the”。
  • 词形还原(Lemmatization):将同一词的不同屈折形式分组,例如“car”、“cars”、“car's”、“cars'” -> “car”

一个分词器一旦注册,就可以通过在 preprocessing 配置字典中指定其名称作为 tokenizer 的值来用于预处理任何文本输入列。

input_features:
    -   name: title
        type: text
        preprocessing:
            tokenizer: <NEW_TOKENIZER>

分词器在 ludwig/utils/tokenizers.py 中定义。要添加一个分词器,请定义一个新的 BaseTokenizer 子类并将其添加到注册表。

1. 添加一个新的分词器类

分词器可以定义一个可选的构造函数,该函数可以接收配置中的参数。大多数分词器没有配置参数,因此不需要构造函数。有关在其构造函数中使用参数的分词器示例,请参阅 HFTokenizer

__call__ 方法执行实际的处理,接收一个字符串参数并期望返回一个字符串列表。在预处理期间,分词器会为数据集中的每个样本调用一次。预处理后的词元序列将缓存到磁盘的 .hdf5 文件中,并在训练和验证时重复使用,因此在训练期间不会调用分词器。

class NewTokenizer(BaseTokenizer):
    def __init__(self, **kwargs):
        super().__init__()
        # Initialize any variables or state

    def __call__(self, text: str) -> List[str]:
        # tokenized_text = result of tokenizing
        return tokenized_text

2. 将分词器添加到注册表

分词器名称在 ludwig/utils/tokenizers.py 文件底部的 tokenizer_registry 字典中映射到其实现。

tokenizer_registry = {
    "characters": CharactersToListTokenizer,
    "space": SpaceStringToListTokenizer,
    ...
    "new_tokenizer": NewTokenizer,  # Add your tokenizer as a new entry in the registry.