python - 变压器 AutoTokenizer.tokenize 引入额外的字符
问题描述
我正在使用 HuggingFace 转换器 AutoTokenizer 来标记小段文本。但是,这种标记化在单词中间不正确地拆分并将 # 字符引入标记。我尝试了几种不同的模型,结果相同。
下面是一段文本和从中创建的标记的示例。
CTO at TLR Communications Pty Ltd
['[CLS]', 'CT', '##O', 'at', 'T', '##LR', 'Communications', 'P', '##ty', 'Ltd', '[SEP]']
这是我用来生成令牌的代码
tokenizer = AutoTokenizer.from_pretrained("tokenizer_bert.json")
tokens = tokenizer.tokenize(tokenizer.decode(tokenizer.encode(sequence)))
解决方案
这不是一个错误,而是一个特性。BERT 和其他转换器使用 WordPiece 标记化算法将字符串标记为:(1)已知单词;或 (2) 标记器词汇表中未知单词的“单词片段”。
在您的示例中,单词“CTO”、“TLR”和“Pty”不在分词器词汇表中,因此 WordPiece 将它们拆分为子词。例如,第一个子词是“CT”,另一部分是“##O”,其中“##”表示子词连接到前一个子词。
这是一个很棒的功能,可以表示任何字符串。
推荐阅读
- gallery - Fotorama缩略图滚动
- javascript - 如何在 Web 视图中隐藏 xml 元素后删除空间
- c++ - Mac Xcode 上的数论库 (NTL) - c++ - (Undefined symbols for architecture x86_64) Linker error - Apple Mach-O Linker (ld) Error Group
- c++ - 启动程序时出错:检测到 GTK+ 2.x 符号。不支持在同一进程中使用 GTK+ 2.x 和 GTK+ 3
- java - String name1 = "some name" 或 String name1 = new String("some name") 哪个更好?
- android - android 同步适配器安全异常
- c - 免费的STM32硬故障
- node.js - 如何正确使用 Promises 处理多个请求
- objective-c - [__NSCFConstantString count]:无法识别的选择器发送到实例 - GADRequest 错误或 AdMob 崩溃
- python - 如何为已编译的 Python 扩展生成 .pyi 文件?