如何使用转换器模型获取词汇表外单词的词嵌入?

数据挖掘 nlp 变压器 斯坦福-nlp 标记化 拥抱脸
2022-02-19 13:53:39

当我尝试使用 bio_clinical bert 获取句子的词嵌入时,对于 8 个单词的句子,我得到 11 个标记 id(+start 和 end),因为“embeddings”是词汇表外的单词/标记,它被拆分为em,床,丁,s。

我想知道除了对这些向量进行平均之外,是否有任何可用的聚合策略有意义。

from transformers import AutoTokenizer, AutoModel
# download and load model
tokenizer = AutoTokenizer.from_pretrained("emilyalsentzer/Bio_ClinicalBERT")
model = AutoModel.from_pretrained("emilyalsentzer/Bio_ClinicalBERT")

sentences = ['This framework generates embeddings for each input sentence']


#Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, max_length=128, return_tensors='pt')


#Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)

print(encoded_input['input_ids'].shape)

输出:torch.Size([1, 13])

for token in encoded_input['input_ids'][0]:
  print(tokenizer.decode([token]))

输出:

[CLS]
this
framework
generates
em
##bed
##ding
##s
for
each
input
sentence
[SEP]
1个回答

我不确定是否需要聚合,或者换句话说,您可能存在管道不匹配。BERT 句子标记化专门用于传递给一些下游管道,目的是使句子事物能够迎合 OOV 单词。通过聚合句子标记,您可能会失去在以后的管道中迎合 OOV 的好处。

如果您正在寻找整个词向量标记,并且想要使用 OOV 词,我建议您改用 FastText。该算法或多或少地使用子词,并且它还将通过在自定义训练步骤期间聚合该 OOV 词的子词信息来为 OOV 词构建标记。这样做的好处是聚合步骤不必是管道的一部分,您可以在任何下游任务中使用这些新向量(当然,接受 BERT 句子标记的管道除外)