-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgetTrackInfo.py
More file actions
133 lines (112 loc) · 4.08 KB
/
Copy pathgetTrackInfo.py
File metadata and controls
133 lines (112 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
import h5py
import os
import numpy as np
import argparse
import sys
try:
sys.path.append('./PythonSrc/')
import hdf5_getters as getter
except:
print 'No PythonSrc Directory Found'
# Gets wanted info about song from db info
def getInfo(files, genres, songs, topicNum):
# Checks to see db song is in out subset, then adds it
# Not the most efficient method
infoList = np.zeros(topicNum+4)
for fil in files:
for song in songs:
if fil.split('/')[-1].split('.')[0] == song[1].split('/')[-1].split('.')[0]:
curFile = getter.open_h5_file_read(fil)
tid = fil.split('/')[-1].split('.')[0]
curArtist = getter.get_artist_name(curFile)
curTitle = getter.get_title(curFile)
curArr = np.array([tid, curArtist, curTitle])
infoList = np.vstack([infoList, np.hstack([curArr, genres[tid], song[2:]])])
curFile.close()
return infoList[1:]
'''
Create a tsv file which orders how strong each topic is for each song
File will look like:
tid, artist, song, genre*|genre2*, 'most relevant topic model # | number' ->
'least relevant topic model number | number'
|genre2 will only appear if applicable
'''
def orderInfo(data, topicNum):
orderedTracks = np.zeros(topicNum+4).astype(str)
for track in data:
nums = np.array(track[4:], dtype=float)
order = np.argsort(nums)[::-1]
cur = [str(int(x)) + '|' + str(nums[int(x)]) for i,x in enumerate(order)]
orderedTracks = np.vstack([orderedTracks, np.hstack([track[:4],cur])])
return orderedTracks[1:]
def createRelationCsv(info):
genres = []
topics = []
for data in info:
genres.append(data[3].split('|')[0])
topics.append(int(data[4].split('|')[0]))
return np.vstack([genres, topics]).T
# Saves data to a tsv file, using the given filename and array
def saveData(fName, dat):
with open(fName+'.tsv', 'w') as f:
np.savetxt(f, dat, delimiter='\t', fmt="%s")
print '%s created' %(fName)
def main():
# Set up stuffs
parser = argparse.ArgumentParser()
parser.add_argument('--num-topics', dest='topicNum')
parser.add_argument('--subset-loc', dest='dirName')
parser.add_argument('--song-topics-file', dest='songs')
parser.add_argument('--getter-loc', dest='getterLoc')
parser.add_argument('--genre-file', dest='genreFile')
parser.add_argument('--save-unordered', dest='saveUnordered')
args = parser.parse_args()
if args.topicNum:
topicNum = int(args.topicNum)
else:
print 'Error: num-topics needed'
return
if args.dirName:
dirName = args.dirName
else:
dirName = '../db_data/subset/'
files = [dirName + fil for fil in os.listdir(dirName) if fil.endswith('.h5')]
if args.songs:
songs = np.genfromtxt(args.songs, dtype=str)
else:
songs = np.genfromtxt('song_topic_data.txt', dtype=str)
if args.getterLoc:
sys.path.append(args.getterLoc)
import hdf5_getters as getter
if args.genreFile:
genreFile = args.genreFile
else:
genreFile = '../db_data/msd_tagtraum_cd2.cls'
genreDict = {}
with open(genreFile) as t:
genreData = t.readlines()
for line in genreData:
d = [x.strip('\n') for x in line.split('\t')]
vals = '|'.join(d[1:])
genreDict[d[0]] = vals
if args.saveUnordered:
saveUnordered = args.saveUnordered
else:
saveUnordered = False
# Get array of song tid, artick, track and save it
infos = getInfo(files, genreDict, songs, topicNum)
if saveUnordered:
saveData('cleanTopicData', infos)
# Order information by topic relevancy and save it
ordered = orderInfo(infos, topicNum)
saveData('orderedTopicModel', ordered)
yn = raw_input('Create Genre -> Topic csv (y or n): ')
print yn
if yn == 'y':
topicRelation = createRelationCsv(ordered)
saveData('genreTopicRelation', topicRelation)
else:
return
if __name__=='__main__':
main()