tokenizers SentencePiece Unigram Tokenizer处理未知标记的问题

cwxwcias  于 23天前  发布在  其他
关注(0)|答案(1)|浏览(19)

描述:

当使用自定义词汇表的 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 的支持将解决此问题。请告知我是否已有现有解决方案。

mitkmikd

mitkmikd1#

在这种情况下,您传递给Tokenizer的词汇表中缺少unk_id。为什么不在词汇表中添加"<unk>":0呢?

相关问题