问题描述
我使用XLM-RoBERTa令牌生成器来获取一堆句子的ID,例如:
["loving is great","This is another example"]
我看到返回的ID并不总是等于句子中用空格分隔的标记的数量:例如,第一句对应于[[0,459,6496,83,6782,2]]
,其中loving
是{{1 }}和456
。从ID中获取单词嵌入的矩阵后,我试图仅识别与某些特定标记相对应的那些单词嵌入/矢量:有没有办法做到这一点?如果有时为原始令牌分配了多个ID,并且无法预测,那么我看不出这是怎么可能的。
总的来说,我的任务是获取句子中某些特定标记的词嵌入:因此,我的目标是首先使用该句子,以便可以在语法上下文中计算单个标记的词嵌入,但随后我会喜欢只识别/保留句子中某些特定标记的向量,而不是所有标记的向量。
解决方法
令牌和ID之间的映射是唯一的,但是,在获得令牌(在本例中为子字)ID之前,文本会被细分为子字。
您可以找到ID所属的字符串:
import transformers
tok = transformers.AutoTokenizer.from_pretrained("xlm-roberta-base")
tok.convert_ids_to_tokens([459,6496])
您将获得:['▁lo','ving']
,它显示了第一个单词的实际预处理方式。
预处理将所有内容拆分为空格,并在第一个令牌之前加上所有带有▁
符号的空格。在第二步中,它将外出词汇的标记分成单词中有ID的子单词。