Sentence Transformers 旨在为整个句子或段落生成密集的向量表示(嵌入),而上下文词嵌入(如 BERT 中的嵌入)则侧重于单个词。 主要区别在于它们处理语义的方式:Sentence Transformers 优化以捕获完整文本的整体意图或含义,而上下文词嵌入则强调每个词基于其周围上下文的细微含义。 对于诸如聚类或语义搜索之类的任务,Sentence Transformers 通常优于词级别的处理方法,因为它们降低了复杂性并更好地保留了句子级别的关系。
对于聚类,Sentence Transformers 通过为每个句子提供单个嵌入来简化流程,该嵌入可以直接使用余弦相似度或欧几里得距离进行比较。 相比之下,使用上下文词嵌入需要聚合单个词向量(例如,平均或最大池化)以创建句子级别的表示。 这种聚合会稀释重要的语义信号。 例如,在产品评论的数据集中,诸如“电池寿命很棒,但相机在弱光下表现不佳”之类的句子将由 Sentence Transformer 编码为反映正面和负面方面的单个向量。 对于词嵌入,对“很棒”和“不佳”的向量进行平均可能会导致误导性的中性表示,从而降低聚类的准确性。
在语义搜索中,Sentence Transformers 表现出色,因为它们经过训练可以将语义上相似的句子映射到嵌入空间中更近的位置。 例如,如果“如何重置忘记的密码”之类的搜索查询由 Sentence Transformer 编码,则该查询将与标题为“恢复您的帐户凭据”的支持文章紧密对齐。 上下文词嵌入虽然在理解词级别消歧方面功能强大(例如,区分“bank”作为金融机构与河岸),但需要额外的步骤才能将词向量组合到查询或文档表示中。 这可能会引入噪声,尤其是在处理含义相同但释义或结构不同的句子时。
从实际的角度来看,Sentence Transformers 更容易集成到管道中,因为它们消除了对自定义聚合逻辑的需求。 诸如 sentence-transformers
之类的库允许开发人员在一行代码中计算嵌入,而使用词级别嵌入则涉及分词、子词处理和手动池化。 但是,上下文词嵌入对于需要细粒度分析的任务(如命名实体识别或词性标注)仍然有用。 对于诸如聚类或搜索之类的大多数高级应用,Sentence Transformers 在准确性、简单性和性能之间取得了更好的平衡。