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

如何修正HuggingFace Unigram分词器解码结果的多余空格问题

解决Unigram分词器解码后多余空格的问题

问题核心原因有两个:一是训练数据量过小,导致分词器只能将每个字符拆分为独立token;二是缺少合适的预处理、后处理规则来避免冗余空格的生成。

修正方案

1. 使用足量训练语料+配置预处理/后处理

Unigram是子词分词器,需要足够语料学习合理的子词单元,仅用单条短文本训练会触发字符级拆分。可以通过重复文本模拟大语料,同时配置必要的处理规则:

import tokenizers

text = "Hello World!"
# 生成重复语料,让分词器学习子词
train_corpus = [text] * 1000
tokenizer = tokenizers.Tokenizer(tokenizers.models.Unigram())

# 配置预分词器:先按空格拆分文本,优先学习完整单词
tokenizer.pre_tokenizer = tokenizers.pre_tokenizers.Whitespace()
# 配置后处理器:保持原文本格式,不引入额外特殊标记的空格
tokenizer.post_processor = tokenizers.processors.TemplateProcessing(
    single="$A",
    special_tokens=[("[CLS]", 0), ("[SEP]", 1)]
)

# 训练分词器,设置词汇量与特殊标记
tokenizer.train_from_iterator(
    train_corpus,
    vocab_size=100,
    special_tokens=["[CLS]", "[SEP]"]
)

encoded = tokenizer.encode(text)
decoded = tokenizer.decode(encoded.ids)
print(decoded)
# 输出: Hello World!

2. 手动添加目标词汇(快速测试用)

如果不想用大语料训练,可以直接手动添加需要的词汇到分词器:

import tokenizers

text = "Hello World!"
tokenizer = tokenizers.Tokenizer(tokenizers.models.Unigram())
# 手动添加完整词汇与空格,避免字符级拆分
tokenizer.add_tokens(["Hello", " ", "World!"])

encoded = tokenizer.encode(text)
decoded = tokenizer.decode(encoded.ids)
print(decoded)
# 输出: Hello World!

关键说明

Unigram的分词效果高度依赖训练语料的规模和质量,小语料会导致过度拆分;而默认的解码逻辑会在独立token间添加空格,最终出现冗余空格问题。通过提供足量训练语料+配置正确的预处理/后处理规则,就能让解码结果与原文本一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:05