调用tokenizer.train_from_iterator时抛出TypeError: expected string or buffer错误的排查求助
调用tokenizer.train_from_iterator时抛出TypeError: expected string or buffer错误的排查求助
看起来你在自定义Tokenizer训练时遇到了TypeError,我帮你梳理下代码里的几个关键问题:
1. preprare_dataset方法存在笔误
你的preprare_dataset方法最后返回了未定义的变量examples,但前面实际构建的训练文本变量是training_texts,这会导致self.training_corpus内容异常,后续迭代器无法返回正确的训练文本:
def preprare_dataset(self): X2 = np.random.choice(len(self.df), size=self.size_dataset, replace=False) training_texts = [f"{df.iloc[i]['problem']} {df.iloc[i]['solution']}" for i in X2] return training_texts # 替换原来的return examples
2. IngenxPreTokenizer类缺少base_tokenizer初始化
你在IngenxPreTokenizer的pre_tokenize方法中调用了self.base_tokenizer.process_text,但这个类没有初始化base_tokenizer属性,运行时会找不到该对象。需要补充初始化逻辑:
class IngenxPreTokenizer: def __init__(self, base_tokenizer): self.base_tokenizer = base_tokenizer # 初始化传入的基础分词器 def pre_tokenize(self, pretok: PreTokenizedString): # 关键:将PreTokenizedString对象转换为字符串,避免类型不匹配 text = str(pretok) # 或根据base_tokenizer要求使用pretok.normalized_str processed = self.base_tokenizer.process_text(text) normalized_tokens = [] current_offset = 0 for token in processed: token_len = len(token) normalized_tokens.append(( token, (current_offset, current_offset + token_len) )) current_offset += token_len + 1 pretok.tokens = normalized_tokens return pretok
之后在设置预分词器时,记得传入你的基础分词器实例:
# 替换成你实际使用的基础分词器实例 base_tokenizer = YourBaseTokenizer() tokenizer.pre_tokenizer = PreTokenizer.custom(IngenxPreTokenizer(base_tokenizer))
3. pre_tokenize方法参数类型不匹配
你当前直接把PreTokenizedString对象传给process_text,而该方法期望接收字符串类型的输入,这正是你看到expected string or buffer错误的核心原因。上面的代码中已经通过text = str(pretok)解决了这个类型转换问题。
另外,建议你检查get_training_corpus方法yield的每个元素,确保都是标准字符串类型,避免传入非字符串内容给train_from_iterator。
备注:内容来源于stack exchange,提问作者Swaraj Gaikwad
相关产品推荐
相关产品推荐

