描述:
当使用自定义词汇表的 SentencePieceUnigramTokenizer
时,没有属性来处理 unk_id
,导致在编码词汇表中不存在的文本时出现错误。
示例:
- 词汇表:
{'a': -1.23, 'b': -1.34, 'c': -1.45}
- 编码: tokenizer.encode("bcd")
建议修复:
class SentencePieceUnigramTokenizer(BaseTokenizer):
def __init__(
self,
vocab: Optional[List[Tuple[str, float]]] = None,
replacement: str = "▁",
add_prefix_space: bool = True,
unk_id: int = 0,
):
if vocab is not None:
tokenizer = Tokenizer(Unigram(vocab, unk_id=unk_id))
else:
tokenizer = Tokenizer(Unigram())
tokenizer.normalizer = normalizers.Sequence([
normalizers.Nmt(),
normalizers.NFKC(),
normalizers.Replace(Regex(" {2,}"), " "),
])
tokenizer.pre_tokenizer = pre_tokenizers.Metaspace(replacement=replacement)
tokenizer.decoder = decoders.Metaspace(replacement=replacement)
parameters = {
"model": "SentencePieceUnigram",
"replacement": replacement,
"add_prefix_space": add_prefix_space,
}
super().__init__(tokenizer, parameters)
问题:
当前实现不处理 unk_id
,导致遇到未知标记时出现错误。在 tokenizer 初始化中添加对 unk_id
的支持将解决此问题。请告知我是否已有现有解决方案。
1条答案
按热度按时间mitkmikd1#
在这种情况下,您传递给
Tokenizer
的词汇表中缺少unk_id
。为什么不在词汇表中添加"<unk>":0
呢?