如何从huggingface的特征提取管道中获取整个句子的嵌入?
我知道如何获取每个标记的特征(如下所示),但如何获取整个句子的整体特征呢?
feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")features = feature_extraction("i am sentence")
回答:
为了进一步解释我在stackoverflowuser2010的回答下留的评论,我将使用“基本”模型,但其行为与pipeline
组件相同。
BERT及其衍生模型(包括你在管道中使用的DistilRoberta)通常使用特殊标记(通常第一个标记表示为[CLS]
)来指示句子的开始和结束,这些标记通常是针对整个序列进行预测/生成嵌入的最简单方法。社区内关于哪种方法更优越存在讨论(另见stackoverflowuser2010的更详细回答这里),然而,如果你只是想要一个“快速”的解决方案,那么取[CLS]
标记无疑是一种有效的策略。
现在,虽然FeatureExtractionPipeline
的文档不是很清晰,但在你的例子中,我们可以轻松地比较输出,特别是它们的长度,与直接调用模型进行比较:
from transformers import pipeline, AutoTokenizer# 直接编码样本句子tokenizer = AutoTokenizer.from_pretrained('distilroberta-base')encoded_seq = tokenizer.encode("i am sentence")# 你的方法feature_extraction = pipeline('feature-extraction', model="distilroberta-base", tokenizer="distilroberta-base")features = feature_extraction("i am sentence")# 比较输出长度print(len(encoded_seq)) # 5# 注意输出有一个奇怪的列表输出,需要用0索引。print(len(features[0])) # 5
当检查encoded_seq
的内容时,你会注意到第一个标记的索引为0
,表示序列开始标记(在我们的例子中,是嵌入标记)。由于输出长度相同,你可以通过类似以下方式简单地访问初步的句子嵌入:
sentence_embedding = features[0][0]