Files
2017-06-16 09:33:38 +08:00

103 lines
2.9 KiB
Python

import json
import numpy as np
import os
from PIL import Image
from keras.layers import Embedding
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
EMBEDDING_DIM = 50
tokenizer = Tokenizer()
def load_data(path):
f = open(path, 'r')
data = []
for l in f:
jn = json.loads(l)
s = jn['sentence']
idn = jn['identifier']
la = int(jn['label'] == 'true')
data.append([idn, s, la])
return data
def init_tokenizer(sdata):
texts = [t[1] for t in sdata]
tokenizer.fit_on_texts(texts)
def tokenize_data(sdata, mxlen):
texts = [t[1] for t in sdata]
seqs = tokenizer.texts_to_sequences(texts)
seqs = pad_sequences(seqs, mxlen)
data = {}
for k in range(len(sdata)):
data[sdata[k][0]] = [seqs[k], sdata[k][2]]
return data
def load_images(path, sdata, debug=False):
data = {}
cnt = 0
N = 1000
for lists in os.listdir(path):
p = os.path.join(path, lists)
for f in os.listdir(p):
cnt += 1
if debug and cnt > N:
break
im_path = os.path.join(p, f)
im = Image.open(im_path)
im = im.convert('RGB')
im = im.resize((200, 50))
im = np.array(im)
idf = f[f.find('-') + 1:f.rfind('-')]
data[f] = [im] + sdata[idf]
ims, ws, labels = [], [], []
for key in data:
ims.append(data[key][0])
ws.append(data[key][1])
labels.append(data[key][2])
data.clear()
idx = np.arange(0, len(ims), 1)
np.random.shuffle(idx)
ims = [ims[t] for t in idx]
ws = [ws[t] for t in idx]
labels = [labels[t] for t in idx]
ims = np.array(ims, dtype=np.float32)
ws = np.array(ws, dtype=np.float32)
labels = np.array(labels, dtype=np.float32)
return ims, ws, labels
def get_embeddings_index():
embeddings_index = {}
path = r'C:\local\word2vec\glove.6B.50d.txt'
f = open(path, 'r', errors='ignore')
for line in f:
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
return embeddings_index
def get_embedding_matrix(word_index, embeddings_index):
embedding_matrix = np.zeros((len(word_index) + 1, EMBEDDING_DIM))
for word, i in word_index.items():
embedding_vector = embeddings_index.get(word)
if embedding_vector is not None:
# words not found in embedding index will be all-zeros.
embedding_matrix[i] = embedding_vector
return embedding_matrix
def embedding_layer(word_index, embedding_index, sequence_len):
embedding_matrix = get_embedding_matrix(word_index, embedding_index)
return Embedding(len(word_index) + 1,
EMBEDDING_DIM,
weights=[embedding_matrix],
input_length=sequence_len,
trainable=False)