使用句子转换器构建播放列表生成器
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 创建了一个非线性、多步骤的用户体验,其中一个操作的输出会影响后续操作。
应用工作流
- Input:用户在
gr.TextArea中输入文本提示或选择示例。 - Trigger:
gr.Button触发generate_playlist函数。 - Processing:函数对提示进行编码,并在段落嵌入上执行语义搜索。
- Output:结果通过
gr.Radio组件返回,使用.update()方法动态更新,以显示识别出的歌曲名称。 - Inspection:用户随后可从单选项中选择歌曲以查看其歌词。
数据集成
应用在启动时使用 hf_hub_download 直接从 Hugging Face 数据集加载必要的数据——包括段落嵌入、歌曲映射和歌词。
未来改进与资源
项目作者指出了若干可用于扩展工具功能的潜在方向:
- Spotify 集成:自动生成播放列表,并使用嵌入式播放器实现即时收听。
- 可视化反馈:使用
HighlightedTextGradio 组件显示到底是哪一段触发了语义匹配。 - 嵌入可视化:创建嵌入空间的可视化表示,以更好地理解歌曲之间的关系。