駆け出しエンジニアの作業ノート

駆け出しエンジニアが作業ノート風にまとめるページ(関係無い事もしばしば)

日本語表記とローマ字表記の変換が難しい

SpotifyAPIを叩いて曲を取得していますが、返ってくるレスポンスにクセがありました。アーティスト名は英語で返ってきており、曲名は日本語で返ってきているのです。

 

問答無用で最初に上がってきた曲を入れれば良いという案もありますが、これでは、配信していないアーティストの場合オルゴール曲が入ってしまうので、適切ではありません。

 

import spotipy
import re
import connect_lastfm_api
import connect_sandbox
import lev_distance
from spotify_token import Spotify_token

api_key =
username =

def input_artist():
#artist = input("検索したいアーティスト名を入力して下さい")
artist = "乃木坂46"
page = 1
search_song_list(artist, page)

def search_song_list(artist, page):
list = connect_lastfm_api.get_search_song_list(artist, api_key, page)
for i in range(len(list)):
song_list = list[i]
song = song_list["name"]
print(song)
#yes_or_no = input("この中に探したい曲はありましたか?(y/n)")
yes_or_no = "y"
if yes_or_no == "y":
search_track(artist)
elif yes_or_no == "n":
page = page + 1
search_song_list(artist, page)
else:
print("正しい入力ではありません")

def search_track(artist):
#song = input("曲名を入力して下さい")
song = "制服のマネキン"
create_playlist(artist, song)

def create_playlist(artist, song):
playlist = []
first_input = (artist, song)
playlist.append(first_input)
count = 0
genarate_playlist(artist, song, playlist, first_input, count)

def genarate_playlist(artist, song, playlist, first_input, count):
similar_track_list = connect_lastfm_api.get_similar_track(artist, song, api_key)
print(similar_track_list)
playlist_limit = 15
if len(similar_track_list) == 0:
track = (artist, song)
if track in playlist:
pass
else:
playlist.append(track)
if len(playlist) >= playlist_limit:
print(playlist)
get_empty_Spotify_playlist(first_input, playlist)
else:
page = 1
try:
list = connect_lastfm_api.get_search_song_list(artist, api_key, page)
song_list = list[count]
song = song_list["name"]
count = count + 1
genarate_playlist(artist, song, playlist, first_input, count)
except KeyError:
artist = connect_lastfm_api.similar_artist_search(artist, api_key)
count = 0
genarate_playlist(artist, song, playlist, first_input, count)
except IndexError:
artist = connect_lastfm_api.similar_artist_search(artist, api_key)
count = 0
genarate_playlist(artist, song, playlist, first_input, count)
else:
recent_track_list = connect_lastfm_api.recent_play_song(api_key)
print(recent_track_list)
for i in range(len(similar_track_list)):
track = similar_track_list[i]
if len(playlist) >= playlist_limit:
break
elif track in playlist:
continue
elif track in recent_track_list:
continue
else:
playlist.append(track)
if len(playlist) < playlist_limit:
search_data = playlist[len(playlist)-1]
artist = search_data[0]
song = search_data[1]
count = count + 1
genarate_playlist(artist, song, playlist, first_input, count)
else:
print(playlist)
get_empty_Spotify_playlist(first_input, playlist)

def get_empty_Spotify_playlist(first_input, playlist):
playlist_name = first_input[0] + "の" + first_input[1] + "から始まるおすすめプレイリスト"
ST = Spotify_token(username)
token = ST.set()
sp = spotipy.Spotify(auth=token)
sp.trace = False
playlistts = sp.user_playlist_create(username, playlist_name)
playlist_id = playlistts["id"]
song_ids = []
not_append_list = []
for i in range(len(playlist)):
search_str = playlist[i]
s_artist = search_str[0]
s_song = search_str[1]
search_str = s_artist + " " + s_song
result = sp.search(search_str, limit=1)
similar_artist_list = connect_sandbox.get_similar_artist_list(s_artist, api_key)
for item in result["tracks"]["items"]:
print(item)
artist_url = item["artists"][0]
artist_url = artist_url["external_urls"]["spotify"]
print(artist_url)
api_artist = item["artists"][0]["name"]
print(api_artist)
api_song = item["name"]
api_song = re.sub("\t", "", api_song)
print(api_song)
if api_artist == s_artist:
print("OK")
song_id = item["id"]
song_ids.append(song_id)
elif api_artist in similar_artist_list:
if api_song == s_song:
print("OK")
song_id = item["id"]
song_ids.append(song_id)
else:
not_append_song = (s_artist, s_song)
not_append_list.append(not_append_song)
else:
word_distance = lev_distance.calc_distance(api_artist, s_artist)
if word_distance > 9:
not_append_song = (s_artist, s_song)
not_append_list.append(not_append_song)
else:
print("OK")
song_id = item["id"]
song_ids.append(song_id)
playlist_input(playlist_id, song_ids, not_append_list)

def playlist_input(playlist_id, song_ids, not_append_list):
ST = Spotify_token(username)
token = ST.set()
if token:
sp = spotipy.Spotify(auth=token)
sp.trace = False
results = sp.user_playlist_add_tracks(username, playlist_id, song_ids)
print(results)
if len(not_append_list) != 0:
print("以下のリストの曲はSpotifyで配信されていないか、入力されたキーワードが違う可能性があります。")
print(not_append_list)
else:
print("Can't get token for", username)

if __name__ == '__main__':
input_artist()

 

SpotifyAPIから返ってくるレスポンスのアーティスト名と、実際に調べたいアーティスト名のレーベンシュタイン距離を測り、そのスコアで分類しようと考えました。

 

実際のレーベンシュタイン距離の計算は以下の本を参考にしました。

 

 

しかし、結果として特に個人名のローマ字から漢字表記の距離が長く、短い距離でオルゴール曲が混ざってしまう事がわかり、残念ながら使えない事が判明しました。

 

一つ一つ、DBに登録して変換させるように対応しないといけないかもしれないですね…