使用句子转换器构建播放列表生成器

TL;DR

Hugging Face 详细介绍了一个使用 Sentence Transformers 对歌曲歌词嵌入进行语义搜索的播放列表生成器的构建过程,该生成器封装在一个多步骤的 Gradio 应用中。该项目展示了如何利用预训练的嵌入模型,将用户的文本提示匹配到相关的歌曲内容,而无需进行自定义模型训练。

使用句子转换器进行语义搜索

播放列表生成器的核心功能依赖于生成句子嵌入以实现语义搜索。系统不是匹配关键词,而是识别出与用户提示意义相似的歌曲。

模型选择与实现

本项目选择了 sentence-transformers/msmarco-MiniLM-L-6-v3 模型。该模型属于 MS MARCO 系列,使用 Bing 搜索引擎查询进行训练,在多个领域表现良好。

使用段落分块处理长文本

由于嵌入模型对输入序列长度有限制(本例为 512 个词片),整首歌曲往往超出模型容量并被截断。为了解决此问题,歌词被拆分为更小的块——具体为段落(verse),并对每个段落单独进行嵌入。此方法确保搜索更准确,并且模型能够处理歌曲的完整内容。

生成并存储嵌入

嵌入使用 Sentence Transformers 模型的 .encode() 方法生成。在本实现中,生成的嵌入被保存为 pickle 文件,并作为数据集托管在 Hugging Face Hub 上,以便访问。

执行搜索

为了找到相关歌曲,系统使用 util.semantic_search 将用户提示的嵌入与预先生成的段落嵌入语料库进行比较。为确保返回足够数量的不同歌曲,top_k 参数设置为 20,通常在去除同一歌曲的重复段落后能够得到至少 9 首独特的歌曲。

使用 Gradio 构建多步骤界面

该应用使用 Gradio Blocks API 创建了一个非线性、多步骤的用户体验,其中一个操作的输出会影响后续操作。

应用工作流

  1. Input:用户在 gr.TextArea 中输入文本提示或选择示例。
  2. Triggergr.Button 触发 generate_playlist 函数。
  3. Processing:函数对提示进行编码,并在段落嵌入上执行语义搜索。
  4. Output:结果通过 gr.Radio 组件返回,使用 .update() 方法动态更新,以显示识别出的歌曲名称。
  5. Inspection:用户随后可从单选项中选择歌曲以查看其歌词。

数据集成

应用在启动时使用 hf_hub_download 直接从 Hugging Face 数据集加载必要的数据——包括段落嵌入、歌曲映射和歌词。

未来改进与资源

项目作者指出了若干可用于扩展工具功能的潜在方向:

  • Spotify 集成:自动生成播放列表,并使用嵌入式播放器实现即时收听。
  • 可视化反馈:使用 HighlightedText Gradio 组件显示到底是哪一段触发了语义匹配。
  • 嵌入可视化:创建嵌入空间的可视化表示,以更好地理解歌曲之间的关系。

Sources