添加一个分词器
分词器将文本字符串转换为一系列词元(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.