目次
はじめに
新しい音楽との出会いを探すとき、どのようにアプローチするかという案の一つです。ここでは、好きな曲の歌詞から近い歌詞の曲を探してみます。機械学習を用いた新しい曲との出会いについては、関連記事を参照ください。
自分好みの音楽を機械学習で探す | BirmanNet
はじめに 音楽のサブスクリプションサービスもの普及もあり、現在では多種多様な音楽をいつでも聴くことができるようになりました。ただその反面、新しい楽曲の中から自分…
指定した曲から類似の曲を探すサンプルコード
シンプルなケースとして以下の仕様を考えてみます。
- 好きな歌のタイトルを入力する
- LyricsGeniusを使って歌詞全文を自動で取得する
- その歌詞全文をnltkで感情分析、gensimとfugashiで主題分析を行い、キーワード抽出する
- キーワードからLyricsGeniusを使って検索し、近い曲の候補を抽出する(例えば10件)
- 候補10件に対して感情分析、主題分析を行って感情や主題が共通するものを最も近い歌とする
- 最も近い歌のタイトルを提案する。
コードは以下です。
import nltk
from nltk.sentiment import SentimentIntensityAnalyzer
from gensim import corpora, models
from fugashi import Tagger
from lyricsgenius import Genius
# 初期化
genius = Genius("あなたの-genius-アクセストークン")
sia = SentimentIntensityAnalyzer()
tagger = Tagger()
# 曲のタイトルを入力
song_title = input("好きな曲のタイトルを入力してください: ")
# 歌詞を取得
song = genius.search_song(song_title)
lyrics = song.lyrics
# 感情分析
sentiment = sia.polarity_scores(lyrics)
# 主題分析とキーワード抽出
words = [word.surface for word in tagger.parse(lyrics)]
dictionary = corpora.Dictionary([words])
corpus = [dictionary.doc2bow(words)]
lda_model = models.LdaModel(corpus, num_topics=1, id2word=dictionary)
keywords = [dictionary[id] for id, _ in lda_model.get_topic_terms(0)]
# 類似曲を検索
similar_songs = genius.search_songs(" ".join(keywords))[:10]
# 類似曲を分析
similarities = []
for similar_song in similar_songs["hits"]:
similar_lyrics = genius.search_song(similar_song["result"]["title"]).lyrics
similar_sentiment = sia.polarity_scores(similar_lyrics)
similar_words = [word.surface for word in tagger.parse(similar_lyrics)]
similar_corpus = [dictionary.doc2bow(similar_words)]
similar_lda_model = models.LdaModel(similar_corpus, num_topics=1, id2word=dictionary)
similar_keywords = [dictionary[id] for id, _ in similar_lda_model.get_topic_terms(0)]
similarities.append((similar_song["result"]["title"], similar_sentiment, similar_keywords))
# 最も類似した曲を見つける
most_similar_song = max(similarities, key=lambda x: (x[1]["compound"], len(set(keywords) & set(x[2]))))
# 最も類似した曲を提案する
print("最も類似した曲は:", most_similar_song[0])
Geniusについてはユーザー登録を行ってAPIキーを取得する必要があります。
まとめ
本記事では好きな曲を探す方法の一つとして、自然言語解析の方法を使って主題分析と感情分析を行って検索キーを生成する方法について考えました。歌詞のデータベースを作って探索するほうが精度が高くなることは間違いないのですが、権利の問題もあり検索キーの生成というアプローチにしています。音楽をテーマにしていますが文書検索でも同様のアプローチで近い文書を探せるはずです。小説の検索などにもいかせそうです。