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

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

Word2Vecでプレイリスト生成してみる実験の続き

前回、一定の成果があると見込めたので今回はデータ量を増やしてやってみました。

  

psyduck-take-it-easy.hatenablog.com

psyduck-take-it-easy.hatenablog.compsyduck-take-it-easy.hatenablog.com

 

import time
import psycopg2
import psycopg2.extras
import urllib.request
import json
import http
from gensim.models import word2vec

host_name =
port_number =
dbname =
rolename =
passwd =

def track_search():
conn = psycopg2.connect(database=dbname, host=host_name, port=port_number, user=rolename, password=passwd)
cur = conn.cursor()
cur.execute("SELECT DISTINCT from_artist, from_song FROM similar_track")
track_list = cur.fetchall()
conn.close()
return track_list

def model_dev():
track_list = track_search()
model_group = []
for i in range(len(track_list)):
track = track_list[i]
print(track)
start = time.time()
input_artist = track[0]
input_song = track[1]
api_artist = urllib.parse.quote(input_artist)
api_song = urllib.parse.quote(input_song)
api_call_url1 = "http://ws.audioscrobbler.com/2.0/?method=track.getsimilar&artist="
api_call_url2 = "&track="
api_call_url3 = "&api_key="
api_key = "6252c509f1dbb3dd744e6c16422e5175"
api_call_url4 = "&format=json"
api_call_url = api_call_url1 + api_artist + api_call_url2 + api_song + api_call_url3 + api_key + api_call_url4
try:
address_json = urllib.request.urlopen(api_call_url)
data = json.loads(address_json.read())
similartracks = data["similartracks"]
track = similartracks["track"]
similar_group = []
for i in range(len(track)):
track_infomation = track[i]
match_index = track_infomation["match"]
if match_index < 0.01:
break
song_infomation = track_infomation["name"]
artist_infomation = track_infomation["artist"]
artist_infomation = artist_infomation["name"]
input_data = input_artist + " — " + input_song
similar_group.append(input_data)
infomation_data = artist_infomation + " — " + song_infomation
similar_group.append(infomation_data)
end = time.time() - start
if end > 100:
print("timeover")
break
except KeyError:
continue
except http.client.IncompleteRead:
continue
model_group.append(similar_group)
print("modeldev")
model = word2vec.Word2Vec(model_group, size=100, min_count=1, window=5, iter=3)
model.save("similar_song.model")


if __name__ == '__main__':
model_dev()

 

 

さて、前回と一部実装を変更した箇所があります。それはDBへのアクセスです。前回はlast.fmのデータをあらかじめ保存したDBから一旦、アーティスト名と曲名のリストを取り出しそこから、もう一度DBにアクセスして、類似曲のリストを取り出していました。しかし、今回はDBから取り出すのを最初の1回のみにとどめ、類似曲のリストはその都度last.fmのデータを参照するように実装を変更し、PCへの負荷を減らすようにしました。

 

さて、ここで困った事が発生しました。モデル構築に行く前でプログラムが動かなくなってしまいました。現状、DBには類似曲が呼び出されていないものが多数あり、モデル構築中ではないことも確認しています。また、もしものために、ある秒数(今回は100秒)を経過した場合には自動的に離脱する処理を入れたつもりなのですが、上手くいっていない状況です。

 

エラーが何も出ていない状況で止まってしまうのは初めてなので、まだ解決策が浮かんでいません。皆さまのお知恵を拝借したいです。