Sentence Transformers を使用したプレイリストジェネレーターの構築

TL;DR

Hugging Face は、Sentence Transformers を使用して歌詞埋め込みに対する意味検索を行い、マルチステップの Gradio アプリケーションでラップしたプレイリストジェネレーターの構築方法を詳しく説明しています。このプロジェクトは、事前学習済みの埋め込みモデルを利用して、カスタムモデルのトレーニングを必要とせずにユーザーのテキストプロンプトと関連する楽曲コンテンツをマッチさせる方法を示しています。

Sentence Transformers を使用した意味検索

プレイリストジェネレーターの核心機能は、意味検索を可能にするために文の埋め込みを生成することに依存しています。キーワードのマッチングではなく、システムはユーザーのプロンプトと意味が類似した楽曲を特定します。

モデルの選択と実装

このプロジェクトでは、sentence-transformers/msmarco-MiniLM-L-6-v3 モデルを選択しました。このモデルは MS MARCO ファミリーの一部で、Bing 検索エンジンのクエリで訓練され、さまざまなドメインで高い性能を発揮します。

長文テキストの取り扱い:詩節のチャンク化

埋め込みモデルには最大入力シーケンス長(この場合は 512 ワードピース)があるため、楽曲全体はしばしばモデルの容量を超えて切り捨てられます。これを解決するために、歌詞をより小さなチャンク、具体的には詩節に分割し、各詩節を個別に埋め込みます。このアプローチにより、検索の精度が向上し、モデルが楽曲の全内容を処理できるようになります。

埋め込みの生成と保存

埋め込みは Sentence Transformers モデルの .encode() メソッドを使用して生成されます。この実装では、生成された埋め込みは pickle ファイルとして保存され、アクセスしやすいように Hugging Face Hub 上のデータセットとしてホストされています。

検索の実行

関連する楽曲を見つけるために、システムは util.semantic_search を使用して、ユーザーのプロンプトの埋め込みと事前に生成された詩節埋め込みのコーパスを比較します。十分な数の異なる楽曲が返されるように、top_k パラメータは 20 に設定されており、同じ楽曲の重複詩節を除外した後でも通常は少なくとも 9 曲のユニークな楽曲が得られます。

Gradio を使用したマルチステップインターフェースの構築

このアプリケーションは Gradio Blocks API を使用して、あるアクションの出力が次のアクションに反映される非線形のマルチステップユーザー体験を作り出します。

アプリケーションのワークフロー

  1. Input: ユーザーは gr.TextArea にテキストプロンプトを入力するか、例を選択します。
  2. Trigger: gr.Buttongenerate_playlist 関数をトリガーします。
  3. Processing: 関数はプロンプトをエンコードし、詩節埋め込みに対して意味検索を実行します。
  4. Output: 結果は gr.Radio コンポーネントを通じて返され、.update() メソッドを使用して動的に更新され、特定された楽曲名が表示されます。
  5. Inspection: ユーザーはラジオオプションから楽曲を選択し、歌詞を閲覧できます。

データ統合

アプリは起動時に hf_hub_download を使用して、詩節埋め込み、楽曲マッピング、歌詞などの必要なデータを Hugging Face データセットから直接ロードします。

今後の拡張とリソース

プロジェクトの作者は、ツールの機能を拡張するためのいくつかの潜在的な方向性を示しています:

  • Spotify Integration: プレイリストを自動生成し、埋め込みプレーヤーで即座に再生できるようにする。
  • Visual Feedback: HighlightedText Gradio コンポーネントを使用して、どの詩節が意味マッチを引き起こしたか正確に示す。
  • Embedding Visualization: 埋め込み空間の視覚的表現を作成し、楽曲間の関係をよりよく理解する。

Sources