You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用训练好的BPE分词器获取Token的所有可能编码(无需手动遍历)

获取BPE分词器的所有合法Token编码方案

要获取给定字符串的所有合法BPE拆分,核心是利用分词器的词汇表,结合动态规划高效生成所有可能组合,无需手动遍历所有可能性。以下是具体实现步骤(以Hugging Face Transformers库中的BPE分词器为例):

  • 第一步:导出分词器的完整词汇表
    从训练好的分词器中提取所有合法Token,作为判断子串是否为有效拆分的依据:

    from transformers import AutoTokenizer
    
    bpe_tokenizer = AutoTokenizer.from_pretrained("你的预训练模型路径/名称")
    vocab = bpe_tokenizer.get_vocab()
    valid_tokens = set(vocab.keys())
    

    注意:部分分词器的Token会带特殊前缀(如GPT2的Ġ),需根据分词器规则调整子串匹配逻辑,确保匹配的是实际文本对应的有效Token。

  • 第二步:用动态规划生成所有拆分方案
    编写动态规划函数,从字符串末尾向前推导,记录每个起始位置对应的所有合法拆分组合:

    def get_all_bpe_splits(s, valid_tokens):
        n = len(s)
        # dp[i] 存储从索引i到字符串末尾的所有拆分方案
        dp = [[] for _ in range(n + 1)]
        dp[n] = [[]]  # 空字符串的拆分方案为空列表
    
        for i in range(n - 1, -1, -1):
            # 尝试从i开始取不同长度的子串
            for j in range(i + 1, n + 1):
                substring = s[i:j]
                if substring in valid_tokens:
                    # 将当前子串与后续位置的所有拆分方案组合
                    for split in dp[j]:
                        dp[i].append([substring] + split)
        return dp[0]
    
  • 第三步:调用函数获取结果
    传入目标字符串和合法Token集合,即可得到所有可能的拆分:

    splits = get_all_bpe_splits("splace", valid_tokens)
    print(splits)
    # 输出示例:[["spl", "ace"], ["s", "place"]](若存在其他合法拆分也会一并返回)
    

额外说明

  • 动态规划的方式避免了暴力递归的重复计算,对较长字符串的处理效率更高。
  • 如果使用的是自定义BPE分词器(而非Hugging Face实现),只需替换获取词汇表的逻辑,确保valid_tokens包含所有合法Token即可。

内容的提问来源于stack exchange,提问作者Eli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:50:28