-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrnn_embed.py
More file actions
86 lines (77 loc) · 2.89 KB
/
Copy pathrnn_embed.py
File metadata and controls
86 lines (77 loc) · 2.89 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
from numpy import asarray
from numpy import zeros
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Embedding
from keras.layers import Activation
from keras.layers import TimeDistributed
import numpy as np
import pandas as pd
# define documents
train_data = pd.read_csv('chosen_train.csv',sep='|')
dev_data = pd.read_csv('chosen_dev.csv',sep='|')
test_data = pd.read_csv('chosen_test.csv',sep='|')
# define class labels
def getArtists():
with open('artists.txt') as f:
return f.read().splitlines()
artist_list = getArtists()
def art_id(art):
return artist_list.index(art)
def onehot(y):
ret = np.zeros((len(y),12))
for i in range(len(y)):
num = y[i]
ret[i,int(num)] = 1.0
return ret
train_y = onehot(train_data['Artist'].apply(art_id))
dev_y = onehot(dev_data['Artist'].apply(art_id))
test_y = onehot(test_data['Artist'].apply(art_id))
train_x = train_data['Lyrics'].values
dev_x = train_data['Lyrics'].values
test_x = train_data['Lyrics'].values
# prepare tokenizer
t = Tokenizer()
t.fit_on_texts(train_x)
vocab_size = len(t.word_index) + 1
# integer encode the documents
encoded_docs_train = t.texts_to_sequences(train_x)
encoded_docs_dev = t.texts_to_sequences(dev_x)
encoded_docs_test = t.texts_to_sequences(test_x)
# pad documents to a max length of 4 words
max_length = 5000
padded_trainx = pad_sequences(encoded_docs_train, maxlen=max_length)
padded_devx = pad_sequences(encoded_docs_dev, maxlen=max_length)
padded_testx = pad_sequences(encoded_docs_test, maxlen=max_length)
print(padded_trainx.shape)
# load the whole embedding into memory
embeddings_index = dict()
f = open('glove.6B.100d.txt',encoding='utf-8')
for line in f:
values = line.split()
word = values[0]
coefs = asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Loaded %s word vectors.' % len(embeddings_index))
# create a weight matrix for words in training docs
embedding_matrix = zeros((vocab_size, 100))
for word, i in t.word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
embedding_matrix[i] = embedding_vector
model = Sequential()
model.add(Embedding(vocab_size, 100, input_length=max_length,trainable=False,weights=[embedding_matrix]))
model.add(LSTM(200,return_sequences=False))
model.add(Dense(36))
model.add(Dense(12))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(padded_trainx, train_y, epochs=10, batch_size=50)
# Final evaluation of the model
scores = model.evaluate(padded_devx, dev_y, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))