我正在尝试使用来自SBERT.net的SentenceTransformer
模型,我想了解它是如何处理实体名称的。它们是否被标记为未知词 – 是否被分解成词元等。我希望确保它们在比较中被使用。
然而,要做到这一点,我需要查看它为查询构建的词汇表 – 甚至可能需要将嵌入转换为文本。
查看API – 对我来说并不明显如何做到这一点。
这里是他们文档中的一个快速示例:
embedder = SentenceTransformer("all-MiniLM-L6-v2")corpus = [ "A man is eating food.", "A man is eating a piece of bread.", "The girl is carrying a baby."]corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)# Query sentences:queries = [ "A man is eating pasta."]top_k = min(5, len(corpus))for query in queries: query_embedding = embedder.encode(query, convert_to_tensor=True) ...
回答:
您的SentenceTransformer
模型实际上是在内部使用Hugging Face的transformers
库中的分词器。您可以通过模型的.tokenizer
属性访问它。这种分词器的典型行为是将未知词元分解成词片。我们可以继续检查它确实是这样做的,因为这相对简单:
embedder = SentenceTransformer("all-MiniLM-L6-v2")corpus = [ "A man is eating food.", "A man is eating a piece of bread.", "The girl is carrying a baby."]# 分词器就在这里:tokenizer = embedder.tokenizer # BertTokenizerFast# 如果需要,词汇表本身就在这里:vocab = tokenizer.vocab # 长度为30522的字典# 根据词汇表获取句子的分词,例如:inputs = tokenizer(corpus, padding='longest', truncation=True)tokens = [e.tokens for e in inputs.encodings]# tokens包含:# [# ['[CLS]', 'a', 'man', 'is', 'eating', 'food', '.', '[SEP]', '[PAD]', '[PAD]', '[PAD]']# ['[CLS]', 'a', 'man', 'is', 'eating', 'a', 'piece', 'of', 'bread', '.', '[SEP]']# ['[CLS]', 'the', 'girl', 'is', 'carrying', 'a', 'baby', '.', '[SEP]', '[PAD]', '[PAD]']# ]# 现在让我们尝试一些未知词元,看看它会做什么queries = [ "Edv Beq is eating pasta."]q_inputs = tokenizer(queries, padding='longest', truncation=True)q_tokens = [e.tokens for e in q_inputs.encodings]# q_tokens包含:# [# ['[CLS]', 'ed', '##v', 'be', '##q', 'is', 'eating', 'pasta', '.', '[SEP]']# ]