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

如何在Python中修复文本编码以解决BERT分词器UNK问题

解决BERT分词器处理特殊格式文本时的[UNK]问题

问题背景

你使用bert-base-multilingual-cased分词器处理包含特殊粗体变体字符(如𝗜、𝘀这类数学粗体拉丁字符)的文本时,大量字符被识别为[UNK],无法正常分词。

原代码

from transformers import AutoTokenizer
s ="𝗜𝘀 𝗽а𝘀𝘀𝗶𝘃е 𝗶𝗻𝗰о𝗺е 𝘄𝗵а𝘁 𝘆𝗼𝘂'𝗿𝗲 𝗹𝗼𝗼𝗸𝗶𝗻𝗴 𝗳𝗼𝗿? \n⚡️𝗜𝗻𝘃𝗲𝘀𝘁𝗺𝗲𝗻𝘁 𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺 𝗳𝗼𝗿 𝗯𝗲𝗴𝗶𝗻𝗻𝗲𝗿𝘀! \n⚡️ 𝗝𝘂𝘀𝘁 𝗼𝗻𝗲 𝘀𝗺𝗮𝗿𝘁 𝗶𝗻𝘃𝗲𝘀𝘁𝗺𝗲𝗻𝘁 𝗰𝗮𝗻 𝗺𝗼𝗱𝗶𝗳𝘆 𝗲𝘃𝗲𝗿𝘆𝘁𝗵𝗶𝗻𝗴! \n𝗗𝘂𝗲 𝘁𝗼 𝘁𝗵𝗲 𝗹𝗮𝘁𝗲𝘀𝘁 𝘀𝗮𝗻𝗰𝘁𝗶𝗼𝗻𝘀 𝗶𝗻 𝘁𝗵𝗲 𝘄𝗼𝗿𝗹𝗱, 𝘁𝗵𝗶𝘀 𝗶𝘀 𝘆𝗼𝘂𝗿 𝗰𝗵𝗮𝗻𝗰𝗲 𝗳𝗼𝗿 𝘀𝘁𝗮𝗯𝗶𝗹𝗶𝘁𝘆 𝗶𝗻 𝗳𝗶𝗳𝘁𝗵 𝗺𝗶𝗻𝘂𝘁𝗲𝘀. 𝗝𝘂𝘀𝘁 𝗿𝗲𝗴𝗶𝘀𝘁𝗲𝗿 𝗮𝗻𝗱 𝗱𝗶𝘀𝗰𝗼𝘃𝗲𝗿 𝗼𝘂𝘁 𝗺𝗼𝗿𝗲."
model_name = "bert-base-multilingual-cased"

tokenizer = AutoTokenizer.from_pretrained(model_name)
print(tokenizer.tokenize(s))

原输出

['[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', "'", '[UNK]', '[UNK]', '[UNK]', '?', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '!', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '!', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', ',', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '.', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '.']

解决方案

方法1:归一化特殊字符到标准UTF-8格式

这类特殊字符属于Unicode变体(数学粗体拉丁字符),可以通过unicodedata模块的NFKC归一化,将其映射为普通ASCII字符,从而被分词器识别。

修改后的代码

import unicodedata
from transformers import AutoTokenizer

def normalize_special_chars(text):
    # NFKC归一化:将特殊变体字符转换为普通字符
    normalized_text = unicodedata.normalize('NFKC', text)
    # 可选:移除无关符号(如闪电符号),也可根据需求保留
    cleaned_text = ''.join([char for char in normalized_text if char.isprintable() and char not in '⚡️'])
    return cleaned_text

original_text ="𝗜𝘀 𝗽а𝘀𝘀𝗶𝘃е 𝗶𝗻𝗰о𝗺е 𝘄𝗵а𝘁 𝘆𝗼𝘂'𝗿𝗲 𝗹𝗼𝗼𝗸𝗶𝗻𝗴 𝗳𝗼𝗿? \n⚡️𝗜𝗻𝘃𝗲𝘀𝘁𝗺𝗲𝗻𝘁 𝗽𝗹𝗮𝘁𝗳𝗼𝗿𝗺 𝗳𝗼𝗿 𝗯𝗲𝗴𝗶𝗻𝗻𝗲𝗿𝘀! \n⚡️ 𝗝𝘂𝘀𝘁 𝗼𝗻𝗲 𝘀𝗺𝗮𝗿𝘁 𝗶𝗻𝘃𝗲𝘀𝘁𝗺𝗲𝗻𝘁 𝗰𝗮𝗻 𝗺𝗼𝗱𝗶𝗳𝘆 𝗲𝘃𝗲𝗿𝘆𝘁𝗵𝗶𝗻𝗴! \n𝗗𝘂𝗲 𝘁𝗼 𝘁𝗵𝗲 𝗹𝗮𝘁𝗲𝘀𝘁 𝘀𝗮𝗻𝗰𝘁𝗶𝗼𝗻𝘀 𝗶𝗻 𝘁𝗵𝗲 𝘄𝗼𝗿𝗹𝗱, 𝘁𝗵𝗶𝘀 𝗶𝘀 𝘆𝗼𝘂𝗿 𝗰𝗵𝗮𝗻𝗰𝗲 𝗳𝗼𝗿 𝘀𝘁𝗮𝗯𝗶𝗹𝗶𝘁𝘆 𝗶𝗻 𝗳𝗶𝗳𝘁𝗵 𝗺𝗶𝗻𝘂𝘁𝗲𝘀. 𝗝𝘂𝘀𝘁 𝗿𝗲𝗴𝗶𝘀𝘁𝗲𝗿 𝗮𝗻𝗱 𝗱𝗶𝘀𝗰𝗼𝘃𝗲𝗿 𝗼𝘂𝘁 𝗺𝗼𝗿𝗲."
model_name = "bert-base-multilingual-cased"

# 先处理文本
processed_text = normalize_special_chars(original_text)
# 初始化分词器并分词
tokenizer = AutoTokenizer.from_pretrained(model_name)
print(tokenizer.tokenize(processed_text))

处理后输出示例

['Is', 'pass', '##ive', 'income', 'what', 'you', "'", 're', 'looking', 'for', '?', 'Investment', 'platform', 'for', 'beginners', '!', 'Just', 'one', 'smart', 'investment', 'can', 'modify', 'everything', '!', 'Due', 'to', 'the', 'latest', 'sanctions', 'in', 'the', 'world', ',', 'this', 'is', 'your', 'chance', 'for', 'stability', 'in', 'fifth', 'minutes', '.', 'Just', 'register', 'and', 'discover', 'out', 'more', '.']

方法2:扩展分词器词汇表(不推荐,除非必须保留原字符)

如果需要保留原特殊字符,可以将这些字符添加到分词器的词汇表中,然后重新训练分词器的词嵌入。但这种方法工作量大,且可能影响模型原有性能,仅在特殊需求下使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:02:32