如何从Hugging Face Tokenizer识别UNK Token并批量提取语料未知词
提取预训练Tokenizer未识别的未知Token方法
针对你需要找出语料中所有不在预训练Tokenizer词汇表中的字符串(即被标记为UNK的内容),可以通过以下方式高效实现,以Hugging Face Transformers库的Tokenizer为例:
核心思路
利用Tokenizer的分词结果和偏移映射(offset mapping)功能,精准定位被标记为未知token(UNK)的原始文本片段,批量收集并去重。
代码实现
from transformers import AutoTokenizer # 加载你的预训练Tokenizer,替换为实际模型名 tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese") def collect_unknown_tokens(corpus, tokenizer): unknown_strings = set() unk_token = tokenizer.unk_token for text in corpus: # 获取分词结果及每个token对应的原始文本偏移量 encoding = tokenizer(text, return_offsets_mapping=True, truncation=False) tokens = encoding.tokens() offsets = encoding["offset_mapping"] # 遍历分词结果,找出所有UNK对应的原始文本片段 for tok, (start, end) in zip(tokens, offsets): if tok == unk_token and start != end: # 排除空偏移的情况 unknown_str = text[start:end] unknown_strings.add(unknown_str) return unknown_strings # 示例使用:假设corpus是你的语料列表 # corpus = ["示例文本1包含未登录词", "示例文本2包含另一个未登录词"] # unknown_tokens = collect_unknown_tokens(corpus, tokenizer)
补充说明
- 去重与筛选:收集到的未知字符串会自动通过集合去重,你还可以根据出现频率进一步筛选(比如只保留出现次数≥5的token),避免添加过多低频token增加模型负担。
- 添加新token并调整模型:得到目标token后,可通过以下步骤添加到Tokenizer并更新模型embedding:
new_tokens = list(unknown_strings) # 向Tokenizer添加新token tokenizer.add_tokens(new_tokens) # 调整预训练模型的embedding层大小(需对应你的模型) from transformers import AutoModelForSequenceClassification model = AutoModelForSequenceClassification.from_pretrained("bert-base-chinese") model.resize_token_embeddings(len(tokenizer))
- 其他场景适配:如果你的Tokenizer不是基于Hugging Face的,核心逻辑依然通用——只需找到分词后标记为UNK的结果,再映射回原始文本片段即可。
内容的提问来源于stack exchange,提问作者jupyter
相关产品推荐
相关产品推荐

