From 3f26adda3008c6597dfaed25e42a5315676abb83 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Sat, 19 Jan 2019 21:33:26 +0800 Subject: [PATCH 001/100] feature/bimpm-2.0 init commit from feature/bimpm --- matchzoo/contrib/layers/attention_layer.py | 154 +++++++ .../contrib/layers/multi_perspective_layer.py | 419 ++++++++++++++++++ matchzoo/contrib/models/bimpm_model.py | 187 ++++++++ requirements.txt | 2 +- 4 files changed, 761 insertions(+), 1 deletion(-) create mode 100644 matchzoo/contrib/layers/attention_layer.py create mode 100644 matchzoo/contrib/layers/multi_perspective_layer.py create mode 100644 matchzoo/contrib/models/bimpm_model.py diff --git a/matchzoo/contrib/layers/attention_layer.py b/matchzoo/contrib/layers/attention_layer.py new file mode 100644 index 00000000..a3bd0ec6 --- /dev/null +++ b/matchzoo/contrib/layers/attention_layer.py @@ -0,0 +1,154 @@ +"""An implementation of Attention Layer for Bimpm model.""" + +from keras import backend as K +from keras.engine import Layer + + +class AttentionLayer(Layer): + """ + Layer that compute attention for Bimpm model. + + For detailed information, see Bilateral Multi-Perspective Matching for + Natural Language Sentences, section 3.2. + + Reference: + https://github.com/zhiguowang/BiMPM/blob/master/src/layer_utils.py#L145-L196 + + Examples: + >>> import matchzoo as mz + >>> layer = mz.layers.AttentionLayer(att_dim=50) + + """ + + def __init__(self, + att_dim: int, + att_type: str = 'default', + remove_diagonal: bool = False, + dropout_rate: float = 0.0): + """ + class: `AttentionLayer` constructor. + + :param att_dim: int + :param att_type: int + :param remove_diagonal: bool + """ + super(AttentionLayer, self).__init__() + self._att_dim = att_dim + self._att_type = att_type + self._remove_diagonal = remove_diagonal + self._dropout_rate = dropout_rate + + @property + def att_dim(self): + """Get the attention dimension.""" + return self._att_dim + + @property + def att_type(self): + """Get the attention type.""" + return self._att_type + + def build(self, input_shapes): + """ + Build the layer. + + :param input_shapes: input_shapes + """ + if not isinstance(input_shapes, list): + raise ValueError('A attention layer should be called ' + 'on a list of inputs.') + # input_shapes[0]: batch, time_steps, d + hidden_dim_lt = input_shapes[0][2] + hidden_dim_rt = input_shapes[1][2] + self.attn_w1 = self.add_weight(name='attn_w1', + shape=(hidden_dim_lt, + self._att_dim), + initializer='uniform', + trainable=True) + if hidden_dim_lt == hidden_dim_rt: + self.attn_w2 = self.attn_w1 + else: + self.attn_w2 = self.add_weight(name='attn_w2', + shape=(hidden_dim_rt, + self._att_dim), + initializer='uniform', + trainable=True) + + self.diagonal_W = self.add_weight(name='diagonal_W', + shape=(1, + 1, + self._att_dim), + initializer='uniform', + trainable=True) + self.built = True + + def call(self, x: list, **kwargs): + """ + Calculate attention. + + :param x: [reps_lt, reps_rt] + :return attn_prob: [batch_size, len_1, len_2] + """ + + if not isinstance(x, list): + raise ValueError('A attention layer should be called ' + 'on a list of inputs.') + + reps_lt, reps_rt = x + + # [1, 1, d, 20] + attn_w1 = self.attn_w1 + attn_w1 = K.expand_dims(K.expand_dims(attn_w1, axis=0), axis=0) + # [b, s, d, -1] + reps_lt = K.expand_dims(reps_lt, axis=-1) + attn_reps_lt = K.sum(reps_lt * attn_w1, axis=2) + + # [1, 1, d, 20] + attn_w2 = self.attn_w2 + attn_w2 = K.expand_dims(K.expand_dims(attn_w2, axis=0), axis=0) + # [b, s, d, -1] + reps_rt = K.expand_dims(reps_rt, axis=-1) + attn_reps_rt = K.sum(reps_rt * attn_w2, axis=2) + + # Tanh + attn_reps_lt = K.tanh(attn_reps_lt) # [b, s, 20] + attn_reps_rt = K.tanh(attn_reps_rt) + + # diagonal_W + attn_reps_lt = attn_reps_lt * self.diagonal_W # [b, s, 20] + attn_reps_rt = K.permute_dimensions(attn_reps_rt, (0, 2, 1)) + + # [batch_size, s, s] + attn_value = K.batch_dot(attn_reps_lt, attn_reps_rt) + + # TODO(tjf) or remove: normalize + # if self.remove_diagonal: + # diagonal = K.ones([len_1], tf.float32) # [len1] + # diagonal = 1.0 - tf.diag(diagonal) # [len1, len1] + # diagonal = tf.expand_dims(diagonal, axis=0) # ['x', len1, len1] + # attn_value = attn_value * diagonal + + if len(x) == 4: + mask_lt = x[2] + mask_rt = x[3] + attn_value = attn_value * K.expand_dims(mask_lt, axis=2) + attn_value = attn_value * K.expand_dims(mask_rt, axis=1) + + # softmax + attn_prob = K.softmax(attn_value) # [batch_size, len_1, len_2] + + # if remove_diagonal: attn_value = attn_value * diagonal + if len(x) == 4: + mask_lt = x[2] + mask_rt = x[3] + attn_prob = attn_prob * K.expand_dims(mask_lt, axis=2) + attn_prob = attn_prob * K.expand_dims(mask_rt, axis=1) + + return attn_prob + + def compute_output_shape(self, input_shapes): + """Calculate the layer output shape.""" + if not isinstance(input_shapes, list): + raise ValueError('A attention layer should be called ' + 'on a list of inputs.') + return input_shapes[0][0], input_shapes[0][1], input_shapes[1][1] diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py new file mode 100644 index 00000000..6e5851de --- /dev/null +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -0,0 +1,419 @@ +"""An implementation of MultiPerspectiveLayer for Bimpm model.""" + +from keras import backend as K +from keras.engine import Layer + +from matchzoo.contrib.layers.attention_layer import AttentionLayer + + +class MultiPerspectiveLayer(Layer): + """ + A keras implementation of Bimpm multi-perspective layer. + + For detailed information, see Bilateral Multi-Perspective + Matching for Natural Language Sentences, section 3.2. + + Examples: + >>> import matchzoo as mz + >>> layer = mz.layers.MultiPerspectiveLayer(50, 20, None) + + """ + + def __init__(self, + att_dim: int, + mp_dim: int, + perspective: dict): + """Class initialization.""" + super(MultiPerspectiveLayer, self).__init__() + self._att_dim = att_dim + self._mp_dim = mp_dim + self._perspective = perspective + + @classmethod + def list_available_perspectives(cls) -> list: + """List available strategy for multi-perspective matching.""" + return ['full', 'max-pooling', 'attentive', 'max-attentive'] + + @property + def num_perspective(self): + """Get the number of perspectives that is True.""" + return sum(self._perspective.values()) + + def build(self, input_shape: list): + """Input shape.""" + # The shape of the weights is l * d. + if self._perspective.get('full'): + self.full_match = MpFullMatch(self._mp_dim) + + if self._perspective.get('max-pooling'): + self.max_pooling_match = MpMaxPoolingMatch(self._mp_dim) + + if self._perspective.get('attentive'): + self.attentive_match = MpAttentiveMatch(self._att_dim, + self._mp_dim) + + if self._perspective.get('max-attentive'): + self.max_attentive_match = MpMaxAttentiveMatch(self._att_dim) + + self.built = True + + def call(self, x: list, **kwargs): + """Call.""" + seq_lt, seq_rt = x[:5], x[5:] + # unpack seq_left and seq_right + # all hidden states, last hidden state of forward pass, + # last cell state of forward pass, last hidden state of + # backward pass, last cell state of backward pass. + lstm_reps_lt, forward_h_lt, _, backward_h_lt, _ = seq_lt + lstm_reps_rt, forward_h_rt, _, backward_h_rt, _ = seq_rt + + match_tensor_list = [] + match_dim = 0 + if self._perspective.get('full'): + # Each forward & backward contextual embedding compare + # with the last step of the last time step of the other sentence. + h_rt = K.concatenate([forward_h_rt, backward_h_rt], axis=-1) + full_match_tensor = self.full_match([lstm_reps_lt, h_rt]) + match_tensor_list.append(full_match_tensor) + match_dim += self._mp_dim + 1 + + if self._perspective.get('max-pooling'): + # Each contextual embedding compare with each contextual embedding. + # retain the maximum of each dimension. + max_match_tensor = self.max_pooling_match([lstm_reps_lt, + lstm_reps_rt]) + match_tensor_list.append(max_match_tensor) + match_dim += self._mp_dim + + if self._perspective.get('attentive'): + # Each contextual embedding compare with each contextual embedding. + # retain sum of weighted mean of each dimension. + attentive_tensor = self.attentive_match([lstm_reps_lt, + lstm_reps_rt]) + match_tensor_list.append(attentive_tensor) + match_dim += self._mp_dim + 1 + + if self._perspective.get('max-attentive'): + # Each contextual embedding compare with each contextual embedding. + # retain max of weighted mean of each dimension. + relevancy_matrix = _calc_relevancy_matrix(lstm_reps_lt, lstm_reps_rt) + max_attentive_tensor = self.max_attentive_match([lstm_reps_lt, + lstm_reps_rt, + relevancy_matrix]) + match_tensor_list.append(max_attentive_tensor) + match_dim += self._mp_dim + 1 + + mp_tensor = K.concatenate(match_tensor_list, axis=-1) + self.output_dim = match_dim + + return mp_tensor + + def compute_output_shape(self, input_shape: list): + """Compute output shape.""" + shape_a = input_shape[0] + return shape_a[0], shape_a[1], self.output_dim + + +class MpFullMatch(Layer): + """Mp Full Match Layer.""" + + def __init__(self, mp_dim): + """Init.""" + super(MpFullMatch, self).__init__() + self.mp_dim = mp_dim + + def build(self, input_shapes): + """Build.""" + input_shape = input_shapes[0] + self.built = True + + def call(self, x, **kwargs): + """Call.""" + reps_lt, rep_rt = x + reps_rt = K.expand_dims(rep_rt, 1) + # match_tensor: [batch, steps_lt, mp_dim+1] + match_tensor, match_dim = _multi_perspective_match(self.mp_dim, + reps_lt, + reps_rt) + return match_tensor + + def compute_output_shape(self, input_shape): + """Compute output shape.""" + return input_shape[0][0], input_shape[0][1], self.mp_dim + 1 + + +class MpMaxPoolingMatch(Layer): + """MpMaxPoolingMatch.""" + + def __init__(self, mp_dim): + """Init.""" + super(MpMaxPoolingMatch, self).__init__() + self.mp_dim = mp_dim + + def build(self, input_shapes): + """Build.""" + self.kernel = self.add_weight(name='kernel', + shape=(1, 1, 1, + self.mp_dim, input_shapes[0][-1]), + initializer='uniform', + trainable=True) + self.built = True + + def call(self, x, **kwargs): + """Call.""" + reps_lt, reps_rt = x + + # kernel: [1, 1, 1, mp_dim, d] + # lstm_lt -> [batch, steps_lt, 1, 1, d] + reps_lt = K.expand_dims(reps_lt, axis=2) + reps_lt = K.expand_dims(reps_lt, axis=2) + reps_lt = reps_lt * self.kernel + + # lstm_rt -> [batch, 1, steps_rt, 1, d] + reps_rt = K.expand_dims(reps_rt, axis=2) + reps_rt = K.expand_dims(reps_rt, axis=1) + + # match_tensor -> [batch, steps_lt, steps_rt, mp_dim] + match_tensor = _cosine_distance(reps_lt, reps_rt, cosine_norm=False) + max_match_tensor = K.max(match_tensor, axis=2) + return max_match_tensor + + def compute_output_shape(self, input_shape): + """Compute output shape.""" + return input_shape[0][0], input_shape[0][1], self.mp_dim + + +class MpAttentiveMatch(Layer): + """ + MpAttentiveMatch Layer. + + Reference: + https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L188-L193 + + """ + + def __init__(self, att_dim, mp_dim): + """Init.""" + super(MpAttentiveMatch, self).__init__() + self.att_dim = att_dim + self.mp_dim = mp_dim + + def build(self, input_shapes): + """Build.""" + input_shape = input_shapes[0] + self.built = True + + def call(self, x, **kwargs): + """Call.""" + reps_lt, reps_rt = x[0], x[1] + # attention prob matrix + attention_layer = AttentionLayer(self.att_dim) + attn_prob = attention_layer([reps_rt, reps_lt]) + # attention reps + reps_lt = K.batch_dot(attn_prob, reps_lt) + # mp match + attn_match_tensor, match_dim = _multi_perspective_match(self.mp_dim, + reps_lt, + reps_rt) + return attn_match_tensor + + def compute_output_shape(self, input_shape): + """Compute output shape.""" + return input_shape[0][0], input_shape[0][1], self.mp_dim + + +class MpMaxAttentiveMatch(Layer): + """MpMaxAttentiveMatch.""" + + def __init__(self, mp_dim): + """Init.""" + super(MpMaxAttentiveMatch, self).__init__() + self.mp_dim = mp_dim + + def build(self, input_shapes): + """Build.""" + input_shape = input_shapes[0] + self.built = True + + def call(self, x): + """Call.""" + reps_lt, reps_rt = x[0], x[1] + relevancy_matrix = x[2] + max_att_lt = cal_max_question_representation(reps_lt, relevancy_matrix) + max_attentive_tensor, match_dim = _multi_perspective_match(self.mp_dim, + reps_rt, + max_att_lt) + return max_attentive_tensor + + +def cal_max_question_representation(reps_lt, attn_scores): + """Return [batch_size, passage_len].""" + attn_positions = K.argmax(attn_scores, axis=2) + max_reps_lt = collect_representation(reps_lt, attn_positions) + return max_reps_lt + + +def collect_representation(representation, positions): + """ + Collect_representation. + + :param representation: [batch_size, node_num, feature_dim] + :param positions: [batch_size, neigh_num] + :return: + """ + return collect_probs(representation, positions) + + +def collect_final_step_of_lstm(lstm_representation, lengths): + """ + Collect final step of lstm. + + :param lstm_representation: [batch_size, passsage_length, dim] + :param lengths: [batch_size] + :return: [batch_size, dim] + """ + lengths = K.maximum(lengths, K.zeros_like(lengths)) + + batch_size = K.shape(lengths)[0] + # shape (batch_size) + batch_nums = K.tf.range(0, limit=batch_size) + # shape (batch_size, 2) + indices = K.stack((batch_nums, lengths), axis=1) + result = K.tf.gather_nd(lstm_representation, indices, + name='last-forwar-lstm') + # [batch_size, dim] + return result + + +def collect_probs(probs, positions): + """ + Collect Probs. + + :param probs: [batch_size, chunks_size] + :param positions: [batch_size, pair_size] + :return: + """ + batch_size = K.shape(probs)[0] + pair_size = K.shape(positions)[1] + # shape (batch_size) + batch_nums = K.arange(0, batch_size) + # [batch_size, 1] + batch_nums = K.reshape(batch_nums, shape=[-1, 1]) + # [batch_size, pair_size] + batch_nums = K.tile(batch_nums, [1, pair_size]) + + # shape (batch_size, pair_size, 2) + # alert: to solve error message + positions = K.tf.to_int32(positions) + indices = K.stack([batch_nums, positions], axis=2) + + pair_probs = K.tf.gather_nd(probs, indices) + # pair_probs = tf.reshape(pair_probs, shape=[batch_size, pair_size]) + return pair_probs + + +def _multi_perspective_match(mp_dim, reps_lt, reps_rt, + with_cosine=True, with_mp_cosine=True): + """ + The core function of zhiguowang's implementation. + + reference: + https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L207-L223 + :param mp_dim: about 20 + :param reps_lt: [batch, len, dim] + :param reps_rt: [batch, len, dim] + :param with_cosine: True + :param with_mp_cosine: True + :return: [batch, len, feature_dim*2] + """ + input_shape = K.shape(reps_lt) + batch_size = input_shape[0] + seq_length = input_shape[1] + + match_dim = 0 + match_result_list = [] + if with_cosine: + cosine_value = _cosine_distance(reps_lt, reps_rt, False) + cosine_value = K.reshape(cosine_value, [batch_size, seq_length, 1]) + match_result_list.append(cosine_value) + match_dim += 1 + + if with_mp_cosine: + mp_cosine_layer = MpCosineLayer(mp_dim) + match_tensor = mp_cosine_layer([reps_lt, reps_rt]) + match_result_list.append(match_tensor) + match_dim += mp_cosine_layer.mp_dim + + match_result = K.concatenate(match_result_list, 2) + return match_result, match_dim + + +class MpCosineLayer(Layer): + """ + Implementation of Multi-Perspective Cosine Distance. + + Reference: + https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L121-L129 + """ + + def __init__(self, mp_dim, **kwargs): + """Init.""" + self.mp_dim = mp_dim + super(MpCosineLayer, self).__init__(**kwargs) + + def build(self, input_shape): + """Build.""" + self.kernel = self.add_weight(name='kernel', + shape=(1, 1, self.mp_dim, + input_shape[0][-1]), + initializer='uniform', + trainable=True) + super(MpCosineLayer, self).build(input_shape) + + def call(self, x, **kwargs): + """Call.""" + v1, v2 = x + v1 = K.expand_dims(v1, 2) * self.kernel + v2 = K.expand_dims(v2, 2) + return _cosine_distance(v1, v2, False) + + def compute_output_shape(self, input_shape): + """Compute output shape.""" + return input_shape[0][0], input_shape[0][1], self.mp_dim + + +def _calc_relevancy_matrix(reps_lt, reps_rt): + # -> [batch_size, 1, len_lt, dim] + reps_lt = K.expand_dims(reps_lt, 1) + # -> [batch_size, len_rt, 1, dim] + in_passage_repres_tmp = K.expand_dims(reps_rt, 2) + relevancy_matrix = _cosine_distance(reps_lt, reps_rt) + return relevancy_matrix + + +def _mask_relevancy_matrix(relevancy_matrix, question_mask, passage_mask): + # relevancy_matrix: [batch_size, passage_len, question_len] + # question_mask: [batch_size, question_len] + # passage_mask: [batch_size, passsage_len] + if question_mask is not None: + relevancy_matrix = relevancy_matrix * K.expand_dims(question_mask, 1) + relevancy_matrix = relevancy_matrix * K.expand_dims(passage_mask, 2) + return relevancy_matrix + + +def _cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): + """ + Only requires `K.sum(v1 * v2, axis=-1)`. + + :param v1: [batch, time_steps(v1), 1, l, d] + :param v2: [batch, 1, time_steps(v2), l, d] + :param cosine_norm: True + :param eps: 1e-6 + :return: [batch, time_steps(v1), time_steps(v2), l] + """ + cosine_numerator = K.sum(v1 * v2, axis=-1) + if not cosine_norm: + return K.tanh(cosine_numerator) + v1_norm = K.sqrt(K.maximum(K.sum(K.square(v1), axis=-1), eps)) + v2_norm = K.sqrt(K.maximum(K.sum(K.square(v2), axis=-1), eps)) + return cosine_numerator / v1_norm / v2_norm diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py new file mode 100644 index 00000000..44ef2f18 --- /dev/null +++ b/matchzoo/contrib/models/bimpm_model.py @@ -0,0 +1,187 @@ +"""Bimpm.""" + +from keras.models import Model +from keras.layers import Dense, Concatenate, Dropout +from keras.layers import Bidirectional, LSTM + +from matchzoo import engine +from matchzoo.contrib.layers.multi_perspective_layer import MultiPerspectiveLayer + + +class BimpmModel(engine.BaseModel): + """ + BimpmModel. + + Examples: + >>> import matchzoo as mz + >>> model = mz.models.BimpmModel() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.build() + + """ + + @classmethod + def get_default_params(cls) -> engine.ParamTable: + """:return: model default parameters.""" + params = super().get_default_params(with_embedding=True) + params['optimizer'] = 'adam' + + params.add(engine.Param('dim_word_embedding', 50)) + # TODO(tjf): remove the unused params in the final version + params.add(engine.Param('dim_char_embedding', 50)) + params.add(engine.Param('word_embedding_mat')) + params.add(engine.Param('char_embedding_mat')) + params.add(engine.Param('embedding_random_scale', 0.2)) + params.add(engine.Param('activation_embedding', 'softmax')) + + # Bimpm Setting + params.add(engine.Param('perspective', {'full': True, + 'max-pooling': True, + 'attentive': True, + 'max-attentive': True})) + params.add(engine.Param('mp_dim', 20)) + params.add(engine.Param('att_dim', 20)) + params.add(engine.Param('hidden_size', 128)) + params.add(engine.Param('dropout_rate', 0.0)) + params.add(engine.Param('w_initializer', 'glorot_uniform')) + params.add(engine.Param('b_initializer', 'zeros')) + params.add(engine.Param('activation_hidden', 'linear')) + + params.add(engine.Param('with_match_highway', False)) + params.add(engine.Param('with_aggregation_highway', False)) + + return params + + # @classmethod + # def get_default_preprocessor(cls): + # """:return: Instance of :class:`NaivePreprocessor`.""" + # return preprocessors.NaivePreprocessor() + # + # @property + # def word_embedding_mat(self) -> np.ndarray: + # """Get pretrained embedding for ArcI model.""" + # # Check if provided embedding matrix + # if self._params['word_embedding_mat'] is None: + # raise TypeError('No pre-trained word embeddings provided.') + # + # @word_embedding_mat.setter + # def word_embedding_mat(self, embedding_mat: np.ndarray): + # """ + # Set pretrained embedding for ArcI model. + # + # :param embedding_mat: pretrained embedding in numpy format. + # """ + # self._params['word_embedding_mat'] = embedding_mat + # self._params['vocab_size'], self._params['dim_word_embedding'] = \ + # embedding_mat.shape + # + # @property + # def char_embedding_mat(self) -> np.ndarray: + # """Initialize character level embedding.""" + # s = self._params['embedding_random_scale'] + # self._params['char_embedding_mat'] = \ + # np.random.uniform(-s, s, (self._params['vocab_size'], + # self._params['dim_char_embedding'])) + # return self._params['char_embedding_mat'] + # + # def char_embedding(self, char_input_shape, char_vocab_size): + # """Create a character level embedding model.""" + # input_char = Input(shape=char_input_shape) + # embed_char = LSTM(self._params['dim_char_embedding'], + # kernel_initializer=self._params['w_initializer'], + # bias_initializer=self._params['b_initializer'])( + # input_char) + # embed_char = Dense(char_vocab_size, + # activation=self._params['activation_embedding'])( + # embed_char) + # return Model(input_char, embed_char) + + def build(self): + """Build model structure.""" + # ~ Input Layer + input_left, input_right = self._make_inputs() + + # Word Representation Layer + # TODO: concatenate word level embedding and character level embedding. + embedding = self._make_embedding_layer() + embed_left = embedding(input_left) + embed_right = embedding(input_right) + + embed_left = Dropout(self._params['dropout_rate'])(embed_left) + embed_right = Dropout(self._params['dropout_rate'])(embed_right) + + # ~ Word Level Matching Layer + # Reference: + # https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L207-L223 + # TODO + pass + + # ~ Encoding Layer + # Note: When merge_mode = None, output will be [forward, backward], + # The default merge_mode is concat, and the output will be [lstm]. + # If with return_state, then the output would append [h,c,h,c]. + bi_lstm = Bidirectional( + LSTM(self._params['hidden_size'], + return_sequences=True, + return_state=True, + dropout=self._params['dropout_rate'], + kernel_initializer=self._params['w_initializer'], + bias_initializer=self._params['b_initializer']), + merge_mode='concat') + # x_left = [lstm_lt, forward_h_lt, _, backward_h_lt, _ ] + x_left = bi_lstm(embed_left) + x_right = bi_lstm(embed_right) + + # ~ Multi-Perspective Matching layer. + # Output is two sequence of vectors. + # Cons: Haven't support multiple context layer + multi_perspective = MultiPerspectiveLayer(self._params['att_dim'], + self._params['mp_dim'], + self._params['perspective']) + # Note: input to `keras layer` must be list of tensors. + mp_left = multi_perspective(x_left + x_right) + mp_right = multi_perspective(x_right + x_left) + + # ~ Dropout Layer + mp_left = Dropout(self._params['dropout_rate'])(mp_left) + mp_right = Dropout(self._params['dropout_rate'])(mp_right) + + # ~ Highway Layer + # reference: + # https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L289-L295 + if self._params['with_match_highway']: + # the input is left matching representations (question / passage) + pass + + # ~ Aggregation layer + # TODO: mask the above layer + aggregation = Bidirectional( + LSTM(self._params['hidden_size'], + return_sequences=False, + return_state=False, + dropout=self._params['dropout_rate'], + kernel_initializer=self._params['w_initializer'], + bias_initializer=self._params['b_initializer']), + merge_mode='concat') + rep_left = aggregation(mp_left) + rep_right = aggregation(mp_right) + + # Concatenate the concatenated vector of left and right. + x = Concatenate()([rep_left, rep_right]) + + # ~ Highway Network + # reference: + # https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L289-L295 + if self._params['with_aggregation_highway']: + pass + + # ~ Prediction layer. + # reference: + # https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L140-L153 + x = Dense(self._params['hidden_size'], + activation=self._params['activation_hidden'])(x) + x = Dense(self._params['hidden_size'], + activation=self._params['activation_hidden'])(x) + x_out = self._make_output_layer()(x) + self._backend = Model(inputs=[input_left, input_right], + outputs=x_out) diff --git a/requirements.txt b/requirements.txt index db793e1c..9b04fcd7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ keras >= 2.2.4 tabulate >= 0.8.2 -tensorflow >= 1.1.0 +tensorflow >= 1.8.0 nltk >= 3.2.3 numpy >= 1.14 tqdm >= 4.19.4 From 504503a72141ba9d19471e0590f81f66ae6dd3da Mon Sep 17 00:00:00 2001 From: rgtjf Date: Sun, 20 Jan 2019 21:12:24 +0800 Subject: [PATCH 002/100] hotfix: fix CI --- matchzoo/contrib/layers/__init__.py | 2 ++ matchzoo/contrib/layers/attention_layer.py | 2 +- matchzoo/contrib/layers/multi_perspective_layer.py | 13 +++++++------ matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/bimpm_model.py | 4 ++-- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/matchzoo/contrib/layers/__init__.py b/matchzoo/contrib/layers/__init__.py index e69de29b..a3fa4931 100644 --- a/matchzoo/contrib/layers/__init__.py +++ b/matchzoo/contrib/layers/__init__.py @@ -0,0 +1,2 @@ +from .attention_layer import AttentionLayer +from .multi_perspective_layer import MultiPerspectiveLayer \ No newline at end of file diff --git a/matchzoo/contrib/layers/attention_layer.py b/matchzoo/contrib/layers/attention_layer.py index a3bd0ec6..74bb1331 100644 --- a/matchzoo/contrib/layers/attention_layer.py +++ b/matchzoo/contrib/layers/attention_layer.py @@ -16,7 +16,7 @@ class AttentionLayer(Layer): Examples: >>> import matchzoo as mz - >>> layer = mz.layers.AttentionLayer(att_dim=50) + >>> layer = mz.contrib.layers.AttentionLayer(att_dim=50) """ diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index 6e5851de..37368fd0 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -15,7 +15,7 @@ class MultiPerspectiveLayer(Layer): Examples: >>> import matchzoo as mz - >>> layer = mz.layers.MultiPerspectiveLayer(50, 20, None) + >>> layer = mz.contrib.layers.MultiPerspectiveLayer(50, 20, None) """ @@ -96,7 +96,8 @@ def call(self, x: list, **kwargs): if self._perspective.get('max-attentive'): # Each contextual embedding compare with each contextual embedding. # retain max of weighted mean of each dimension. - relevancy_matrix = _calc_relevancy_matrix(lstm_reps_lt, lstm_reps_rt) + relevancy_matrix = _calc_relevancy_matrix(lstm_reps_lt, + lstm_reps_rt) max_attentive_tensor = self.max_attentive_match([lstm_reps_lt, lstm_reps_rt, relevancy_matrix]) @@ -124,7 +125,7 @@ def __init__(self, mp_dim): def build(self, input_shapes): """Build.""" - input_shape = input_shapes[0] + # input_shape = input_shapes[0] self.built = True def call(self, x, **kwargs): @@ -200,7 +201,7 @@ def __init__(self, att_dim, mp_dim): def build(self, input_shapes): """Build.""" - input_shape = input_shapes[0] + # input_shape = input_shapes[0] self.built = True def call(self, x, **kwargs): @@ -232,7 +233,7 @@ def __init__(self, mp_dim): def build(self, input_shapes): """Build.""" - input_shape = input_shapes[0] + # input_shape = input_shapes[0] self.built = True def call(self, x): @@ -386,7 +387,7 @@ def _calc_relevancy_matrix(reps_lt, reps_rt): # -> [batch_size, 1, len_lt, dim] reps_lt = K.expand_dims(reps_lt, 1) # -> [batch_size, len_rt, 1, dim] - in_passage_repres_tmp = K.expand_dims(reps_rt, 2) + # in_passage_repres_tmp = K.expand_dims(reps_rt, 2) relevancy_matrix = _cosine_distance(reps_lt, reps_rt) return relevancy_matrix diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 6faa60bb..f7970f85 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1 +1,2 @@ from .match_lstm import MatchLSTM +from .bimpm_model import BimpmModel diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index 44ef2f18..e67cfbe3 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -5,7 +5,7 @@ from keras.layers import Bidirectional, LSTM from matchzoo import engine -from matchzoo.contrib.layers.multi_perspective_layer import MultiPerspectiveLayer +from matchzoo.contrib.layers import MultiPerspectiveLayer class BimpmModel(engine.BaseModel): @@ -14,7 +14,7 @@ class BimpmModel(engine.BaseModel): Examples: >>> import matchzoo as mz - >>> model = mz.models.BimpmModel() + >>> model = mz.contrib.models.BimpmModel() >>> model.guess_and_fill_missing_params(verbose=0) >>> model.build() From 580178f894c02478a929f4b6d5af99cac240efd8 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Tue, 26 Mar 2019 20:21:59 +0800 Subject: [PATCH 003/100] hotfix: fix errors fix Incompatible shapes: [36,40,256] vs. [36,36,256] --- matchzoo/contrib/layers/multi_perspective_layer.py | 12 +++++++++--- matchzoo/contrib/models/bimpm_model.py | 5 ++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index 37368fd0..6440f53a 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -248,7 +248,12 @@ def call(self, x): def cal_max_question_representation(reps_lt, attn_scores): - """Return [batch_size, passage_len].""" + """ + cal_max_question_representation + :param reps_lt: [batch_size, passage_len, hidden_size] + :param attn_scores: [] + :return: [batch_size, passage_len, hidden_size]. + """ attn_positions = K.argmax(attn_scores, axis=2) max_reps_lt = collect_representation(reps_lt, attn_positions) return max_reps_lt @@ -289,10 +294,10 @@ def collect_final_step_of_lstm(lstm_representation, lengths): def collect_probs(probs, positions): """ Collect Probs. - + Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/layer_utils.py#L128-L140 :param probs: [batch_size, chunks_size] :param positions: [batch_size, pair_size] - :return: + :return: [batch_size, pair_size] """ batch_size = K.shape(probs)[0] pair_size = K.shape(positions)[1] @@ -386,6 +391,7 @@ def compute_output_shape(self, input_shape): def _calc_relevancy_matrix(reps_lt, reps_rt): # -> [batch_size, 1, len_lt, dim] reps_lt = K.expand_dims(reps_lt, 1) + reps_rt = K.expand_dims(reps_rt, 2) # -> [batch_size, len_rt, 1, dim] # in_passage_repres_tmp = K.expand_dims(reps_rt, 2) relevancy_matrix = _cosine_distance(reps_lt, reps_rt) diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index e67cfbe3..f7f93eb6 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -11,7 +11,8 @@ class BimpmModel(engine.BaseModel): """ BimpmModel. - + Reference: + - https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L43-L186 Examples: >>> import matchzoo as mz >>> model = mz.contrib.models.BimpmModel() @@ -107,6 +108,8 @@ def build(self): embed_left = embedding(input_left) embed_right = embedding(input_right) + # L119-L121 + # https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L119-L121 embed_left = Dropout(self._params['dropout_rate'])(embed_left) embed_right = Dropout(self._params['dropout_rate'])(embed_right) From e000688ca9d8387238072ec2ea880c3c7f4bb15c Mon Sep 17 00:00:00 2001 From: rgtjf Date: Wed, 27 Mar 2019 10:25:27 +0800 Subject: [PATCH 004/100] hotfix: fix CI --- matchzoo/contrib/layers/multi_perspective_layer.py | 7 +++++-- matchzoo/contrib/models/bimpm_model.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index 6440f53a..212da13c 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -249,7 +249,8 @@ def call(self, x): def cal_max_question_representation(reps_lt, attn_scores): """ - cal_max_question_representation + Calculate max_question_representation. + :param reps_lt: [batch_size, passage_len, hidden_size] :param attn_scores: [] :return: [batch_size, passage_len, hidden_size]. @@ -294,7 +295,9 @@ def collect_final_step_of_lstm(lstm_representation, lengths): def collect_probs(probs, positions): """ Collect Probs. - Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/layer_utils.py#L128-L140 + + Reference: + https://github.com/zhiguowang/BiMPM/blob/master/src/layer_utils.py#L128-L140 :param probs: [batch_size, chunks_size] :param positions: [batch_size, pair_size] :return: [batch_size, pair_size] diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index f7f93eb6..9bc01e9d 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -11,8 +11,9 @@ class BimpmModel(engine.BaseModel): """ BimpmModel. + Reference: - - https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L43-L186 + https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L43-L186 Examples: >>> import matchzoo as mz >>> model = mz.contrib.models.BimpmModel() From 3a75e3ebc23211df699f1c7a59e742cb0591f7e5 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Mon, 1 Apr 2019 13:50:50 +0800 Subject: [PATCH 005/100] hotfix: fix wrong package path --- matchzoo/contrib/models/bimpm_model.py | 42 ++++++++++++++------------ 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index 9bc01e9d..105e58fb 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -4,11 +4,13 @@ from keras.layers import Dense, Concatenate, Dropout from keras.layers import Bidirectional, LSTM -from matchzoo import engine +from matchzoo.engine.param import Param +from matchzoo.engine.param_table import ParamTable +from matchzoo.engine.base_model import BaseModel from matchzoo.contrib.layers import MultiPerspectiveLayer -class BimpmModel(engine.BaseModel): +class BimpmModel(BaseModel): """ BimpmModel. @@ -23,34 +25,34 @@ class BimpmModel(engine.BaseModel): """ @classmethod - def get_default_params(cls) -> engine.ParamTable: + def get_default_params(cls) -> ParamTable: """:return: model default parameters.""" params = super().get_default_params(with_embedding=True) params['optimizer'] = 'adam' - params.add(engine.Param('dim_word_embedding', 50)) + params.add(Param('dim_word_embedding', 50)) # TODO(tjf): remove the unused params in the final version - params.add(engine.Param('dim_char_embedding', 50)) - params.add(engine.Param('word_embedding_mat')) - params.add(engine.Param('char_embedding_mat')) - params.add(engine.Param('embedding_random_scale', 0.2)) - params.add(engine.Param('activation_embedding', 'softmax')) + params.add(Param('dim_char_embedding', 50)) + params.add(Param('word_embedding_mat')) + params.add(Param('char_embedding_mat')) + params.add(Param('embedding_random_scale', 0.2)) + params.add(Param('activation_embedding', 'softmax')) # Bimpm Setting - params.add(engine.Param('perspective', {'full': True, + params.add(Param('perspective', {'full': True, 'max-pooling': True, 'attentive': True, 'max-attentive': True})) - params.add(engine.Param('mp_dim', 20)) - params.add(engine.Param('att_dim', 20)) - params.add(engine.Param('hidden_size', 128)) - params.add(engine.Param('dropout_rate', 0.0)) - params.add(engine.Param('w_initializer', 'glorot_uniform')) - params.add(engine.Param('b_initializer', 'zeros')) - params.add(engine.Param('activation_hidden', 'linear')) - - params.add(engine.Param('with_match_highway', False)) - params.add(engine.Param('with_aggregation_highway', False)) + params.add(Param('mp_dim', 20)) + params.add(Param('att_dim', 20)) + params.add(Param('hidden_size', 128)) + params.add(Param('dropout_rate', 0.0)) + params.add(Param('w_initializer', 'glorot_uniform')) + params.add(Param('b_initializer', 'zeros')) + params.add(Param('activation_hidden', 'linear')) + + params.add(Param('with_match_highway', False)) + params.add(Param('with_aggregation_highway', False)) return params From b72d250682538a01588802f2cbc0252a788758ba Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Mon, 1 Apr 2019 15:37:34 +0800 Subject: [PATCH 006/100] [Feature] Add Match-SRNN model --- matchzoo/contrib/layers/__init__.py | 7 + .../contrib/layers/matching_tensor_layer.py | 137 +++++++++ matchzoo/contrib/layers/spatial_gru.py | 267 ++++++++++++++++++ matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/match_srnn.py | 93 ++++++ 5 files changed, 505 insertions(+) create mode 100644 matchzoo/contrib/layers/matching_tensor_layer.py create mode 100644 matchzoo/contrib/layers/spatial_gru.py create mode 100644 matchzoo/contrib/models/match_srnn.py diff --git a/matchzoo/contrib/layers/__init__.py b/matchzoo/contrib/layers/__init__.py index e69de29b..74d3db05 100644 --- a/matchzoo/contrib/layers/__init__.py +++ b/matchzoo/contrib/layers/__init__.py @@ -0,0 +1,7 @@ +from .matching_tensor_layer import MatchingTensorLayer +from .spatial_gru import SpatialGRU + +layer_dict = { + "MatchingTensorLayer": MatchingTensorLayer, + "SpatialGRU": SpatialGRU +} diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py new file mode 100644 index 00000000..44de9f2f --- /dev/null +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -0,0 +1,137 @@ +"""An implementation of Matching Tensor Layer.""" +import typing + +import numpy as np + +from keras import backend as K +from keras.engine import Layer +from keras.initializers import constant + + +class MatchingTensorLayer(Layer): + """ + Layer that captures the basic interactions between two tensors. + + :param channels: Number of word interaction tensor channels + :param normalize: Whether to L2-normalize samples along the + dot product axis before taking the dot product. + If set to True, then the output of the dot product + is the cosine proximity between the two samples. + :param init_diag: Whether to initialize the diagonal elements + of the matrix. + :param kwargs: Standard layer keyword arguments. + + Examples: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.MatchingTensorLayer(channels=10, + ... normalize=True, + ... init_diag=True) + >>> num_batch, left_len, right_len, num_dim = 5, 3, 2, 10 + >>> layer.build([[num_batch, left_len, num_dim], + ... [num_batch, right_len, num_dim]]) + + """ + + def __init__(self, channels: int = 10, normalize: bool = False, + init_diag: bool = True, **kwargs): + """:class:`MatchingTensorLayer` constructor.""" + super(MatchingTensorLayer, self).__init__(**kwargs) + self._channels = channels + self._normalize = normalize + self._init_diag = init_diag + self._shape1 = None + self._shape2 = None + + def build(self, input_shape: list): + """ + Build the layer. + + :param input_shape: the shapes of the input tensors, + for MatchingTensorLayer we need two input tensors. + """ + # Used purely for shape validation. + if not isinstance(input_shape, list) or len(input_shape) != 2: + raise ValueError('A `MatchingTensorLayer` layer should be called ' + 'on a list of 2 inputs.') + self._shape1 = input_shape[0] + self._shape2 = input_shape[1] + for idx in (0, 2): + if self._shape1[idx] != self._shape2[idx]: + raise ValueError( + 'Incompatible dimensions: ' + f'{self._shape1[idx]} != {self._shape2[idx]}.' + f'Layer shapes: {self._shape1}, {self._shape2}.' + ) + + if self._init_diag: + if self._shape1[2] != self._shape2[2]: + raise ValueError('Use init_diag need same embedding shape.') + M_diag = np.float32( + np.random.uniform( + -0.05, 0.05, + [self._channels, self._shape1[2], self._shape2[2]] + ) + ) + for i in range(self._channels): + for j in range(self._shape1[2]): + M_diag[i][j][j] = 0.1 + self.M = self.add_weight( + name='M', + shape=(self._channels, self._shape1[2], self._shape2[2]), + initializer=constant(M_diag), + trainable=True + ) + else: + self.M = self.add_weight( + name='M', + shape=(self._channels, self._shape1[2], self._shape2[2]), + initializer='uniform', + trainable=True + ) + super(MatchingTensorLayer, self).build(input_shape) + + def call(self, inputs: list, **kwargs) -> typing.Any: + """ + The computation logic of MatchingTensorLayer. + + :param inputs: two input tensors. + """ + x1 = inputs[0] + x2 = inputs[1] + if self._normalize: + x1 = K.l2_normalize(x1, axis=2) + x2 = K.l2_normalize(x2, axis=2) + output = K.tf.einsum('abd,fde,ace->afbc', x1, self.M, x2) + return output + + def compute_output_shape(self, input_shape: list) -> tuple: + """ + Calculate the layer output shape. + + :param input_shape: the shapes of the input tensors, + for MatchingTensorLayer we need two input tensors. + """ + if not isinstance(input_shape, list) or len(input_shape) != 2: + raise ValueError('A `MatchingTensorLayer` layer should be called ' + 'on a list of 2 inputs.') + shape1 = list(input_shape[0]) + shape2 = list(input_shape[1]) + if len(shape1) != 3 or len(shape2) != 3: + raise ValueError('A `MatchingTensorLayer` layer should be called ' + 'on 2 inputs with 3 dimensions.') + if shape1[0] != shape2[0] or shape1[2] != shape2[2]: + raise ValueError('A `MatchingTensorLayer` layer should be called ' + 'on 2 inputs with same 0,2 dimensions.') + + output_shape = [shape1[0], self._channels, shape1[1], shape2[1]] + return tuple(output_shape) + + def get_config(self) -> dict: + """Get the config dict of MatchingTensorLayer.""" + config = { + 'channels': self._channels, + 'normalize': self._normalize, + 'init_diag': self._init_diag, + } + base_config = super(MatchingTensorLayer, self).get_config() + return dict(list(base_config.items()) + list(config.items())) diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py new file mode 100644 index 00000000..7676f744 --- /dev/null +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -0,0 +1,267 @@ +"""An implementation of Spatial GRU Layer.""" +import typing + +from keras import backend as K +from keras.engine import Layer +from keras.layers import Permute +from keras.layers import Reshape +from keras.layers import activations +from keras.layers import initializers + +from tensorflow.python.ops import control_flow_ops +from tensorflow.python.ops import tensor_array_ops + + +class SpatialGRU(Layer): + """ + Spatial GRU layer. + + :param units: Number of SpatialGRU units. + :param normalize: Whether to L2-normalize samples along the + dot product axis before taking the dot product. + If set to True, then the output of the dot product + is the cosine proximity between the two samples. + :param init_diag: Whether to initialize the diagonal elements + of the matrix. + :param activation: Activation function to use. Default: + hyperbolic tangent (`tanh`). If you pass `None`, no + activation is applied (ie. "linear" activation: `a(x) = x`). + :param recurrent_activation: Activation function to use for + the recurrent step. Default: sigmoid (`sigmoid`). + If you pass `None`, no activation is applied (ie. "linear" + activation: `a(x) = x`). + :param use_bias: Boolean, whether the layer uses a bias vector. + :param kernel_initializer: Initializer for the `kernel` weights + matrix, used for the linear transformation of the inputs. + :param recurrent_initializer: Initializer for the `recurrent_kernel` + weights matrix, used for the linear transformation of the + recurrent state. + :param bias_initializer: Initializer for the bias vector. + :param direction: Scanning direction. `lt` (i.e., left top) + indicates the scanning from left top to right bottom, and + `rb` (i.e., right bottom) indicates the scanning from + right bottom to left top. + :param kwargs: Standard layer keyword arguments. + + Examples: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.SpatialGRU(units=50, + ... direction='lt') + >>> num_batch, channel, left_len, right_len = 5, 10, 3, 2 + >>> layer.build([num_batch, channel, left_len, right_len]) + + """ + + def __init__(self, + units: int = 50, + normalize: bool = False, + init_diag: bool = False, + activation: str = 'tanh', + recurrent_activation: str = 'sigmoid', + use_bias: bool = True, + kernel_initializer: str = 'glorot_uniform', + recurrent_initializer: str = 'orthogonal', + bias_initializer: str = 'zeros', + direction: str = 'lr', + **kwargs): + """:class:`SpatialGRU` constructor.""" + super(SpatialGRU, self).__init__(**kwargs) + self._units = units + self._normalize = normalize + self._init_diag = init_diag + self._activation = activations.get(activation) + self._recurrent_activation = activations.get(recurrent_activation) + self._use_bias = use_bias + + self._kernel_initializer = initializers.get(kernel_initializer) + self._recurrent_initializer = initializers.get(recurrent_initializer) + self._bias_initializer = initializers.get(bias_initializer) + self._direction = direction + + def build(self, input_shape: typing.Any): + """ + Build the layer. + + :param input_shape: the shapes of the input tensors. + """ + # input_shape: (batch_size, channel, text1_maxlen, text2_maxlen) + self._batch_size = input_shape[0] + self._channel = input_shape[1] + self._input_dim = self._channel + 3 * self._units + + self._text1_maxlen = input_shape[2] + self._text2_maxlen = input_shape[3] + self._recurrent_step = self._text1_maxlen * self._text2_maxlen + + self._W = self.add_weight(name='W', + shape=(self._input_dim, self._units * 7), + initializer=self._kernel_initializer, + trainable=True) + + self._U = self.add_weight(name='U', + shape=(self._units * 3, self._units), + initializer=self._recurrent_initializer, + trainable=True) + + self._bias = self.add_weight(name='bias', + shape=(self._units * 8,), + initializer='zeros', + trainable=True) + + # w_rl, w_rt, w_rd + self._wr = self._W[:, :self._units * 3] + # b_rl, b_rt, b_rd + self._br = self._bias[:self._units * 3] + # w_zi, w_zl, w_zt, w_zd + self._wz = self._W[:, self._units * 3: self._units * 7] + # b_zi, b_zl, b_zt, b_zd + self._bz = self._bias[self._units * 3: self._units * 7] + self._w_ij = self.add_weight(name='Wij', + shape=(self._channel, self._units), + initializer=self._recurrent_initializer, + trainable=True) + self._b_ij = self._bias[self._units * 7:] + super(SpatialGRU, self).build(input_shape) + + def softmax_by_row(self, z: typing.Any) -> tuple: + """Conduct softmax on each dimension across the four gates.""" + + z_transform = Permute((2, 1))(Reshape((4, self._units))(z)) + for i in range(0, self._units): + begin1 = [0, i, 0] + size = [-1, 1, -1] + if i == 0: + z_s = K.tf.nn.softmax(K.tf.slice(z_transform, begin1, size)) + else: + z_s = K.tf.concat( + [z_s, K.tf.nn.softmax( + K.tf.slice(z_transform, begin1, size))], 1) + + zi, zl, zt, zd = K.tf.unstack(z_s, axis=2) + return zi, zl, zt, zd + + def calculate_recurrent_unit(self, + inputs_ta: typing.Any, + states: typing.Any, + step: int, + h: typing.Any, + h0: typing.Any) -> tuple: + """ + Calculate recurrent unit. + + :param inputs: input tensors. + """ + i = K.tf.div(step, K.tf.constant(self._text2_maxlen)) + j = K.tf.mod(step, K.tf.constant(self._text2_maxlen)) + + h_diag = states.read(i * (self._text2_maxlen + 1) + j) + h_top = states.read(i * (self._text2_maxlen + 1) + j + 1) + h_left = states.read((i + 1) * (self._text2_maxlen + 1) + j) + + s_ij = inputs_ta.read(step) + q = K.tf.concat([K.tf.concat([h_top, h_left], 1), + K.tf.concat([h_diag, s_ij], 1)], 1) + r = self._recurrent_activation( + self._time_distributed_dense(self._wr, q, self._br)) + z = self._time_distributed_dense(self._wz, q, self._bz) + zi, zl, zt, zd = self.softmax_by_row(z) + + hij_1 = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) + hij_2 = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) + hij_ = self._activation(hij_1 + hij_2) + hij = zl * h_left + zt * h_top + zd * h_diag + zi * hij_ + states = states.write(((i + 1) * (self._text2_maxlen + 1) + j + 1), + hij) + hij.set_shape(h_top.get_shape()) + return inputs_ta, states, step + 1, hij, h0 + + def call(self, inputs: list, **kwargs) -> typing.Any: + """ + The computation logic of SpatialGRU. + + :param inputs: input tensors. + """ + batch_size = K.tf.shape(inputs)[0] + self._bounder_state_h0 = K.tf.zeros([batch_size, self._units]) + + # input_x: (text1_maxlen, text2_maxlen, batch_size, channel) + input_x = K.tf.transpose(inputs, [2, 3, 0, 1]) + if self._direction == 'rb': + input_x = K.tf.reverse(input_x, [0, 1]) + elif self._direction != 'lt': + raise ValueError(f"Invalid direction. " + f"`{self._direction}` received. " + f"Must be in `lt`, `rb`.") + input_x = K.tf.reshape(input_x, [-1, self._channel]) + input_x = K.tf.split( + axis=0, + num_or_size_splits=self._text1_maxlen * self._text2_maxlen, + value=input_x) + inputs_ta = K.tf.TensorArray( + dtype=K.tf.float32, + size=self._text1_maxlen * self._text2_maxlen, + name='input_ta') + states_ta = K.tf.TensorArray( + dtype=K.tf.float32, + size=(self._text1_maxlen + 1) * (self._text2_maxlen + 1), + name='state_ta', clear_after_read=False) + + for i in range(self._text2_maxlen + 1): + states_ta = states_ta.write(i, self._bounder_state_h0) + for i in range(self._text1_maxlen): + states_ta = states_ta.write((i + 1) * (self._text2_maxlen + 1), + self._bounder_state_h0) + inputs_ta = inputs_ta.unstack(input_x) + _, _, _, hij, _ = control_flow_ops.while_loop( + cond=lambda _0, _1, i, _3, _4: i < self._recurrent_step, + body=self.calculate_recurrent_unit, + loop_vars=( + inputs_ta, + states_ta, + K.tf.Variable(0, dtype=K.tf.int32), + self._bounder_state_h0, + self._bounder_state_h0), + parallel_iterations=1, + swap_memory=True + ) + return hij + + def compute_output_shape(self, input_shape: typing.Any) -> tuple: + """ + Calculate the layer output shape. + + :param input_shape: the shapes of the input tensors. + """ + output_shape = [input_shape[0], self._units] + return tuple(output_shape) + + def get_config(self) -> dict: + """Get the config dict of SpatialGRU.""" + config = { + 'units': self._units, + 'normalize': self._normalize, + 'init_diag': self._init_diag, + 'activation': activations.serialize(self._activation), + 'recurrent_activation': + activations.serialize(self._recurrent_activation), + 'use_bias': self._use_bias, + 'kernel_initializer': + initializers.serialize(self._kernel_initializer), + 'recurrent_initializer': + initializers.serialize(self._recurrent_initializer), + 'bias_initializer': + initializers.serialize(self._bias_initializer), + 'direction': self._direction + } + base_config = super(SpatialGRU, self).get_config() + return dict(list(base_config.items()) + list(config.items())) + + @classmethod + def _time_distributed_dense(cls, w, x, b): + if K.backend() == 'tensorflow': + x = K.dot(x, w) + x = K.bias_add(x, b) + else: + raise Exception("time_distributed_dense doesn't " + "backend tensorflow") + return x diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 6faa60bb..bff26142 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1 +1,2 @@ from .match_lstm import MatchLSTM +from .match_srnn import MatchSRNN diff --git a/matchzoo/contrib/models/match_srnn.py b/matchzoo/contrib/models/match_srnn.py new file mode 100644 index 00000000..a6251d39 --- /dev/null +++ b/matchzoo/contrib/models/match_srnn.py @@ -0,0 +1,93 @@ +"""An implementation of Match-SRNN Model.""" +import typing + +import keras +import keras.backend as K + +import matchzoo +from matchzoo.engine.base_model import BaseModel +from matchzoo.engine.param import Param +from matchzoo.engine.param_table import ParamTable +from matchzoo.engine import hyper_spaces + + +class MatchSRNN(BaseModel): + """ + Match-SRNN Model. + + Examples: + >>> model = MatchSRNN() + >>> model.params['channels'] = 4 + >>> model.params['units'] = 10 + >>> model.params['dropout_rate'] = 0.0 + >>> model.params['direction'] = 'lt' + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.build() + + """ + + @classmethod + def get_default_params(cls) -> ParamTable: + """:return: model default parameters.""" + params = super().get_default_params(with_embedding=True) + params.add(Param(name='channels', value=4, + desc="Number of word interaction tensor channels")) + params.add(Param(name='units', value=10, + desc="Number of SpatialGRU units")) + params.add(Param(name='direction', value='lt', + desc="Direction of SpatialGRU scanning")) + params.add(Param( + name='dropout_rate', value=0.0, + hyper_space=hyper_spaces.quniform(low=0.0, high=0.8, + q=0.01), + desc="The dropout rate." + )) + return params + + def build(self): + """ + Build model structure. + + Match-SRNN: Modeling the Recursive Matching Structure + with Spatial RNN + """ + + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # D = embedding size + # L = `input_left` sequence length + # R = `input_right` sequence length + # C = number of channels + + # Left input and right input. + # shape = [B, L] + # shape = [B, R] + query, doc = self._make_inputs() + + embedding = self._make_embedding_layer() + # Process left and right input. + # shape = [B, L, D] + embed_query = embedding(query) + # shape = [B, R, D] + embed_doc = embedding(doc) + + # Get matching tensor + # shape = [B, C, L, R] + matching_tensor_layer = matchzoo.contrib.layers.MatchingTensorLayer( + channels=self._params['channels']) + matching_tensor = matching_tensor_layer([embed_query, embed_doc]) + # shape = [B, L, R, C] + matching_tensor = keras.layers.Permute((2, 3, 1))(matching_tensor) + + spatial_gru = matchzoo.contrib.layers.SpatialGRU( + units=self._params['units'], + direction=self._params['direction']) + + h_ij = spatial_gru(matching_tensor) + + x = keras.layers.Dropout( + rate=self._params['dropout_rate'])(h_ij) + + x_out = self._make_output_layer()(x) + + self._backend = keras.Model(inputs=[query, doc], outputs=x_out) From b09d67afeeaf5a84f059ffbb06973acb6f1d1894 Mon Sep 17 00:00:00 2001 From: Crystina Date: Mon, 1 Apr 2019 21:55:19 -0400 Subject: [PATCH 007/100] add esim code and test file into dev branch --- matchzoo/models/__init__.py | 1 + matchzoo/models/esim.py | 251 +++++++++++++++++++++++++++++++++++ tests/inte_test/test_esim.py | 115 ++++++++++++++++ 3 files changed, 367 insertions(+) create mode 100644 matchzoo/models/esim.py create mode 100644 tests/inte_test/test_esim.py diff --git a/matchzoo/models/__init__.py b/matchzoo/models/__init__.py index 29516ab3..526c33f9 100644 --- a/matchzoo/models/__init__.py +++ b/matchzoo/models/__init__.py @@ -12,6 +12,7 @@ from .drmm import DRMM from .anmm import ANMM from .mvlstm import MVLSTM +from .esim import ESIM def list_available() -> list: diff --git a/matchzoo/models/esim.py b/matchzoo/models/esim.py new file mode 100644 index 00000000..04a1a944 --- /dev/null +++ b/matchzoo/models/esim.py @@ -0,0 +1,251 @@ +"""KNRM model.""" +import keras +import tensorflow as tf +from keras.layers import * # Dense, Dot, Softmax, Concatenate, Embedding, LSTM, Bidirectional +import keras.backend as K + +import matchzoo as mz +from matchzoo import engine, preprocessors + + +class ESIM(engine.BaseModel): + """ + ESIM model. + + Examples: + >>> model = ESIM() + >>> task = classification_task = mz.tasks.Classification(num_classes=2) + >>> model.params['task'] = task + >>> model.params['input_shapes'] = [(20, ), (40, )] + >>> model.params['lstm_dim'] = 300 + >>> model.params['mlp_num_units'] = 300 + >>> model.params['embedding_input_dim'] = 5000 + >>> model.params['embedding_output_dim'] = 10 + >>> model.params['embedding_trainable'] = False + + >>> model.params['mlp_num_layers'] = 0 # zero hidden layer (one output layer) + >>> model.params['mlp_num_fan_out'] = 300 + >>> model.params['mlp_activation_func'] = 'tanh' + + >>> model.params['mask_value'] = 0 + >>> model.params['dropout_rate'] = 0.5 + + >>> model.guess_and_fill_missing_params() + >>> model.build() + """ + + @classmethod + def get_default_params(cls) -> engine.ParamTable: + """Get default parameters.""" + params = super().get_default_params(with_embedding=True, + with_multi_layer_perceptron=True) + + params.add(engine.Param( + name='dropout_rate', + value=0.5, + desc="The dropout rate for all fully-connected layer" + )) + + params.add(engine.Param( + name='lstm_dim', + value=300, + desc="The dimension of LSTM layer." + )) + + params.add(engine.Param( + name='mask_value', + value=0, + desc="The value would be regarded as pad" + )) + + return params + + def compile(self, optimizer=None): + """ + Overwrite the engine.BaseModel.compile() to allow self-defined optimizer and learning rate + + Examples: + >>> from matchzoo import models + >>> model = models.Naive() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.params['task'].metrics = ['mse', 'map'] + >>> model.params['task'].metrics + ['mse', mean_average_precision(0.0)] + >>> model.build() + >>> model.compile() + """ + if optimizer == None: + optimizer = self._params['optimizer'] + + self._backend.compile(optimizer=optimizer, + loss=self._params['task'].loss) + + + def _make_inputs(self) -> list: + """ + prepare input from input dict + """ + input_left = keras.layers.Input( + name='text_left', + shape=self._params['input_shapes'][0] + ) + input_right = keras.layers.Input( + name='text_right', + shape=self._params['input_shapes'][1] + ) + return [input_left, input_right] + + + def _make_embedding_layer(self, name: str = 'embedding') -> keras.layers.Layer: + """ + Overwrite the engine.BaseModel._make_embedding_layer to allow specifiying mask_zero + """ + return keras.layers.Embedding( + self._params['embedding_input_dim'], + self._params['embedding_output_dim'], + trainable=self._params['embedding_trainable'], + mask_zero = True, + name=name + ) + + + def _expand_dim(self, inp, axis): + """ + Wrap keras.backend.expand_dims into a Lambda layer + """ + return keras.layers.Lambda(lambda x: K.expand_dims(x, axis=axis))(inp) + + + def _make_atten_mask_layer(self) -> keras.layers.Layer: + """ + make mask layer for attention weight matrix so that each word won't pay attention to timestep + """ + return keras.layers.Lambda( + lambda weight_mask: weight_mask[0] + (1.0 - weight_mask[1]) * -1e7, + name="atten_mask" + ) + + + def _make_BiLSTM_layer(self, lstm_dim) -> keras.layers.Layer: + """ + Bidirectional LSTM layer in ESIM. + + :param lstm_dim: int, dimension of LSTM layer + :return: `keras.layers.Layer`. + """ + return Bidirectional(layer=LSTM(lstm_dim, return_sequences=True), + merge_mode='concat') + + + def _max(self, texts, mask): + """ + Compute the max of each text according to their real length + + :param texts: np.array with shape [B, T, H] + :param lengths: np.array with shape [B, T, ], where 1 means valid, 0 means pad + """ + mask = self._expand_dim(mask, axis=2) + new_texts = Multiply()([texts, mask]) + + text_max = Lambda( + lambda x: K.max(x, axis=1), + )(new_texts) + + return text_max + + + def _avg(self, texts, mask): + """ + Compute the mean of each text according to their real length + + :param texts: np.array with shape [B, T, H] + :param lengths: np.array with shape [B, T, ], where 1 means valid, 0 means pad + """ + mask = self._expand_dim(mask, axis=2) + new_texts = Multiply()([texts, mask]) + + # timestep-wise division, exclude the PAD number when calc avg + text_avg = keras.layers.Lambda( + lambda text_mask: K.sum(text_mask[0], axis=1) / K.sum(text_mask[1], axis=1), + )([new_texts, mask]) + + return text_avg + + def build(self): + """Build model.""" + + # parameters + lstm_dim = self._params['lstm_dim'] + dropout_rate = self._params['dropout_rate'] + + # layers + create_mask = Lambda(lambda x: K.cast(K.not_equal(x, self._params['mask_value']), K.floatx())) + embedding = self._make_embedding_layer() + lstm_compare = self._make_BiLSTM_layer(lstm_dim) + lstm_compose = self._make_BiLSTM_layer(lstm_dim) + dense_compare = Dense(units=lstm_dim, activation='relu', use_bias=True) + dropout = Dropout(dropout_rate) + + + # model + a, b = self._make_inputs() # [B, T_a], [B, T_b] + a_mask = create_mask(a) # [B, T_a] + b_mask = create_mask(b) # [B, T_b] + + ######################## + # encoding + ######################## + a_emb = dropout(embedding(a)) # [B, T_a, E_dim] + b_emb = dropout(embedding(b)) # [B, T_b, E_dim] + + a_ = lstm_compare(a_emb) # [B, T_a, H*2] + b_ = lstm_compare(b_emb) # [B, T_b, H*2] + + + ######################## + # local inference + ######################## + # similarity matrix + e = Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] + _ab_mask = Multiply()([self._expand_dim(a_mask, axis=2), # [B, T_a, 1] + self._expand_dim(b_mask, axis=1)]) # [B, 1, T_b] + # _ab_mask: [B, T_a, T_b] + + pm = Permute((2, 1)) + mask_layer = self._make_atten_mask_layer() + softmax_layer = Softmax(axis=-1) + + e_a = softmax_layer(mask_layer([e, _ab_mask])) # [B, T_a, T_b] + e_b = softmax_layer(mask_layer([pm(e), pm(_ab_mask)])) # [B, T_b, T_a] + + # alignment (a_t = a~, b_t = b~ ) + a_t = Dot(axes=(2, 1))([e_a, b_]) # [B, T_a, H*2] + b_t = Dot(axes=(2, 1))([e_b, a_]) # [B, T_b, H*2] + + # local inference info enhancement + m_a = Concatenate(axis=-1)([a_, a_t, Subtract()([a_, a_t]), Multiply()([a_, a_t])]) # [B, T_a, H*2*4] + m_b = Concatenate(axis=-1)([b_, b_t, Subtract()([b_, b_t]), Multiply()([b_, b_t])]) # [B, T_b, H*2*4] + + # project m_a and m_b from 4*H*2 dim to H dim + m_a = dropout(dense_compare(m_a)) # [B, T_a, H] + m_b = dropout(dense_compare(m_b)) # [B, T_a, H] + + + ######################## + # inference composition + ######################## + v_a = lstm_compose(m_a) # [B, T_a, H*2] + v_b = lstm_compose(m_b) # [B, T_b, H*2] + + # pooling + v_a = Concatenate(axis=-1)([self._avg(v_a, a_mask), self._max(v_a, a_mask)]) # [B, H*4] + v_b = Concatenate(axis=-1)([self._avg(v_b, b_mask), self._max(v_b, b_mask)]) # [B, H*4] + v = Concatenate(axis=-1)([v_a, v_b]) # [B, H*8] + + # mlp (multilayer perceptron) classifier + output = dropout(self._make_multi_layer_perceptron_layer()(v)) # [B, H] + output = self._make_output_layer()(output) # [B, #classes] + + self._backend = keras.Model(inputs=[a, b], outputs=output) + + diff --git a/tests/inte_test/test_esim.py b/tests/inte_test/test_esim.py new file mode 100644 index 00000000..d72a6552 --- /dev/null +++ b/tests/inte_test/test_esim.py @@ -0,0 +1,115 @@ +import shutil + +import pytest +import numpy as np +import pandas as pd +import matchzoo as mz +from keras.utils import to_categorical + + +@pytest.fixture(scope='module') +def train_data(): + return mz.datasets.toy.load_data(stage='train') + + +@pytest.fixture(scope='module') +def valid_data(): + return mz.datasets.toy.load_data(stage='dev') + + +@pytest.fixture(scope='module') +def test_data(): + return mz.datasets.toy.load_data(stage='test') + + +@pytest.fixture(scope='module') +def task(request) -> mz.engine.BaseTask: + return mz.tasks.Classification(num_classes=2) + + +@pytest.fixture(scope='module') +def preprocessor(): + return mz.preprocessors.BasicPreprocessor() + + +@pytest.fixture(scope='module') +def train_data_processed(train_data, preprocessor) -> mz.DataPack: + X, Y = preprocessor.fit_transform(train_data).unpack() + Y = to_categorical(Y) + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), + 'label': list(Y) }) + return mz.pack(df) + + +@pytest.fixture(scope='module') +def valid_data_processed(valid_data, preprocessor) -> mz.DataPack: + X, Y = preprocessor.transform(valid_data).unpack() + Y = to_categorical(Y) + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), + 'label': list(Y) }) + return mz.pack(df) + + +@pytest.fixture(scope='module') +def test_data_processed(test_data, preprocessor) -> mz.DataPack: + X, Y = preprocessor.transform(test_data).unpack() + Y = to_categorical(Y) + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), + 'label': list(Y) }) + return mz.pack(df) + + +@pytest.fixture(scope='module') +def train_generator(request, train_data_processed): + return mz.DataGenerator(train_data_processed) + + +@pytest.mark.slow +def test_duet(train_data_processed, + task, + train_generator, + valid_data_processed, + test_data_processed, + preprocessor): + """Test esim model.""" + # Create a esim model + esim = mz.models.ESIM() + input_shapes = preprocessor.context['input_shapes'] + embed_dimension = preprocessor.context['vocab_size'] + 1 + esim.params['input_shapes'] = input_shapes + esim.params['task'] = task + esim.params['embedding_input_dim'] = embed_dimension + esim.params['embedding_output_dim'] = 300 + esim.params['lstm_dim'] = 300 + esim.params['mlp_num_units'] = 300 + esim.params['mlp_num_layers'] = 0 + esim.params['mlp_num_fan_out'] = 300 + esim.params['mlp_activation_func'] = 'relu' + esim.params['dropout_rate'] = 0.5 + esim.guess_and_fill_missing_params() + esim.build() + esim.compile() + + x_valid, y_valid = valid_data_processed.unpack() + valid_eval = mz.callbacks.EvaluateAllMetrics(esim, + x_valid, + y_valid) + esim.fit_generator(train_generator, epochs=1, callbacks=[valid_eval]) + esim.save('.tmpdir') + + try: + esim = mz.load_model('.tmpdir') + x, y = test_data_processed.unpack() + results = esim.evaluate(x, y) + assert len(results) > 0 + finally: + shutil.rmtree('.tmpdir') From af8878ea1934bc1363e3c9bb1d367b219e449372 Mon Sep 17 00:00:00 2001 From: Crystina Date: Mon, 1 Apr 2019 23:46:52 -0400 Subject: [PATCH 008/100] moved esim to mz/contrib/model, change the import path from mz.engine to mz.engine.base_model --- matchzoo/{ => contrib}/models/esim.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename matchzoo/{ => contrib}/models/esim.py (99%) diff --git a/matchzoo/models/esim.py b/matchzoo/contrib/models/esim.py similarity index 99% rename from matchzoo/models/esim.py rename to matchzoo/contrib/models/esim.py index 04a1a944..2bb0f531 100644 --- a/matchzoo/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -5,10 +5,10 @@ import keras.backend as K import matchzoo as mz -from matchzoo import engine, preprocessors +from matchzoo import engine -class ESIM(engine.BaseModel): +class ESIM(engine.base_model.BaseModel): """ ESIM model. From 4dabb6c045eed7559c5a2735331f9529c59e3b0d Mon Sep 17 00:00:00 2001 From: Crystina Date: Tue, 2 Apr 2019 01:26:22 -0400 Subject: [PATCH 009/100] update import path --- matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/esim.py | 21 +++++++++++++-------- matchzoo/models/__init__.py | 1 - tests/inte_test/test_esim.py | 7 +++++-- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 6faa60bb..6a81f8f3 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1 +1,2 @@ from .match_lstm import MatchLSTM +from .esim import ESIM \ No newline at end of file diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index 2bb0f531..1f64a062 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -5,10 +5,15 @@ import keras.backend as K import matchzoo as mz -from matchzoo import engine -class ESIM(engine.base_model.BaseModel): +from matchzoo.engine.param import Param +from matchzoo.engine.base_model import BaseModel +from matchzoo.engine.param_table import ParamTable + + + +class ESIM(BaseModel): """ ESIM model. @@ -35,24 +40,24 @@ class ESIM(engine.base_model.BaseModel): """ @classmethod - def get_default_params(cls) -> engine.ParamTable: + def get_default_params(cls) -> ParamTable: """Get default parameters.""" params = super().get_default_params(with_embedding=True, with_multi_layer_perceptron=True) - params.add(engine.Param( + params.add(Param( name='dropout_rate', value=0.5, desc="The dropout rate for all fully-connected layer" )) - params.add(engine.Param( + params.add(Param( name='lstm_dim', value=300, desc="The dimension of LSTM layer." )) - params.add(engine.Param( + params.add(Param( name='mask_value', value=0, desc="The value would be regarded as pad" @@ -62,7 +67,7 @@ def get_default_params(cls) -> engine.ParamTable: def compile(self, optimizer=None): """ - Overwrite the engine.BaseModel.compile() to allow self-defined optimizer and learning rate + Overwrite the BaseModel.compile() to allow self-defined optimizer and learning rate Examples: >>> from matchzoo import models @@ -98,7 +103,7 @@ def _make_inputs(self) -> list: def _make_embedding_layer(self, name: str = 'embedding') -> keras.layers.Layer: """ - Overwrite the engine.BaseModel._make_embedding_layer to allow specifiying mask_zero + Overwrite the BaseModel._make_embedding_layer to allow specifiying mask_zero """ return keras.layers.Embedding( self._params['embedding_input_dim'], diff --git a/matchzoo/models/__init__.py b/matchzoo/models/__init__.py index 526c33f9..29516ab3 100644 --- a/matchzoo/models/__init__.py +++ b/matchzoo/models/__init__.py @@ -12,7 +12,6 @@ from .drmm import DRMM from .anmm import ANMM from .mvlstm import MVLSTM -from .esim import ESIM def list_available() -> list: diff --git a/tests/inte_test/test_esim.py b/tests/inte_test/test_esim.py index d72a6552..646b786b 100644 --- a/tests/inte_test/test_esim.py +++ b/tests/inte_test/test_esim.py @@ -6,6 +6,8 @@ import matchzoo as mz from keras.utils import to_categorical +from matchzoo.engine.base_task import BaseTask +from matchzoo.contrib.models import ESIM @pytest.fixture(scope='module') def train_data(): @@ -23,7 +25,7 @@ def test_data(): @pytest.fixture(scope='module') -def task(request) -> mz.engine.BaseTask: +def task(request) -> BaseTask: return mz.tasks.Classification(num_classes=2) @@ -82,7 +84,8 @@ def test_duet(train_data_processed, preprocessor): """Test esim model.""" # Create a esim model - esim = mz.models.ESIM() + # esim = mz.contrib.models.ESIM() + esim = ESIM() input_shapes = preprocessor.context['input_shapes'] embed_dimension = preprocessor.context['vocab_size'] + 1 esim.params['input_shapes'] = input_shapes From 1e83c2a69f9ffa973877908a6ffaae5a54c9f889 Mon Sep 17 00:00:00 2001 From: Crystina Date: Tue, 2 Apr 2019 08:23:41 -0400 Subject: [PATCH 010/100] update according to the PR comments and flake8 --- Makefile | 2 +- matchzoo/contrib/models/esim.py | 147 ++++++++++++++------------------ tests/inte_test/test_esim.py | 2 +- 3 files changed, 68 insertions(+), 83 deletions(-) diff --git a/Makefile b/Makefile index a7bd9a58..e2f4382b 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ init: pip install -r requirements.txt TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning -FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib +FLAKE_ARGS = ./matchzoo --exclude=__init__.py, matchzoo/contrib test: pytest $(TEST_ARGS) diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index 1f64a062..185e5154 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -1,18 +1,14 @@ -"""KNRM model.""" +"""ESIM model.""" import keras import tensorflow as tf -from keras.layers import * # Dense, Dot, Softmax, Concatenate, Embedding, LSTM, Bidirectional import keras.backend as K import matchzoo as mz - - from matchzoo.engine.param import Param from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param_table import ParamTable - class ESIM(BaseModel): """ ESIM model. @@ -27,20 +23,17 @@ class ESIM(BaseModel): >>> model.params['embedding_input_dim'] = 5000 >>> model.params['embedding_output_dim'] = 10 >>> model.params['embedding_trainable'] = False - - >>> model.params['mlp_num_layers'] = 0 # zero hidden layer (one output layer) + >>> model.params['mlp_num_layers'] = 0 >>> model.params['mlp_num_fan_out'] = 300 >>> model.params['mlp_activation_func'] = 'tanh' - - >>> model.params['mask_value'] = 0 + >>> model.params['mask_value'] = 0 >>> model.params['dropout_rate'] = 0.5 - >>> model.guess_and_fill_missing_params() >>> model.build() """ @classmethod - def get_default_params(cls) -> ParamTable: + def get_default_params(cls) -> ParamTable: """Get default parameters.""" params = super().get_default_params(with_embedding=True, with_multi_layer_perceptron=True) @@ -65,31 +58,7 @@ def get_default_params(cls) -> ParamTable: return params - def compile(self, optimizer=None): - """ - Overwrite the BaseModel.compile() to allow self-defined optimizer and learning rate - - Examples: - >>> from matchzoo import models - >>> model = models.Naive() - >>> model.guess_and_fill_missing_params(verbose=0) - >>> model.params['task'].metrics = ['mse', 'map'] - >>> model.params['task'].metrics - ['mse', mean_average_precision(0.0)] - >>> model.build() - >>> model.compile() - """ - if optimizer == None: - optimizer = self._params['optimizer'] - - self._backend.compile(optimizer=optimizer, - loss=self._params['task'].loss) - - def _make_inputs(self) -> list: - """ - prepare input from input dict - """ input_left = keras.layers.Input( name='text_left', shape=self._params['input_shapes'][0] @@ -100,36 +69,38 @@ def _make_inputs(self) -> list: ) return [input_left, input_right] - - def _make_embedding_layer(self, name: str = 'embedding') -> keras.layers.Layer: + def _make_embedding_layer(self, name='embedding') -> keras.layers.Layer: """ - Overwrite the BaseModel._make_embedding_layer to allow specifiying mask_zero + Overwrite the BaseModel._make_embedding_layer to allow + specifiying mask_zero. + + :param name: name for embedding layer, default 'embedding' """ return keras.layers.Embedding( self._params['embedding_input_dim'], self._params['embedding_output_dim'], trainable=self._params['embedding_trainable'], - mask_zero = True, + mask_zero=True, name=name ) - - def _expand_dim(self, inp, axis): + def _expand_dim(self, inp, axis) -> keras.layers.Layer: """ - Wrap keras.backend.expand_dims into a Lambda layer + Wrap keras.backend.expand_dims into a Lambda layer. + + :param inp: input tensor to expand the dimension + :param axis: the axis of new dimension """ return keras.layers.Lambda(lambda x: K.expand_dims(x, axis=axis))(inp) - def _make_atten_mask_layer(self) -> keras.layers.Layer: """ - make mask layer for attention weight matrix so that each word won't pay attention to timestep + Make mask layer for attention weight matrix so that + each word won't pay attention to timestep. """ return keras.layers.Lambda( lambda weight_mask: weight_mask[0] + (1.0 - weight_mask[1]) * -1e7, - name="atten_mask" - ) - + name="atten_mask") def _make_BiLSTM_layer(self, lstm_dim) -> keras.layers.Layer: """ @@ -138,40 +109,42 @@ def _make_BiLSTM_layer(self, lstm_dim) -> keras.layers.Layer: :param lstm_dim: int, dimension of LSTM layer :return: `keras.layers.Layer`. """ - return Bidirectional(layer=LSTM(lstm_dim, return_sequences=True), - merge_mode='concat') - + return keras.layers.Bidirectional( + layer=keras.layers.LSTM(lstm_dim, return_sequences=True), + merge_mode='concat') - def _max(self, texts, mask): + def _max(self, texts, mask) -> tf.Tensor: """ Compute the max of each text according to their real length :param texts: np.array with shape [B, T, H] - :param lengths: np.array with shape [B, T, ], where 1 means valid, 0 means pad + :param lengths: np.array with shape [B, T, ], + where 1 means valid, 0 means pad """ mask = self._expand_dim(mask, axis=2) - new_texts = Multiply()([texts, mask]) + new_texts = keras.layers.Multiply()([texts, mask]) - text_max = Lambda( + text_max = keras.layers.Lambda( lambda x: K.max(x, axis=1), )(new_texts) return text_max - - def _avg(self, texts, mask): + def _avg(self, texts, mask) -> tf.Tensor: """ Compute the mean of each text according to their real length :param texts: np.array with shape [B, T, H] - :param lengths: np.array with shape [B, T, ], where 1 means valid, 0 means pad + :param lengths: np.array with shape [B, T, ], + where 1 means valid, 0 means pad """ mask = self._expand_dim(mask, axis=2) - new_texts = Multiply()([texts, mask]) + new_texts = keras.layers.Multiply()([texts, mask]) # timestep-wise division, exclude the PAD number when calc avg text_avg = keras.layers.Lambda( - lambda text_mask: K.sum(text_mask[0], axis=1) / K.sum(text_mask[1], axis=1), + lambda text_mask: + K.sum(text_mask[0], axis=1) / K.sum(text_mask[1], axis=1), )([new_texts, mask]) return text_avg @@ -184,13 +157,17 @@ def build(self): dropout_rate = self._params['dropout_rate'] # layers - create_mask = Lambda(lambda x: K.cast(K.not_equal(x, self._params['mask_value']), K.floatx())) + create_mask = keras.layers.Lambda( + lambda x: + K.cast(K.not_equal(x, self._params['mask_value']), K.floatx()) + ) embedding = self._make_embedding_layer() lstm_compare = self._make_BiLSTM_layer(lstm_dim) lstm_compose = self._make_BiLSTM_layer(lstm_dim) - dense_compare = Dense(units=lstm_dim, activation='relu', use_bias=True) - dropout = Dropout(dropout_rate) - + dense_compare = keras.layers.Dense(units=lstm_dim, + activation='relu', + use_bias=True) + dropout = keras.layers.Dropout(dropout_rate) # model a, b = self._make_inputs() # [B, T_a], [B, T_b] @@ -206,36 +183,43 @@ def build(self): a_ = lstm_compare(a_emb) # [B, T_a, H*2] b_ = lstm_compare(b_emb) # [B, T_b, H*2] - ######################## # local inference ######################## # similarity matrix - e = Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] - _ab_mask = Multiply()([self._expand_dim(a_mask, axis=2), # [B, T_a, 1] - self._expand_dim(b_mask, axis=1)]) # [B, 1, T_b] + e = keras.layers.Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] + _ab_mask = keras.layers.Multiply()( + [self._expand_dim(a_mask, axis=2), # [B, T_a, 1] + self._expand_dim(b_mask, axis=1)]) # [B, 1, T_b] # _ab_mask: [B, T_a, T_b] - pm = Permute((2, 1)) + pm = keras.layers.Permute((2, 1)) mask_layer = self._make_atten_mask_layer() - softmax_layer = Softmax(axis=-1) + softmax_layer = keras.layers.Softmax(axis=-1) e_a = softmax_layer(mask_layer([e, _ab_mask])) # [B, T_a, T_b] e_b = softmax_layer(mask_layer([pm(e), pm(_ab_mask)])) # [B, T_b, T_a] # alignment (a_t = a~, b_t = b~ ) - a_t = Dot(axes=(2, 1))([e_a, b_]) # [B, T_a, H*2] - b_t = Dot(axes=(2, 1))([e_b, a_]) # [B, T_b, H*2] + a_t = keras.layers.Dot(axes=(2, 1))([e_a, b_]) # [B, T_a, H*2] + b_t = keras.layers.Dot(axes=(2, 1))([e_b, a_]) # [B, T_b, H*2] # local inference info enhancement - m_a = Concatenate(axis=-1)([a_, a_t, Subtract()([a_, a_t]), Multiply()([a_, a_t])]) # [B, T_a, H*2*4] - m_b = Concatenate(axis=-1)([b_, b_t, Subtract()([b_, b_t]), Multiply()([b_, b_t])]) # [B, T_b, H*2*4] + m_a = keras.layers.Concatenate(axis=-1)([ + a_, + a_t, + keras.layers.Subtract()([a_, a_t]), + keras.layers.Multiply()([a_, a_t])]) # [B, T_a, H*2*4] + m_b = keras.layers.Concatenate(axis=-1)([ + b_, + b_t, + keras.layers.Subtract()([b_, b_t]), + keras.layers.Multiply()([b_, b_t])]) # [B, T_b, H*2*4] # project m_a and m_b from 4*H*2 dim to H dim m_a = dropout(dense_compare(m_a)) # [B, T_a, H] m_b = dropout(dense_compare(m_b)) # [B, T_a, H] - ######################## # inference composition ######################## @@ -243,14 +227,15 @@ def build(self): v_b = lstm_compose(m_b) # [B, T_b, H*2] # pooling - v_a = Concatenate(axis=-1)([self._avg(v_a, a_mask), self._max(v_a, a_mask)]) # [B, H*4] - v_b = Concatenate(axis=-1)([self._avg(v_b, b_mask), self._max(v_b, b_mask)]) # [B, H*4] - v = Concatenate(axis=-1)([v_a, v_b]) # [B, H*8] + v_a = keras.layers.Concatenate(axis=-1)( + [self._avg(v_a, a_mask), self._max(v_a, a_mask)]) # [B, H*4] + v_b = keras.layers.Concatenate(axis=-1)( + [self._avg(v_b, b_mask), self._max(v_b, b_mask)]) # [B, H*4] + v = keras.layers.Concatenate(axis=-1)([v_a, v_b]) # [B, H*8] # mlp (multilayer perceptron) classifier - output = dropout(self._make_multi_layer_perceptron_layer()(v)) # [B, H] - output = self._make_output_layer()(output) # [B, #classes] + output = self._make_multi_layer_perceptron_layer()(v) # [B, H] + output = dropout(output) + output = self._make_output_layer()(output) # [B, #classes] self._backend = keras.Model(inputs=[a, b], outputs=output) - - diff --git a/tests/inte_test/test_esim.py b/tests/inte_test/test_esim.py index 646b786b..d5d4c39f 100644 --- a/tests/inte_test/test_esim.py +++ b/tests/inte_test/test_esim.py @@ -3,9 +3,9 @@ import pytest import numpy as np import pandas as pd -import matchzoo as mz from keras.utils import to_categorical +import matchzoo as mz from matchzoo.engine.base_task import BaseTask from matchzoo.contrib.models import ESIM From 772855174bb5316e0a6f079d6d2864d0449fb61e Mon Sep 17 00:00:00 2001 From: Crystina Date: Tue, 2 Apr 2019 14:26:58 -0400 Subject: [PATCH 011/100] undo the change on makefile, add type hint for each function parameters, removed the redundant white line and comment line --- Makefile | 2 +- matchzoo/contrib/models/esim.py | 26 +++++++++----------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index e2f4382b..a7bd9a58 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ init: pip install -r requirements.txt TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning -FLAKE_ARGS = ./matchzoo --exclude=__init__.py, matchzoo/contrib +FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib test: pytest $(TEST_ARGS) diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index 185e5154..d3856c6a 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -69,9 +69,10 @@ def _make_inputs(self) -> list: ) return [input_left, input_right] - def _make_embedding_layer(self, name='embedding') -> keras.layers.Layer: + def _make_embedding_layer(self, + name: str = 'embedding') -> keras.layers.Layer: """ - Overwrite the BaseModel._make_embedding_layer to allow + Overwrite the :meth:`BaseModel._make_embedding_layer` to allow specifiying mask_zero. :param name: name for embedding layer, default 'embedding' @@ -84,7 +85,7 @@ def _make_embedding_layer(self, name='embedding') -> keras.layers.Layer: name=name ) - def _expand_dim(self, inp, axis) -> keras.layers.Layer: + def _expand_dim(self, inp: tf.Tensor, axis: int) -> keras.layers.Layer: """ Wrap keras.backend.expand_dims into a Lambda layer. @@ -102,7 +103,7 @@ def _make_atten_mask_layer(self) -> keras.layers.Layer: lambda weight_mask: weight_mask[0] + (1.0 - weight_mask[1]) * -1e7, name="atten_mask") - def _make_BiLSTM_layer(self, lstm_dim) -> keras.layers.Layer: + def _make_BiLSTM_layer(self, lstm_dim: int) -> keras.layers.Layer: """ Bidirectional LSTM layer in ESIM. @@ -113,7 +114,7 @@ def _make_BiLSTM_layer(self, lstm_dim) -> keras.layers.Layer: layer=keras.layers.LSTM(lstm_dim, return_sequences=True), merge_mode='concat') - def _max(self, texts, mask) -> tf.Tensor: + def _max(self, texts: tf.Tensor, mask: tf.Tensor) -> tf.Tensor: """ Compute the max of each text according to their real length @@ -130,7 +131,7 @@ def _max(self, texts, mask) -> tf.Tensor: return text_max - def _avg(self, texts, mask) -> tf.Tensor: + def _avg(self, texts: tf.Tensor, mask: tf.Tensor) -> tf.Tensor: """ Compute the mean of each text according to their real length @@ -151,7 +152,6 @@ def _avg(self, texts, mask) -> tf.Tensor: def build(self): """Build model.""" - # parameters lstm_dim = self._params['lstm_dim'] dropout_rate = self._params['dropout_rate'] @@ -174,24 +174,18 @@ def build(self): a_mask = create_mask(a) # [B, T_a] b_mask = create_mask(b) # [B, T_b] - ######################## # encoding - ######################## a_emb = dropout(embedding(a)) # [B, T_a, E_dim] b_emb = dropout(embedding(b)) # [B, T_b, E_dim] a_ = lstm_compare(a_emb) # [B, T_a, H*2] b_ = lstm_compare(b_emb) # [B, T_b, H*2] - ######################## # local inference - ######################## - # similarity matrix - e = keras.layers.Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] - _ab_mask = keras.layers.Multiply()( + e = keras.layers.Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] + _ab_mask = keras.layers.Multiply()( # _ab_mask: [B, T_a, T_b] [self._expand_dim(a_mask, axis=2), # [B, T_a, 1] self._expand_dim(b_mask, axis=1)]) # [B, 1, T_b] - # _ab_mask: [B, T_a, T_b] pm = keras.layers.Permute((2, 1)) mask_layer = self._make_atten_mask_layer() @@ -220,9 +214,7 @@ def build(self): m_a = dropout(dense_compare(m_a)) # [B, T_a, H] m_b = dropout(dense_compare(m_b)) # [B, T_a, H] - ######################## # inference composition - ######################## v_a = lstm_compose(m_a) # [B, T_a, H*2] v_b = lstm_compose(m_b) # [B, T_b, H*2] From fb81d9a5f6e93654abf41efafbfda84c0ac068bf Mon Sep 17 00:00:00 2001 From: rgtjf Date: Wed, 3 Apr 2019 16:38:41 +0800 Subject: [PATCH 012/100] hotfix: name bimpm -> BiMpM --- matchzoo/contrib/models/__init__.py | 2 +- matchzoo/contrib/models/bimpm_model.py | 30 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index f7970f85..257d11c3 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,2 +1,2 @@ from .match_lstm import MatchLSTM -from .bimpm_model import BimpmModel +from .bimpm_model import BiMpM diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index 105e58fb..6db88201 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -1,4 +1,4 @@ -"""Bimpm.""" +"""BiMpM.""" from keras.models import Model from keras.layers import Dense, Concatenate, Dropout @@ -10,15 +10,15 @@ from matchzoo.contrib.layers import MultiPerspectiveLayer -class BimpmModel(BaseModel): +class BiMpM(BaseModel): """ - BimpmModel. + BiMpM. Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L43-L186 Examples: >>> import matchzoo as mz - >>> model = mz.contrib.models.BimpmModel() + >>> model = mz.contrib.models.BiMpM() >>> model.guess_and_fill_missing_params(verbose=0) >>> model.build() @@ -30,19 +30,19 @@ def get_default_params(cls) -> ParamTable: params = super().get_default_params(with_embedding=True) params['optimizer'] = 'adam' - params.add(Param('dim_word_embedding', 50)) - # TODO(tjf): remove the unused params in the final version - params.add(Param('dim_char_embedding', 50)) - params.add(Param('word_embedding_mat')) - params.add(Param('char_embedding_mat')) - params.add(Param('embedding_random_scale', 0.2)) - params.add(Param('activation_embedding', 'softmax')) + # params.add(Param('dim_word_embedding', 50)) + # TODO(tjf): remove unused params in the final version + # params.add(Param('dim_char_embedding', 50)) + # params.add(Param('word_embedding_mat')) + # params.add(Param('char_embedding_mat')) + # params.add(Param('embedding_random_scale', 0.2)) + # params.add(Param('activation_embedding', 'softmax')) - # Bimpm Setting + # BiMpM Setting params.add(Param('perspective', {'full': True, - 'max-pooling': True, - 'attentive': True, - 'max-attentive': True})) + 'max-pooling': True, + 'attentive': True, + 'max-attentive': True})) params.add(Param('mp_dim', 20)) params.add(Param('att_dim', 20)) params.add(Param('hidden_size', 128)) From f67df4cb6d32c2cb8fdba553e5f9be263e1d8fd3 Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 3 Apr 2019 17:39:23 +0800 Subject: [PATCH 013/100] Update test models. The old test_models.py is too time consuming and frequently exceeds the CI time limit. Thus this change. --- tests/unit_test/models/test_models.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/unit_test/models/test_models.py b/tests/unit_test/models/test_models.py index ecf3da20..7ecd9c79 100644 --- a/tests/unit_test/models/test_models.py +++ b/tests/unit_test/models/test_models.py @@ -31,7 +31,7 @@ def model_class(request): @pytest.fixture(scope='module') def embedding(): - return mz.datasets.embeddings.load_glove_embedding(dimension=50) + return mz.datasets.toy.load_embedding() @pytest.fixture(scope='module') @@ -65,19 +65,19 @@ def embedding_matrix(setup): @pytest.fixture(scope='module') -def gen(train_raw, preprocessor, gen_builder): - return gen_builder.build(preprocessor.transform(train_raw)) +def data(train_raw, preprocessor, gen_builder): + return gen_builder.build(preprocessor.transform(train_raw))[0] @pytest.mark.slow -def test_model_fit_eval_predict(model, gen): - x, y = gen[0] - assert model.fit(x, y, verbose=0) - assert model.evaluate(x, y) - assert model.predict(x) is not None +def test_model_fit_eval_predict(model, data): + x, y = data + assert model.fit(x, y, batch_size=len(x), verbose=0) + assert model.evaluate(x, y, batch_size=len(x)) + assert model.predict(x, batch_size=len(x)) is not None -@pytest.mark.slow +@pytest.mark.skip('too time consuming, need a better way to test this') def test_save_load_model(model): tmpdir = '.matchzoo_test_save_load_tmpdir' @@ -94,7 +94,7 @@ def test_save_load_model(model): shutil.rmtree(tmpdir) -@pytest.mark.slow +@pytest.mark.skip('too time consuming, need a better way to test this') def test_hyper_space(model): for _ in range(8): new_params = copy.deepcopy(model.params) From 52c95e733edfa1d7ed89aa359029c8024ec06961 Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 3 Apr 2019 17:51:51 +0800 Subject: [PATCH 014/100] Fix tuner callback save model must specify path bug. --- matchzoo/auto/tuner/callbacks/save_model.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/matchzoo/auto/tuner/callbacks/save_model.py b/matchzoo/auto/tuner/callbacks/save_model.py index 808f48a1..e50d5aef 100644 --- a/matchzoo/auto/tuner/callbacks/save_model.py +++ b/matchzoo/auto/tuner/callbacks/save_model.py @@ -21,9 +21,12 @@ class SaveModel(Callback): """ - def __init__(self, dir_path: typing.Union[str, Path]): + def __init__( + self, + dir_path: typing.Union[str, Path] = mz.USER_TUNED_MODELS_DIR + ): """Init.""" - self._dir_path = dir_path or mz.USER_TUNED_MODELS_DIR + self._dir_path = dir_path def on_run_end(self, tuner, model: BaseModel, result: dict): """Save model on run end.""" From 5fd1e83af56b00aba7fa1502aaea946e668cdc6f Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 3 Apr 2019 19:25:05 +0800 Subject: [PATCH 015/100] Update test_models.py batch_size. --- tests/unit_test/models/test_models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/unit_test/models/test_models.py b/tests/unit_test/models/test_models.py index 7ecd9c79..e4fc35e4 100644 --- a/tests/unit_test/models/test_models.py +++ b/tests/unit_test/models/test_models.py @@ -72,9 +72,10 @@ def data(train_raw, preprocessor, gen_builder): @pytest.mark.slow def test_model_fit_eval_predict(model, data): x, y = data - assert model.fit(x, y, batch_size=len(x), verbose=0) - assert model.evaluate(x, y, batch_size=len(x)) - assert model.predict(x, batch_size=len(x)) is not None + batch_size = len(x['id_left']) + assert model.fit(x, y, batch_size=batch_size, verbose=0) + assert model.evaluate(x, y, batch_size=batch_size) + assert model.predict(x, batch_size=batch_size) is not None @pytest.mark.skip('too time consuming, need a better way to test this') From 3373f0d3c88ef575456a77807a6d885a76690496 Mon Sep 17 00:00:00 2001 From: wsdm2019-dapa Date: Wed, 3 Apr 2019 20:54:20 +0800 Subject: [PATCH 016/100] rename BiMpM as BiMPM --- matchzoo/contrib/models/__init__.py | 2 +- matchzoo/contrib/models/bimpm_model.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 257d11c3..645edd16 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,2 +1,2 @@ from .match_lstm import MatchLSTM -from .bimpm_model import BiMpM +from .bimpm_model import BiMPM diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm_model.py index 6db88201..d795889e 100644 --- a/matchzoo/contrib/models/bimpm_model.py +++ b/matchzoo/contrib/models/bimpm_model.py @@ -1,4 +1,4 @@ -"""BiMpM.""" +"""BiMPM.""" from keras.models import Model from keras.layers import Dense, Concatenate, Dropout @@ -10,15 +10,15 @@ from matchzoo.contrib.layers import MultiPerspectiveLayer -class BiMpM(BaseModel): +class BiMPM(BaseModel): """ - BiMpM. + BiMPM. Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/SentenceMatchModelGraph.py#L43-L186 Examples: >>> import matchzoo as mz - >>> model = mz.contrib.models.BiMpM() + >>> model = mz.contrib.models.BiMPM() >>> model.guess_and_fill_missing_params(verbose=0) >>> model.build() @@ -38,7 +38,7 @@ def get_default_params(cls) -> ParamTable: # params.add(Param('embedding_random_scale', 0.2)) # params.add(Param('activation_embedding', 'softmax')) - # BiMpM Setting + # BiMPM Setting params.add(Param('perspective', {'full': True, 'max-pooling': True, 'attentive': True, From f4ef6462de723d1f6ea961a7de55174869b57133 Mon Sep 17 00:00:00 2001 From: Crystina Date: Sat, 6 Apr 2019 01:19:39 -0400 Subject: [PATCH 017/100] add mask on a_ and b_ and test file typo according to pr review, yet spatial mask is not added --- matchzoo/contrib/models/esim.py | 7 ++++++- tests/inte_test/test_esim.py | 32 ++++++++++++++++---------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index d3856c6a..d9cf96ab 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -28,6 +28,7 @@ class ESIM(BaseModel): >>> model.params['mlp_activation_func'] = 'tanh' >>> model.params['mask_value'] = 0 >>> model.params['dropout_rate'] = 0.5 + >>> model.params['optimizer'] = keras.optimizers.Adam(lr=4e-4) >>> model.guess_and_fill_missing_params() >>> model.build() """ @@ -69,7 +70,7 @@ def _make_inputs(self) -> list: ) return [input_left, input_right] - def _make_embedding_layer(self, + def _make_embedding_layer(self, name: str = 'embedding') -> keras.layers.Layer: """ Overwrite the :meth:`BaseModel._make_embedding_layer` to allow @@ -181,6 +182,10 @@ def build(self): a_ = lstm_compare(a_emb) # [B, T_a, H*2] b_ = lstm_compare(b_emb) # [B, T_b, H*2] + # mask a_ and b_, since the position is no more zero + a_ = keras.layers.Multiply()([a_, self._expand_dim(a_mask, axis=2)]) + b_ = keras.layers.Multiply()([b_, self._expand_dim(b_mask, axis=2)]) + # local inference e = keras.layers.Dot(axes=-1)([a_, b_]) # [B, T_a, T_b] _ab_mask = keras.layers.Multiply()( # _ab_mask: [B, T_a, T_b] diff --git a/tests/inte_test/test_esim.py b/tests/inte_test/test_esim.py index d5d4c39f..6cd86f9e 100644 --- a/tests/inte_test/test_esim.py +++ b/tests/inte_test/test_esim.py @@ -12,7 +12,7 @@ @pytest.fixture(scope='module') def train_data(): return mz.datasets.toy.load_data(stage='train') - + @pytest.fixture(scope='module') def valid_data(): @@ -38,10 +38,10 @@ def preprocessor(): def train_data_processed(train_data, preprocessor) -> mz.DataPack: X, Y = preprocessor.fit_transform(train_data).unpack() Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), 'label': list(Y) }) return mz.pack(df) @@ -50,10 +50,10 @@ def train_data_processed(train_data, preprocessor) -> mz.DataPack: def valid_data_processed(valid_data, preprocessor) -> mz.DataPack: X, Y = preprocessor.transform(valid_data).unpack() Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), 'label': list(Y) }) return mz.pack(df) @@ -62,10 +62,10 @@ def valid_data_processed(valid_data, preprocessor) -> mz.DataPack: def test_data_processed(test_data, preprocessor) -> mz.DataPack: X, Y = preprocessor.transform(test_data).unpack() Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), + df = pd.DataFrame(data = { 'id_left': list(X['id_left']), + 'text_left': list(X['text_left']), + 'id_right': list(X['id_right']), + 'text_right': list(X['text_right']), 'label': list(Y) }) return mz.pack(df) @@ -76,7 +76,7 @@ def train_generator(request, train_data_processed): @pytest.mark.slow -def test_duet(train_data_processed, +def test_esim(train_data_processed, task, train_generator, valid_data_processed, @@ -101,14 +101,14 @@ def test_duet(train_data_processed, esim.guess_and_fill_missing_params() esim.build() esim.compile() - + x_valid, y_valid = valid_data_processed.unpack() valid_eval = mz.callbacks.EvaluateAllMetrics(esim, x_valid, y_valid) esim.fit_generator(train_generator, epochs=1, callbacks=[valid_eval]) esim.save('.tmpdir') - + try: esim = mz.load_model('.tmpdir') x, y = test_data_processed.unpack() From 719ba374ff21e4232bf40e65b5a60d551b3916b4 Mon Sep 17 00:00:00 2001 From: Crystina Date: Sun, 7 Apr 2019 11:07:24 -0400 Subject: [PATCH 018/100] remove _make_input, change function name to be all lower case, removed test_esim file --- matchzoo/contrib/models/esim.py | 17 +---- tests/inte_test/test_esim.py | 118 -------------------------------- 2 files changed, 3 insertions(+), 132 deletions(-) delete mode 100644 tests/inte_test/test_esim.py diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index d9cf96ab..b92bfe2f 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -59,17 +59,6 @@ def get_default_params(cls) -> ParamTable: return params - def _make_inputs(self) -> list: - input_left = keras.layers.Input( - name='text_left', - shape=self._params['input_shapes'][0] - ) - input_right = keras.layers.Input( - name='text_right', - shape=self._params['input_shapes'][1] - ) - return [input_left, input_right] - def _make_embedding_layer(self, name: str = 'embedding') -> keras.layers.Layer: """ @@ -104,7 +93,7 @@ def _make_atten_mask_layer(self) -> keras.layers.Layer: lambda weight_mask: weight_mask[0] + (1.0 - weight_mask[1]) * -1e7, name="atten_mask") - def _make_BiLSTM_layer(self, lstm_dim: int) -> keras.layers.Layer: + def _make_bilstm_layer(self, lstm_dim: int) -> keras.layers.Layer: """ Bidirectional LSTM layer in ESIM. @@ -163,8 +152,8 @@ def build(self): K.cast(K.not_equal(x, self._params['mask_value']), K.floatx()) ) embedding = self._make_embedding_layer() - lstm_compare = self._make_BiLSTM_layer(lstm_dim) - lstm_compose = self._make_BiLSTM_layer(lstm_dim) + lstm_compare = self._make_bilstm_layer(lstm_dim) + lstm_compose = self._make_bilstm_layer(lstm_dim) dense_compare = keras.layers.Dense(units=lstm_dim, activation='relu', use_bias=True) diff --git a/tests/inte_test/test_esim.py b/tests/inte_test/test_esim.py deleted file mode 100644 index 6cd86f9e..00000000 --- a/tests/inte_test/test_esim.py +++ /dev/null @@ -1,118 +0,0 @@ -import shutil - -import pytest -import numpy as np -import pandas as pd -from keras.utils import to_categorical - -import matchzoo as mz -from matchzoo.engine.base_task import BaseTask -from matchzoo.contrib.models import ESIM - -@pytest.fixture(scope='module') -def train_data(): - return mz.datasets.toy.load_data(stage='train') - - -@pytest.fixture(scope='module') -def valid_data(): - return mz.datasets.toy.load_data(stage='dev') - - -@pytest.fixture(scope='module') -def test_data(): - return mz.datasets.toy.load_data(stage='test') - - -@pytest.fixture(scope='module') -def task(request) -> BaseTask: - return mz.tasks.Classification(num_classes=2) - - -@pytest.fixture(scope='module') -def preprocessor(): - return mz.preprocessors.BasicPreprocessor() - - -@pytest.fixture(scope='module') -def train_data_processed(train_data, preprocessor) -> mz.DataPack: - X, Y = preprocessor.fit_transform(train_data).unpack() - Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), - 'label': list(Y) }) - return mz.pack(df) - - -@pytest.fixture(scope='module') -def valid_data_processed(valid_data, preprocessor) -> mz.DataPack: - X, Y = preprocessor.transform(valid_data).unpack() - Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), - 'label': list(Y) }) - return mz.pack(df) - - -@pytest.fixture(scope='module') -def test_data_processed(test_data, preprocessor) -> mz.DataPack: - X, Y = preprocessor.transform(test_data).unpack() - Y = to_categorical(Y) - df = pd.DataFrame(data = { 'id_left': list(X['id_left']), - 'text_left': list(X['text_left']), - 'id_right': list(X['id_right']), - 'text_right': list(X['text_right']), - 'label': list(Y) }) - return mz.pack(df) - - -@pytest.fixture(scope='module') -def train_generator(request, train_data_processed): - return mz.DataGenerator(train_data_processed) - - -@pytest.mark.slow -def test_esim(train_data_processed, - task, - train_generator, - valid_data_processed, - test_data_processed, - preprocessor): - """Test esim model.""" - # Create a esim model - # esim = mz.contrib.models.ESIM() - esim = ESIM() - input_shapes = preprocessor.context['input_shapes'] - embed_dimension = preprocessor.context['vocab_size'] + 1 - esim.params['input_shapes'] = input_shapes - esim.params['task'] = task - esim.params['embedding_input_dim'] = embed_dimension - esim.params['embedding_output_dim'] = 300 - esim.params['lstm_dim'] = 300 - esim.params['mlp_num_units'] = 300 - esim.params['mlp_num_layers'] = 0 - esim.params['mlp_num_fan_out'] = 300 - esim.params['mlp_activation_func'] = 'relu' - esim.params['dropout_rate'] = 0.5 - esim.guess_and_fill_missing_params() - esim.build() - esim.compile() - - x_valid, y_valid = valid_data_processed.unpack() - valid_eval = mz.callbacks.EvaluateAllMetrics(esim, - x_valid, - y_valid) - esim.fit_generator(train_generator, epochs=1, callbacks=[valid_eval]) - esim.save('.tmpdir') - - try: - esim = mz.load_model('.tmpdir') - x, y = test_data_processed.unpack() - results = esim.evaluate(x, y) - assert len(results) > 0 - finally: - shutil.rmtree('.tmpdir') From a03461ec5320bf0c731b64456c738d78c27167ca Mon Sep 17 00:00:00 2001 From: uduse Date: Mon, 8 Apr 2019 18:38:09 +0800 Subject: [PATCH 019/100] Propagate keyword arguments to `keras.layers.Embedding` to support things like masking (e.g. #673). --- matchzoo/engine/base_model.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/matchzoo/engine/base_model.py b/matchzoo/engine/base_model.py index bc77e41b..f716e33e 100644 --- a/matchzoo/engine/base_model.py +++ b/matchzoo/engine/base_model.py @@ -505,13 +505,17 @@ def _make_output_layer(self) -> keras.layers.Layer: raise ValueError(f"{task} is not a valid task type." f"Must be in `Ranking` and `Classification`.") - def _make_embedding_layer(self, name: str = 'embedding' - ) -> keras.layers.Layer: + def _make_embedding_layer( + self, + name: str = 'embedding', + **kwargs + ) -> keras.layers.Layer: return keras.layers.Embedding( self._params['embedding_input_dim'], self._params['embedding_output_dim'], trainable=self._params['embedding_trainable'], - name=name + name=name, + **kwargs ) def _make_multi_layer_perceptron_layer(self) -> keras.layers.Layer: From 537fb4e09a40935057a060a059e0f7fbd6aa7cfa Mon Sep 17 00:00:00 2001 From: uduse Date: Tue, 9 Apr 2019 17:12:10 +0800 Subject: [PATCH 020/100] Add base model doc tests. --- matchzoo/engine/base_model.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/matchzoo/engine/base_model.py b/matchzoo/engine/base_model.py index f716e33e..9669cec9 100644 --- a/matchzoo/engine/base_model.py +++ b/matchzoo/engine/base_model.py @@ -405,6 +405,17 @@ def save(self, dirpath: typing.Union[str, Path]): h5 file saved by `keras`. :param dirpath: directory path of the saved model + + Example: + + >>> import matchzoo as mz + >>> model = mz.models.Naive() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.build() + >>> model.save('temp-model') + >>> import shutil + >>> shutil.rmtree('temp-model') + """ dirpath = Path(dirpath) params_path = dirpath.joinpath(self.PARAMS_FILENAME) @@ -541,6 +552,19 @@ def load_model(dirpath: typing.Union[str, Path]) -> BaseModel: :param dirpath: directory path of the saved model :return: a :class:`BaseModel` instance + + Example: + + >>> import matchzoo as mz + >>> model = mz.models.Naive() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.build() + >>> model.save('temp-model') + >>> model.params.keys() == mz.load_model('temp-model').params.keys() + True + >>> import shutil + >>> shutil.rmtree('temp-model') + """ dirpath = Path(dirpath) From 6dceb819f86fd469a4d817dec0156646a5f574cf Mon Sep 17 00:00:00 2001 From: uduse Date: Tue, 9 Apr 2019 17:12:31 +0800 Subject: [PATCH 021/100] Update data generator lambda callback docs. --- .../data_generator/callbacks/lambda_callback.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/matchzoo/data_generator/callbacks/lambda_callback.py b/matchzoo/data_generator/callbacks/lambda_callback.py index 27797159..684171ba 100644 --- a/matchzoo/data_generator/callbacks/lambda_callback.py +++ b/matchzoo/data_generator/callbacks/lambda_callback.py @@ -8,10 +8,19 @@ class LambdaCallback(Callback): See :class:`matchzoo.data_generator.callbacks.Callback` for more details. Example: + + >>> import matchzoo as mz >>> from matchzoo.data_generator.callbacks import LambdaCallback - >>> callback = LambdaCallback(on_batch_unpacked=print) - >>> callback.on_batch_unpacked('x', 'y') - x y + >>> data = mz.datasets.toy.load_data() + >>> batch_func = lambda x: print(type(x)) + >>> unpack_func = lambda x, y: print(type(x), type(y)) + >>> callback = LambdaCallback(on_batch_data_pack=batch_func, + ... on_batch_unpacked=unpack_func) + >>> data_gen = mz.DataGenerator( + ... data, batch_size=len(data), callbacks=[callback]) + >>> _ = data_gen[0] + + """ From 7d642a0e5c934ee201fc96c03ea3e9a0259a9625 Mon Sep 17 00:00:00 2001 From: uduse Date: Tue, 9 Apr 2019 17:12:57 +0800 Subject: [PATCH 022/100] Add "cron" tests. --- Makefile | 9 ++++++--- tests/unit_test/test_datasets.py | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index a7bd9a58..8333c9df 100644 --- a/Makefile +++ b/Makefile @@ -9,10 +9,13 @@ test: flake8 $(FLAKE_ARGS) quick: - pytest -m 'not slow' $(TEST_ARGS) + pytest -m 'not slow and not cron' $(TEST_ARGS) ${ARGS} slow: - pytest -m 'slow' $(TEST_ARGS) + pytest -m 'slow and not cron' $(TEST_ARGS) ${ARGS} + +cron: + pytest -m 'cron' $(TEST_ARGS) ${ARGS} flake: - flake8 $(FLAKE_ARGS) + flake8 $(FLAKE_ARGS) ${ARGS} diff --git a/tests/unit_test/test_datasets.py b/tests/unit_test/test_datasets.py index 8781e444..03b44cc4 100644 --- a/tests/unit_test/test_datasets.py +++ b/tests/unit_test/test_datasets.py @@ -3,7 +3,7 @@ import matchzoo as mz -@pytest.mark.slow +@pytest.mark.cron def test_load_data(): train_data = mz.datasets.wiki_qa.load_data('train', task='ranking') assert len(train_data) == 20360 @@ -32,7 +32,7 @@ def test_load_data(): assert tag == [False, True] -@pytest.mark.slow +@pytest.mark.cron def test_load_snli(): train_data, classes = mz.datasets.snli.load_data('train', 'classification', @@ -60,7 +60,7 @@ def test_load_snli(): assert y.shape == (num_samples, 1) -@pytest.mark.slow +@pytest.mark.cron def test_load_quora_qp(): train_data = mz.datasets.quora_qp.load_data(task='classification') assert len(train_data) == 363177 From 2ee217426ddb09dde9959466f99923b724c8e1e1 Mon Sep 17 00:00:00 2001 From: uduse Date: Tue, 9 Apr 2019 17:50:16 +0800 Subject: [PATCH 023/100] Update testing mechanism. Separate tests into three categories: quick (normal), slow, and cron. --- Makefile | 43 ++++++++++++++++++++++++++- tests/unit_test/models/test_models.py | 4 +-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 8333c9df..82957121 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,41 @@ +# Usages: +# +# to install matchzoo dependencies: +# $ make init +# +# to run all matchzoo tests, recommended for big PRs and new versions: +# $ make test +# +# there are three kinds of tests: +# +# 1. "quick" tests +# - run in seconds +# - include all unit tests without marks and all doctests +# - for rapid prototyping +# - CI run this for all PRs +# +# 2. "slow" tests that run in minutes +# - run in minutes +# - include all unit tests marked "slow" +# - CI run this for all PRs +# +# 3. "cron" tests that not only slow, but also undeterministic (all tests marked "cron") +# - run in minutes and involves underministic behavoirs (e.g. network connection) +# - include all unit tests marked "cron" +# - CI run this on a daily basis +# +# to run quick tests, excluding time consuming tests and crons: +# $ make quick +# +# to run slow tests, excluding normal tests and crons: +# $ make slow +# +# to run crons: +# $ make cron +# +# to run docstring style check: +# $ make flake + init: pip install -r requirements.txt @@ -5,7 +43,7 @@ TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --co FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib test: - pytest $(TEST_ARGS) + pytest $(TEST_ARGS) ${ARGS} flake8 $(FLAKE_ARGS) quick: @@ -19,3 +57,6 @@ cron: flake: flake8 $(FLAKE_ARGS) ${ARGS} + +doc: + flake8 $(FLAKE_ARGS) ${ARGS} diff --git a/tests/unit_test/models/test_models.py b/tests/unit_test/models/test_models.py index e4fc35e4..3d6c994c 100644 --- a/tests/unit_test/models/test_models.py +++ b/tests/unit_test/models/test_models.py @@ -78,7 +78,7 @@ def test_model_fit_eval_predict(model, data): assert model.predict(x, batch_size=batch_size) is not None -@pytest.mark.skip('too time consuming, need a better way to test this') +@pytest.mark.cron def test_save_load_model(model): tmpdir = '.matchzoo_test_save_load_tmpdir' @@ -95,7 +95,7 @@ def test_save_load_model(model): shutil.rmtree(tmpdir) -@pytest.mark.skip('too time consuming, need a better way to test this') +@pytest.mark.cron def test_hyper_space(model): for _ in range(8): new_params = copy.deepcopy(model.params) From e48cb7d29e6b47b582dc52c0e3504294a1dc1f48 Mon Sep 17 00:00:00 2001 From: fanyixing Date: Tue, 9 Apr 2019 20:01:43 +0800 Subject: [PATCH 024/100] rename bimpm --- matchzoo/contrib/models/__init__.py | 2 +- matchzoo/contrib/models/{bimpm_model.py => bimpm.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename matchzoo/contrib/models/{bimpm_model.py => bimpm.py} (100%) diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 645edd16..90d19dd2 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,2 +1,2 @@ from .match_lstm import MatchLSTM -from .bimpm_model import BiMPM +from .bimpm import BiMPM diff --git a/matchzoo/contrib/models/bimpm_model.py b/matchzoo/contrib/models/bimpm.py similarity index 100% rename from matchzoo/contrib/models/bimpm_model.py rename to matchzoo/contrib/models/bimpm.py From 5076fea877498e7a97dddf79a59a34350c659392 Mon Sep 17 00:00:00 2001 From: uduse Date: Tue, 9 Apr 2019 20:07:32 +0800 Subject: [PATCH 025/100] Fix line width style. --- matchzoo/engine/base_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matchzoo/engine/base_model.py b/matchzoo/engine/base_model.py index 9669cec9..c134bbb2 100644 --- a/matchzoo/engine/base_model.py +++ b/matchzoo/engine/base_model.py @@ -559,11 +559,11 @@ def load_model(dirpath: typing.Union[str, Path]) -> BaseModel: >>> model = mz.models.Naive() >>> model.guess_and_fill_missing_params(verbose=0) >>> model.build() - >>> model.save('temp-model') - >>> model.params.keys() == mz.load_model('temp-model').params.keys() + >>> model.save('my-model') + >>> model.params.keys() == mz.load_model('my-model').params.keys() True >>> import shutil - >>> shutil.rmtree('temp-model') + >>> shutil.rmtree('my-model') """ dirpath = Path(dirpath) From fe97b3b1f7fbf6a71beac1f034697bf4e9ae82e7 Mon Sep 17 00:00:00 2001 From: Crystina Date: Tue, 9 Apr 2019 16:32:51 -0400 Subject: [PATCH 026/100] remove the overriden make_emb --- matchzoo/contrib/models/esim.py | 16 ---------------- matchzoo/engine/base_model.py | 12 ++++++++---- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index b92bfe2f..4af0371c 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -59,22 +59,6 @@ def get_default_params(cls) -> ParamTable: return params - def _make_embedding_layer(self, - name: str = 'embedding') -> keras.layers.Layer: - """ - Overwrite the :meth:`BaseModel._make_embedding_layer` to allow - specifiying mask_zero. - - :param name: name for embedding layer, default 'embedding' - """ - return keras.layers.Embedding( - self._params['embedding_input_dim'], - self._params['embedding_output_dim'], - trainable=self._params['embedding_trainable'], - mask_zero=True, - name=name - ) - def _expand_dim(self, inp: tf.Tensor, axis: int) -> keras.layers.Layer: """ Wrap keras.backend.expand_dims into a Lambda layer. diff --git a/matchzoo/engine/base_model.py b/matchzoo/engine/base_model.py index bc77e41b..9692780b 100644 --- a/matchzoo/engine/base_model.py +++ b/matchzoo/engine/base_model.py @@ -505,15 +505,19 @@ def _make_output_layer(self) -> keras.layers.Layer: raise ValueError(f"{task} is not a valid task type." f"Must be in `Ranking` and `Classification`.") - def _make_embedding_layer(self, name: str = 'embedding' - ) -> keras.layers.Layer: + def _make_embedding_layer( + self, + name: str = 'embedding', + **kwargs, + ) -> keras.layers.Layer: return keras.layers.Embedding( self._params['embedding_input_dim'], self._params['embedding_output_dim'], trainable=self._params['embedding_trainable'], - name=name + name=name, + **kwargs ) - + def _make_multi_layer_perceptron_layer(self) -> keras.layers.Layer: # TODO: do not create new layers for a second call if not self._params['with_multi_layer_perceptron']: From 2488d9e39b8b83373237803e073c9894ef0cc594 Mon Sep 17 00:00:00 2001 From: faneshion Date: Wed, 10 Apr 2019 17:10:06 +0800 Subject: [PATCH 027/100] seperate OOV with PAD in the vocabulary (#693) * seperate OOV with PAD in the vocabulary * rename _PAD as PAD * and * oov and pad as member --- matchzoo/embedding/embedding.py | 6 +-- matchzoo/models/mvlstm.py | 2 +- matchzoo/preprocessors/basic_preprocessor.py | 4 +- matchzoo/preprocessors/cdssm_preprocessor.py | 2 +- matchzoo/preprocessors/dssm_preprocessor.py | 2 +- matchzoo/preprocessors/units/vocabulary.py | 49 +++++++++++--------- matchzoo/preprocessors/units/word_hashing.py | 16 ++++--- tests/unit_test/test_embedding.py | 6 +-- 8 files changed, 46 insertions(+), 41 deletions(-) diff --git a/matchzoo/embedding/embedding.py b/matchzoo/embedding/embedding.py index 3787f8bc..fb21af36 100644 --- a/matchzoo/embedding/embedding.py +++ b/matchzoo/embedding/embedding.py @@ -25,13 +25,13 @@ class Embedding(object): To load from a file: >>> embedding = mz.embedding.load_from_file(embed_path) >>> matrix = embedding.build_matrix(term_index) - >>> matrix.shape[0] == len(term_index) + 1 + >>> matrix.shape[0] == len(term_index) True To build your own: >>> data = pd.DataFrame(data=[[0, 1], [2, 3]], index=['A', 'B']) >>> embedding = mz.Embedding(data) - >>> matrix = embedding.build_matrix({'A': 2, 'B': 1}) + >>> matrix = embedding.build_matrix({'A': 2, 'B': 1, '_PAD': 0}) >>> matrix.shape == (3, 2) True @@ -70,7 +70,7 @@ def build_matrix( `(-0.2, 0.2)`). :return: A matrix. """ - input_dim = len(term_index) + 1 + input_dim = len(term_index) matrix = np.empty((input_dim, self.output_dim)) for index in np.ndindex(*matrix.shape): diff --git a/matchzoo/models/mvlstm.py b/matchzoo/models/mvlstm.py index dc896d83..fcd5f648 100644 --- a/matchzoo/models/mvlstm.py +++ b/matchzoo/models/mvlstm.py @@ -52,7 +52,7 @@ def build(self): query, doc = self._make_inputs() # Embedding layer - embedding = self._make_embedding_layer() + embedding = self._make_embedding_layer(mask_zero=True) embed_query = embedding(query) embed_doc = embedding(doc) diff --git a/matchzoo/preprocessors/basic_preprocessor.py b/matchzoo/preprocessors/basic_preprocessor.py index 0d8415c9..d14af9f2 100644 --- a/matchzoo/preprocessors/basic_preprocessor.py +++ b/matchzoo/preprocessors/basic_preprocessor.py @@ -44,7 +44,7 @@ class BasicPreprocessor(BasePreprocessor): >>> preprocessor.context['input_shapes'] [(10,), (20,)] >>> preprocessor.context['vocab_size'] - 225 + 226 >>> processed_train_data = preprocessor.transform(train_data, ... verbose=0) >>> type(processed_train_data) @@ -105,7 +105,7 @@ def fit(self, data_pack: DataPack, verbose: int = 1): vocab_unit = build_vocab_unit(data_pack, verbose=verbose) self._context['vocab_unit'] = vocab_unit - vocab_size = len(vocab_unit.state['term_index']) + 1 + vocab_size = len(vocab_unit.state['term_index']) self._context['vocab_size'] = vocab_size self._context['embedding_input_dim'] = vocab_size self._context['input_shapes'] = [(self._fixed_length_left,), diff --git a/matchzoo/preprocessors/cdssm_preprocessor.py b/matchzoo/preprocessors/cdssm_preprocessor.py index edeac4e9..d7f16754 100644 --- a/matchzoo/preprocessors/cdssm_preprocessor.py +++ b/matchzoo/preprocessors/cdssm_preprocessor.py @@ -73,7 +73,7 @@ def fit(self, data_pack: DataPack, verbose: int = 1): vocab_unit = build_vocab_unit(data_pack, verbose=verbose) self._context['vocab_unit'] = vocab_unit - vocab_size = len(vocab_unit.state['term_index']) + 1 + vocab_size = len(vocab_unit.state['term_index']) self._context['input_shapes'] = [ (self._fixed_length_left, vocab_size), (self._fixed_length_right, vocab_size) diff --git a/matchzoo/preprocessors/dssm_preprocessor.py b/matchzoo/preprocessors/dssm_preprocessor.py index 561cb2c2..2c0212a4 100644 --- a/matchzoo/preprocessors/dssm_preprocessor.py +++ b/matchzoo/preprocessors/dssm_preprocessor.py @@ -58,7 +58,7 @@ def fit(self, data_pack: DataPack, verbose: int = 1): vocab_unit = build_vocab_unit(data_pack, verbose=verbose) self._context['vocab_unit'] = vocab_unit - vocab_size = len(vocab_unit.state['term_index']) + 1 + vocab_size = len(vocab_unit.state['term_index']) self._context['vocab_size'] = vocab_size self._context['embedding_input_dim'] = vocab_size self._context['input_shapes'] = [(vocab_size,), (vocab_size,)] diff --git a/matchzoo/preprocessors/units/vocabulary.py b/matchzoo/preprocessors/units/vocabulary.py index c725c469..dbc6323c 100644 --- a/matchzoo/preprocessors/units/vocabulary.py +++ b/matchzoo/preprocessors/units/vocabulary.py @@ -5,20 +5,23 @@ class Vocabulary(StatefulUnit): """ Vocabulary class. + :param pad_value: The string value for the padding position. + :param oov_value: The string value for the out-of-vocabulary terms. + Examples: - >>> vocab = Vocabulary() + >>> vocab = Vocabulary(pad_value='[PAD]', oov_value='[OOV]') >>> vocab.fit(['A', 'B', 'C', 'D', 'E']) >>> term_index = vocab.state['term_index'] >>> term_index # doctest: +SKIP - {'E': 1, 'C': 2, 'D': 3, 'A': 4, 'B': 5} + {'[PAD]': 0, '[OOV]': 1, 'D': 2, 'A': 3, 'B': 4, 'C': 5, 'E': 6} >>> index_term = vocab.state['index_term'] >>> index_term # doctest: +SKIP - {1: 'C', 2: 'A', 3: 'E', 4: 'B', 5: 'D'} + {0: '[PAD]', 1: '[OOV]', 2: 'D', 3: 'A', 4: 'B', 5: 'C', 6: 'E'} >>> term_index['out-of-vocabulary-term'] - 0 + 1 >>> index_term[0] - '' + '[PAD]' >>> index_term[42] Traceback (most recent call last): ... @@ -27,39 +30,39 @@ class Vocabulary(StatefulUnit): >>> c_index = term_index['C'] >>> vocab.transform(['C', 'A', 'C']) == [c_index, a_index, c_index] True - >>> vocab.transform(['C', 'A', 'OOV']) == [c_index, a_index, 0] + >>> vocab.transform(['C', 'A', '[OOV]']) == [c_index, a_index, 1] True >>> indices = vocab.transform(list('ABCDDZZZ')) - >>> ''.join(vocab.state['index_term'][i] for i in indices) - 'ABCDD' + >>> ' '.join(vocab.state['index_term'][i] for i in indices) + 'A B C D D [OOV] [OOV] [OOV]' """ - class IndexTerm(dict): - """Map index to term.""" - - def __missing__(self, key): - """Map out-of-vocabulary indices to empty string.""" - if key == 0: - return '' - else: - raise KeyError(key) + def __init__(self, pad_value: str = '', oov_value: str = ''): + """Vocabulary unit initializer.""" + self._pad = pad_value + self._oov = oov_value + self._state = {} + self._state['term_index'] = self.TermIndex() + self._state['index_term'] = dict() class TermIndex(dict): """Map term to index.""" def __missing__(self, key): - """Map out-of-vocabulary terms to index 0.""" - return 0 + """Map out-of-vocabulary terms to index 1.""" + return 1 def fit(self, tokens: list): """Build a :class:`TermIndex` and a :class:`IndexTerm`.""" - self._state['term_index'] = self.TermIndex() - self._state['index_term'] = self.IndexTerm() + self._state['term_index'][self._pad] = 0 + self._state['term_index'][self._oov] = 1 + self._state['index_term'][0] = self._pad + self._state['index_term'][1] = self._oov terms = set(tokens) for index, term in enumerate(terms): - self._state['term_index'][term] = index + 1 - self._state['index_term'][index + 1] = term + self._state['term_index'][term] = index + 2 + self._state['index_term'][index + 2] = term def transform(self, input_: list) -> list: """Transform a list of tokens to corresponding indices.""" diff --git a/matchzoo/preprocessors/units/word_hashing.py b/matchzoo/preprocessors/units/word_hashing.py index a17a1677..805c1ba3 100644 --- a/matchzoo/preprocessors/units/word_hashing.py +++ b/matchzoo/preprocessors/units/word_hashing.py @@ -19,12 +19,14 @@ class WordHashing(Unit): Examples: >>> letters = [['#te', 'tes','est', 'st#'], ['oov']] >>> word_hashing = WordHashing( - ... term_index={'': 0,'st#': 1, '#te': 2, 'est': 3, 'tes': 4}) + ... term_index={ + ... '_PAD': 0, 'OOV': 1, 'st#': 2, '#te': 3, 'est': 4, 'tes': 5 + ... }) >>> hashing = word_hashing.transform(letters) >>> hashing[0] - [0.0, 1.0, 1.0, 1.0, 1.0, 0.0] + [0.0, 0.0, 1.0, 1.0, 1.0, 1.0] >>> hashing[1] - [1.0, 0.0, 0.0, 0.0, 0.0, 0.0] + [0.0, 1.0, 0.0, 0.0, 0.0, 0.0] """ @@ -52,18 +54,18 @@ def transform(self, input_: list) -> list: if any([isinstance(elem, list) for elem in input_]): # The input shape for CDSSM is # [[word1 ngram, ngram], [word2, ngram, ngram], ...]. - hashing = np.zeros((len(input_), len(self._term_index) + 1)) + hashing = np.zeros((len(input_), len(self._term_index))) for idx, word in enumerate(input_): counted_letters = collections.Counter(word) for key, value in counted_letters.items(): - letter_id = self._term_index.get(key, 0) + letter_id = self._term_index.get(key, 1) hashing[idx, letter_id] = value else: # The input shape for DSSM model [ngram, ngram, ...]. - hashing = np.zeros((len(self._term_index) + 1)) + hashing = np.zeros(len(self._term_index)) counted_letters = collections.Counter(input_) for key, value in counted_letters.items(): - letter_id = self._term_index.get(key, 0) + letter_id = self._term_index.get(key, 1) hashing[letter_id] = value return hashing.tolist() diff --git a/tests/unit_test/test_embedding.py b/tests/unit_test/test_embedding.py index 444e9daa..81a9c9e6 100644 --- a/tests/unit_test/test_embedding.py +++ b/tests/unit_test/test_embedding.py @@ -5,15 +5,15 @@ @pytest.fixture def term_index(): - return {'G': 1, 'C': 2, 'D': 3, 'A': 4, '[PAD]': 0} + return {'G': 1, 'C': 2, 'D': 3, 'A': 4, '_PAD': 0} def test_embedding(term_index): embed = mz.embedding.load_from_file(mz.datasets.embeddings.EMBED_RANK) matrix = embed.build_matrix(term_index) - assert matrix.shape == (len(term_index) + 1, 50) + assert matrix.shape == (len(term_index), 50) embed = mz.embedding.load_from_file(mz.datasets.embeddings.EMBED_10_GLOVE, mode='glove') matrix = embed.build_matrix(term_index) - assert matrix.shape == (len(term_index) + 1, 10) + assert matrix.shape == (len(term_index), 10) assert embed.input_dim == 5 From bf4abce32cfc9e7b1746796c39aaa234b7fb71fb Mon Sep 17 00:00:00 2001 From: ZizhenWang <948280670@qq.com> Date: Wed, 10 Apr 2019 19:58:01 +0800 Subject: [PATCH 028/100] refactor cdssm tutorial for branch 2.2-dev --- tutorials/wikiqa/cdssm.ipynb | 220 ++++++++++++++++++----------------- 1 file changed, 115 insertions(+), 105 deletions(-) diff --git a/tutorials/wikiqa/cdssm.ipynb b/tutorials/wikiqa/cdssm.ipynb index eaf75547..296935cd 100644 --- a/tutorials/wikiqa/cdssm.ipynb +++ b/tutorials/wikiqa/cdssm.ipynb @@ -14,23 +14,24 @@ } ], "source": [ + "import os\n", "import keras\n", "import pandas as pd\n", "import numpy as np\n", - "import matchzoo as mz" + "import matchzoo as mz\n", + "\n", + "os.environ['CUDA_VISIBLE_DEVICES'] = ''" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "train_pack = mz.datasets.wiki_qa.load_data('train', task='ranking')\n", - "valid_pack = mz.datasets.wiki_qa.load_data('dev', task='ranking', filter=True)\n", - "predict_pack = mz.datasets.wiki_qa.load_data('test', task='ranking', filter=True)" + "valid_pack = mz.datasets.wiki_qa.load_data('dev', task='ranking', filtered=True)\n", + "predict_pack = mz.datasets.wiki_qa.load_data('test', task='ranking', filtered=True)" ] }, { @@ -42,22 +43,22 @@ "name": "stderr", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit: 100%|██████████| 2118/2118 [00:00<00:00, 6751.07it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit: 100%|██████████| 18841/18841 [00:05<00:00, 3730.90it/s]\n", - "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 478072.11it/s]\n", - "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 279964.01it/s]\n", - "Building VocabularyUnit from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 3407400.32it/s]\n", - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 2118/2118 [00:00<00:00, 8756.29it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 18841/18841 [00:04<00:00, 4251.64it/s]\n", - "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 122800.84it/s]\n", - "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 59226.17it/s]\n", - "Processing text_left with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 2118/2118 [00:00<00:00, 5882.98it/s]\n", - "Processing text_right with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 18841/18841 [00:08<00:00, 2111.86it/s]\n" + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 6542.53it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:05<00:00, 3325.99it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 584789.41it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 438625.05it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 3082231.57it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 7934.07it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 18841/18841 [00:04<00:00, 3811.25it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 115942.78it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 87315.29it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:08<00:00, 261.04it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 18841/18841 [01:24<00:00, 220.85it/s]\n" ] } ], "source": [ - "preprocessor = mz.preprocessors.CDSSMPreprocessor()\n", + "preprocessor = mz.preprocessors.CDSSMPreprocessor(fixed_length_left=10, fixed_length_right=10)\n", "train_pack_processed = preprocessor.fit_transform(train_pack)" ] }, @@ -72,18 +73,18 @@ "name": "stderr", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 122/122 [00:00<00:00, 8118.95it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 1115/1115 [00:00<00:00, 4421.77it/s]\n", - "Processing text_left with transform: 100%|██████████| 122/122 [00:00<00:00, 82961.27it/s]\n", - "Processing text_right with transform: 100%|██████████| 1115/1115 [00:00<00:00, 63304.89it/s]\n", - "Processing text_left with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 122/122 [00:00<00:00, 6042.02it/s]\n", - "Processing text_right with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 1115/1115 [00:00<00:00, 2165.76it/s]\n", - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 237/237 [00:00<00:00, 4295.23it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit: 100%|██████████| 2300/2300 [00:00<00:00, 4193.45it/s]\n", - "Processing text_left with transform: 100%|██████████| 237/237 [00:00<00:00, 94026.68it/s]\n", - "Processing text_right with transform: 100%|██████████| 2300/2300 [00:00<00:00, 70195.00it/s]\n", - "Processing text_left with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 237/237 [00:00<00:00, 6278.78it/s]\n", - "Processing text_right with chain_transform of NgramLetterUnit => WordHashingUnit: 100%|██████████| 2300/2300 [00:01<00:00, 2156.54it/s]\n" + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 122/122 [00:00<00:00, 7332.17it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 1115/1115 [00:00<00:00, 4039.28it/s]\n", + "Processing text_left with transform: 100%|██████████| 122/122 [00:00<00:00, 71677.42it/s]\n", + "Processing text_right with transform: 100%|██████████| 1115/1115 [00:00<00:00, 86562.93it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 249.16it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:18<00:00, 60.13it/s] \n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 237/237 [00:00<00:00, 8283.96it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2300/2300 [00:01<00:00, 1951.14it/s]\n", + "Processing text_left with transform: 100%|██████████| 237/237 [00:00<00:00, 92016.11it/s]\n", + "Processing text_right with transform: 100%|██████████| 2300/2300 [00:00<00:00, 89923.46it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 249.05it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:11<00:00, 239.25it/s]\n" ] } ], @@ -95,9 +96,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "ranking_task = mz.tasks.Ranking(loss=mz.losses.RankHingeLoss())\n", @@ -110,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 6, "metadata": { "scrolled": false }, @@ -119,51 +118,50 @@ "name": "stdout", "output_type": "stream", "text": [ - "Parameter \"name\" set to CDSSMModel.\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "text_left (InputLayer) (None, 10, 9644) 0 \n", "__________________________________________________________________________________________________\n", - "text_right (InputLayer) (None, 40, 9644) 0 \n", + "text_right (InputLayer) (None, 10, 9644) 0 \n", "__________________________________________________________________________________________________\n", - "conv1d_11 (Conv1D) (None, 10, 300) 8679900 text_left[0][0] \n", + "conv1d_1 (Conv1D) (None, 10, 64) 1851712 text_left[0][0] \n", "__________________________________________________________________________________________________\n", - "conv1d_12 (Conv1D) (None, 40, 300) 8679900 text_right[0][0] \n", + "conv1d_2 (Conv1D) (None, 10, 64) 1851712 text_right[0][0] \n", "__________________________________________________________________________________________________\n", - "dropout_11 (Dropout) (None, 10, 300) 0 conv1d_11[0][0] \n", + "dropout_1 (Dropout) (None, 10, 64) 0 conv1d_1[0][0] \n", "__________________________________________________________________________________________________\n", - "dropout_12 (Dropout) (None, 40, 300) 0 conv1d_12[0][0] \n", + "dropout_2 (Dropout) (None, 10, 64) 0 conv1d_2[0][0] \n", "__________________________________________________________________________________________________\n", - "global_max_pooling1d_11 (Global (None, 300) 0 dropout_11[0][0] \n", + "global_max_pooling1d_1 (GlobalM (None, 64) 0 dropout_1[0][0] \n", "__________________________________________________________________________________________________\n", - "global_max_pooling1d_12 (Global (None, 300) 0 dropout_12[0][0] \n", + "global_max_pooling1d_2 (GlobalM (None, 64) 0 dropout_2[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_22 (Dense) (None, 300) 90300 global_max_pooling1d_11[0][0] \n", + "dense_1 (Dense) (None, 64) 4160 global_max_pooling1d_1[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_24 (Dense) (None, 300) 90300 global_max_pooling1d_12[0][0] \n", + "dense_3 (Dense) (None, 64) 4160 global_max_pooling1d_2[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_23 (Dense) (None, 128) 38528 dense_22[0][0] \n", + "dense_2 (Dense) (None, 64) 4160 dense_1[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_25 (Dense) (None, 128) 38528 dense_24[0][0] \n", + "dense_4 (Dense) (None, 64) 4160 dense_3[0][0] \n", "__________________________________________________________________________________________________\n", - "dot_6 (Dot) (None, 1) 0 dense_23[0][0] \n", - " dense_25[0][0] \n", + "dot_1 (Dot) (None, 1) 0 dense_2[0][0] \n", + " dense_4[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_26 (Dense) (None, 1) 2 dot_6[0][0] \n", + "dense_5 (Dense) (None, 1) 2 dot_1[0][0] \n", "==================================================================================================\n", - "Total params: 17,617,458\n", - "Trainable params: 17,617,458\n", + "Total params: 3,720,066\n", + "Trainable params: 3,720,066\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ - "model = mz.models.CDSSMModel()\n", + "model = mz.models.CDSSM()\n", "model.params['input_shapes'] = preprocessor.context['input_shapes']\n", "model.params['task'] = ranking_task\n", - "model.params['filters'] = 300\n", + "model.params['filters'] = 64\n", "model.params['kernel_size'] = 3\n", "model.params['strides'] = 1\n", "model.params['padding'] = 'same'\n", @@ -171,8 +169,8 @@ "model.params['w_initializer'] = 'glorot_normal'\n", "model.params['b_initializer'] = 'zeros'\n", "model.params['mlp_num_layers'] = 1\n", - "model.params['mlp_num_units'] = 300\n", - "model.params['mlp_num_fan_out'] = 128\n", + "model.params['mlp_num_units'] = 64\n", + "model.params['mlp_num_fan_out'] = 64\n", "model.params['mlp_activation_func'] = 'tanh'\n", "model.params['dropout_rate'] = 0.8\n", "model.params['optimizer'] = 'adadelta'\n", @@ -184,20 +182,34 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": true - }, + "execution_count": 7, + "metadata": {}, "outputs": [], "source": [ - "pred_x, pred_y = predict_pack_processed[:].unpack()\n", + "pred_x, pred_y = predict_pack_processed[:].unpack()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: PairDataGenerator will be deprecated in MatchZoo v2.2. Use `DataGenerator` with callbacks instead.\n" + ] + } + ], + "source": [ "evaluate = mz.callbacks.EvaluateAllMetrics(model, x=pred_x, y=pred_y, batch_size=len(pred_x))\n", "train_generator = mz.PairDataGenerator(train_pack_processed, num_dup=2, num_neg=1, batch_size=64, shuffle=True)" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 9, "metadata": { "scrolled": false }, @@ -207,65 +219,65 @@ "output_type": "stream", "text": [ "Epoch 1/20\n", - "32/32 [==============================] - 24s 748ms/step - loss: 0.7844\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.483600 - normalized_discounted_cumulative_gain@5(0):0.553078 - mean_average_precision(0):0.512808\n", + "32/32 [==============================] - 72s 2s/step - loss: 0.9808\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42488215100974375 - normalized_discounted_cumulative_gain@5(0.0): 0.4909840291447614 - mean_average_precision(0.0): 0.45215174584733625\n", "Epoch 2/20\n", - "32/32 [==============================] - 29s 898ms/step - loss: 0.5235\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.488520 - normalized_discounted_cumulative_gain@5(0):0.561723 - mean_average_precision(0):0.510881\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.7890\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4523924010888256 - normalized_discounted_cumulative_gain@5(0.0): 0.526580105002082 - mean_average_precision(0.0): 0.4843661871232366\n", "Epoch 3/20\n", - "32/32 [==============================] - 23s 706ms/step - loss: 0.2984\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.484800 - normalized_discounted_cumulative_gain@5(0):0.555596 - mean_average_precision(0):0.512422\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.6269\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42912083006483787 - normalized_discounted_cumulative_gain@5(0.0): 0.5059856809765926 - mean_average_precision(0.0): 0.46958607676474695\n", "Epoch 4/20\n", - "32/32 [==============================] - 25s 775ms/step - loss: 0.1954\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.475072 - normalized_discounted_cumulative_gain@5(0):0.562940 - mean_average_precision(0):0.512383\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.5425\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45161347891396936 - normalized_discounted_cumulative_gain@5(0.0): 0.5246607686333176 - mean_average_precision(0.0): 0.4894374228928154\n", "Epoch 5/20\n", - "32/32 [==============================] - 23s 721ms/step - loss: 0.1056\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.487088 - normalized_discounted_cumulative_gain@5(0):0.566688 - mean_average_precision(0):0.519216\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.4786\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44182189699245444 - normalized_discounted_cumulative_gain@5(0.0): 0.5185925913281365 - mean_average_precision(0.0): 0.4785410987945083\n", "Epoch 6/20\n", - "32/32 [==============================] - 23s 706ms/step - loss: 0.0727\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.478561 - normalized_discounted_cumulative_gain@5(0):0.562530 - mean_average_precision(0):0.512396\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.4312\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4353736449145257 - normalized_discounted_cumulative_gain@5(0.0): 0.5193283626946119 - mean_average_precision(0.0): 0.47581070046166846\n", "Epoch 7/20\n", - "32/32 [==============================] - 28s 884ms/step - loss: 0.0505\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.486433 - normalized_discounted_cumulative_gain@5(0):0.567996 - mean_average_precision(0):0.522548\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.3918\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42860677523860297 - normalized_discounted_cumulative_gain@5(0.0): 0.511305679951288 - mean_average_precision(0.0): 0.465896748198743\n", "Epoch 8/20\n", - "32/32 [==============================] - 26s 822ms/step - loss: 0.0544\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.498047 - normalized_discounted_cumulative_gain@5(0):0.575753 - mean_average_precision(0):0.526914\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.3399\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4483104574863611 - normalized_discounted_cumulative_gain@5(0.0): 0.514850172629585 - mean_average_precision(0.0): 0.47729829884300434\n", "Epoch 9/20\n", - "32/32 [==============================] - 22s 700ms/step - loss: 0.0386\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.495465 - normalized_discounted_cumulative_gain@5(0):0.574323 - mean_average_precision(0):0.523699\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.3133\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44683839351327287 - normalized_discounted_cumulative_gain@5(0.0): 0.5179511840387869 - mean_average_precision(0.0): 0.47938829437070807\n", "Epoch 10/20\n", - "32/32 [==============================] - 24s 748ms/step - loss: 0.0290\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.502232 - normalized_discounted_cumulative_gain@5(0):0.581065 - mean_average_precision(0):0.527918\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.2852\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45147495790907527 - normalized_discounted_cumulative_gain@5(0.0): 0.5115591547752104 - mean_average_precision(0.0): 0.4816185898296844\n", "Epoch 11/20\n", - "32/32 [==============================] - 28s 867ms/step - loss: 0.0297\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.496569 - normalized_discounted_cumulative_gain@5(0):0.576849 - mean_average_precision(0):0.521037\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.2503\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45606725359003863 - normalized_discounted_cumulative_gain@5(0.0): 0.5137853825095071 - mean_average_precision(0.0): 0.4898566499228558\n", "Epoch 12/20\n", - "32/32 [==============================] - 24s 735ms/step - loss: 0.0212\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.511699 - normalized_discounted_cumulative_gain@5(0):0.589066 - mean_average_precision(0):0.532874\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.2114\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4536596944525606 - normalized_discounted_cumulative_gain@5(0.0): 0.5195598827593197 - mean_average_precision(0.0): 0.48509265834715537\n", "Epoch 13/20\n", - "32/32 [==============================] - 23s 705ms/step - loss: 0.0197\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.491434 - normalized_discounted_cumulative_gain@5(0):0.570174 - mean_average_precision(0):0.513504\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.1886\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.46086526212639095 - normalized_discounted_cumulative_gain@5(0.0): 0.5347221469997477 - mean_average_precision(0.0): 0.4972628568563632\n", "Epoch 14/20\n", - "32/32 [==============================] - 28s 869ms/step - loss: 0.0132\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.504107 - normalized_discounted_cumulative_gain@5(0):0.575971 - mean_average_precision(0):0.519329\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.1770\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4524514918879093 - normalized_discounted_cumulative_gain@5(0.0): 0.5259706685008083 - mean_average_precision(0.0): 0.4886127130697417\n", "Epoch 15/20\n", - "32/32 [==============================] - 26s 826ms/step - loss: 0.0150\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.503686 - normalized_discounted_cumulative_gain@5(0):0.580463 - mean_average_precision(0):0.524712\n", + "32/32 [==============================] - 38s 1s/step - loss: 0.1454\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.447793222144205 - normalized_discounted_cumulative_gain@5(0.0): 0.523210520595902 - mean_average_precision(0.0): 0.4842295350811732\n", "Epoch 16/20\n", - "32/32 [==============================] - 25s 778ms/step - loss: 0.0123\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.499589 - normalized_discounted_cumulative_gain@5(0):0.576160 - mean_average_precision(0):0.516276\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.1573\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4617597821704854 - normalized_discounted_cumulative_gain@5(0.0): 0.5233844194501931 - mean_average_precision(0.0): 0.48736454745855345\n", "Epoch 17/20\n", - "32/32 [==============================] - 22s 699ms/step - loss: 0.0165\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.501098 - normalized_discounted_cumulative_gain@5(0):0.577585 - mean_average_precision(0):0.525730\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.1437\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.446051744365399 - normalized_discounted_cumulative_gain@5(0.0): 0.511689458533883 - mean_average_precision(0.0): 0.47390160852977303\n", "Epoch 18/20\n", - "32/32 [==============================] - 28s 867ms/step - loss: 0.0089\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.502192 - normalized_discounted_cumulative_gain@5(0):0.575193 - mean_average_precision(0):0.527620\n", + "32/32 [==============================] - 40s 1s/step - loss: 0.1396\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44155513060981444 - normalized_discounted_cumulative_gain@5(0.0): 0.508852366919329 - mean_average_precision(0.0): 0.47430841711913996\n", "Epoch 19/20\n", - "32/32 [==============================] - 23s 722ms/step - loss: 0.0074\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.508068 - normalized_discounted_cumulative_gain@5(0):0.580008 - mean_average_precision(0):0.534251\n", + "32/32 [==============================] - 39s 1s/step - loss: 0.1176\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4480183178506102 - normalized_discounted_cumulative_gain@5(0.0): 0.5177348617853279 - mean_average_precision(0.0): 0.4799578376954719\n", "Epoch 20/20\n", - "32/32 [==============================] - 28s 881ms/step - loss: 0.0098\n", - "Validation: loss:nan - normalized_discounted_cumulative_gain@3(0):0.504778 - normalized_discounted_cumulative_gain@5(0):0.572644 - mean_average_precision(0):0.531077\n" + "32/32 [==============================] - 37s 1s/step - loss: 0.1094\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44665417415821596 - normalized_discounted_cumulative_gain@5(0.0): 0.5142203489288135 - mean_average_precision(0.0): 0.47726846390007227\n" ] } ], @@ -276,9 +288,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] } @@ -299,7 +309,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.3" + "version": "3.6.8" } }, "nbformat": 4, From 3294e75f94c1e14e29e6970262369866fd8942a8 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 11:42:20 +0800 Subject: [PATCH 029/100] Update CI. --- .travis.yml | 34 ++++++++++++++++++---------------- Makefile | 22 +++++++++++++++------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/.travis.yml b/.travis.yml index 025215c8..96c6905f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,22 +5,22 @@ cache: pip sudo: true env: - global: - - PYTHONPATH=$PYTHONPATH:$TRAVIS_BUILD_DIR/tests:$TRAVIS_BUILD_DIR/matchzoo + global: + - PYTHONPATH=$PYTHONPATH:$TRAVIS_BUILD_DIR/tests:$TRAVIS_BUILD_DIR/matchzoo matrix: - allow_failures: - - os: osx - include: - - os: linux - dist: trusty - python: 3.6 - - os: osx - language: generic - env: PYTHON_VERSION=3.6 - - os: osx - language: generic - env: PYTHON_VERSION=3.7 + allow_failures: + - os: osx + include: + - os: linux + dist: trusty + python: 3.6 + - os: osx + language: generic + env: PYTHON_VERSION=3.6 + - os: osx + language: generic + env: PYTHON_VERSION=3.7 install: - pip3 install -r requirements.txt @@ -31,7 +31,9 @@ install: script: - stty cols 80 - export COLUMNS=80 - - make test + - if [ "$TRAVIS_EVENT_TYPE" == "pull_request" ]; then make push; fi + - if [ "$TRAVIS_EVENT_TYPE" == "cron" ]; then make cron; fi + after_success: - - codecov \ No newline at end of file + - codecov diff --git a/Makefile b/Makefile index 82957121..b8b28d35 100644 --- a/Makefile +++ b/Makefile @@ -14,13 +14,14 @@ # - for rapid prototyping # - CI run this for all PRs # -# 2. "slow" tests that run in minutes +# 2. "slow" tests # - run in minutes # - include all unit tests marked "slow" # - CI run this for all PRs # -# 3. "cron" tests that not only slow, but also undeterministic (all tests marked "cron") -# - run in minutes and involves underministic behavoirs (e.g. network connection) +# 3. "cron" tests +# - run in minutes +# - involves underministic behavoirs (e.g. network connection) # - include all unit tests marked "cron" # - CI run this on a daily basis # @@ -33,6 +34,12 @@ # to run crons: # $ make cron # +# to run all tests: +# $ make test +# +# to run CI push/PR tests: +# $ make push +# # to run docstring style check: # $ make flake @@ -43,7 +50,11 @@ TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --co FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib test: - pytest $(TEST_ARGS) ${ARGS} + pytest $(TEST_ARGS) + flake8 $(FLAKE_ARGS) + +push: + pytest -m 'not cron' $(TEST_ARGS) ${ARGS} flake8 $(FLAKE_ARGS) quick: @@ -57,6 +68,3 @@ cron: flake: flake8 $(FLAKE_ARGS) ${ARGS} - -doc: - flake8 $(FLAKE_ARGS) ${ARGS} From a653e00ecbd1bc9204160307078bc9ace79e5b02 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 11:44:24 +0800 Subject: [PATCH 030/100] Update CI. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 96c6905f..5599f633 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,6 +32,7 @@ script: - stty cols 80 - export COLUMNS=80 - if [ "$TRAVIS_EVENT_TYPE" == "pull_request" ]; then make push; fi + - if [ "$TRAVIS_EVENT_TYPE" == "push" ]; then make push; fi - if [ "$TRAVIS_EVENT_TYPE" == "cron" ]; then make cron; fi From df698b182e5c6a9644d094a53dd1239d5dc85a50 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 16:05:13 +0800 Subject: [PATCH 031/100] Exclude contrib for testing. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b8b28d35..c1caf3ab 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ init: pip install -r requirements.txt -TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning +TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning --ignore=matchzoo/contrib FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib test: From 9914265aeb3e125ded944eb17dbd621d5a9f5d82 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 17:16:53 +0800 Subject: [PATCH 032/100] Rename `unit.state` to `unit.context`. Backward compatible for now, but `unit.state` will eventually be removed (I guess in 2.5 or something once all tutorials and guides use `context` instead.) --- .../preprocessors/units/frequency_filter.py | 4 +-- matchzoo/preprocessors/units/stateful_unit.py | 25 +++++++++++++++---- matchzoo/preprocessors/units/vocabulary.py | 20 +++++++-------- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/matchzoo/preprocessors/units/frequency_filter.py b/matchzoo/preprocessors/units/frequency_filter.py index 5de7d69e..89a7523c 100644 --- a/matchzoo/preprocessors/units/frequency_filter.py +++ b/matchzoo/preprocessors/units/frequency_filter.py @@ -66,11 +66,11 @@ def fit(self, list_of_tokens: typing.List[typing.List[str]]): if self._low <= v < self._high: valid_terms.add(k) - self._state[self._mode] = valid_terms + self._context[self._mode] = valid_terms def transform(self, input_: list) -> list: """Transform a list of tokens by filtering out unwanted words.""" - valid_terms = self._state[self._mode] + valid_terms = self._context[self._mode] return list(filter(lambda token: token in valid_terms, input_)) @classmethod diff --git a/matchzoo/preprocessors/units/stateful_unit.py b/matchzoo/preprocessors/units/stateful_unit.py index 9f8b3fca..423075dc 100644 --- a/matchzoo/preprocessors/units/stateful_unit.py +++ b/matchzoo/preprocessors/units/stateful_unit.py @@ -5,17 +5,32 @@ class StatefulUnit(Unit, metaclass=abc.ABCMeta): - """Process unit do persive state (i.e. need fit).""" + """ + Unit with inner state. + + Usually need to be fit before transforming. All information gathered in the + fit phrase will be stored into its `context`. + """ def __init__(self): """Initialization.""" - self._state = {} + self._context = {} @property def state(self): - """Get current state.""" - return self._state + """ + Get current context. Same as `unit.context`. + + Deprecated since v2.2.0, and will be removed in the future. + Used `unit.context` instead. + """ + return self._context + + @property + def context(self): + """Get current context. Same as `unit.state`.""" + return self._context @abc.abstractmethod - def fit(self, input: typing.Any): + def fit(self, input_: typing.Any): """Abstract base method, need to be implemented in subclass.""" diff --git a/matchzoo/preprocessors/units/vocabulary.py b/matchzoo/preprocessors/units/vocabulary.py index dbc6323c..783df94f 100644 --- a/matchzoo/preprocessors/units/vocabulary.py +++ b/matchzoo/preprocessors/units/vocabulary.py @@ -40,11 +40,11 @@ class Vocabulary(StatefulUnit): def __init__(self, pad_value: str = '', oov_value: str = ''): """Vocabulary unit initializer.""" + super().__init__() self._pad = pad_value self._oov = oov_value - self._state = {} - self._state['term_index'] = self.TermIndex() - self._state['index_term'] = dict() + self._context['term_index'] = self.TermIndex() + self._context['index_term'] = dict() class TermIndex(dict): """Map term to index.""" @@ -55,15 +55,15 @@ def __missing__(self, key): def fit(self, tokens: list): """Build a :class:`TermIndex` and a :class:`IndexTerm`.""" - self._state['term_index'][self._pad] = 0 - self._state['term_index'][self._oov] = 1 - self._state['index_term'][0] = self._pad - self._state['index_term'][1] = self._oov + self._context['term_index'][self._pad] = 0 + self._context['term_index'][self._oov] = 1 + self._context['index_term'][0] = self._pad + self._context['index_term'][1] = self._oov terms = set(tokens) for index, term in enumerate(terms): - self._state['term_index'][term] = index + 2 - self._state['index_term'][index + 2] = term + self._context['term_index'][term] = index + 2 + self._context['index_term'][index + 2] = term def transform(self, input_: list) -> list: """Transform a list of tokens to corresponding indices.""" - return [self._state['term_index'][token] for token in input_] + return [self._context['term_index'][token] for token in input_] From a5ecb6a063d338a592a35f98937f09a05505b4d2 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 17:06:29 +0800 Subject: [PATCH 033/100] Update doc test for better test coverage and documenation. --- .../auto/tuner/callbacks/lambda_callback.py | 37 ++++++++++++++++--- .../tuner/callbacks/load_embedding_matrix.py | 28 +++++++++++++- matchzoo/data_pack/data_pack.py | 15 +++----- 3 files changed, 65 insertions(+), 15 deletions(-) diff --git a/matchzoo/auto/tuner/callbacks/lambda_callback.py b/matchzoo/auto/tuner/callbacks/lambda_callback.py index 47ee3102..205d5626 100644 --- a/matchzoo/auto/tuner/callbacks/lambda_callback.py +++ b/matchzoo/auto/tuner/callbacks/lambda_callback.py @@ -1,5 +1,5 @@ from matchzoo.engine.base_model import BaseModel -from .callback import Callback +from matchzoo.auto.tuner.callbacks.callback import Callback class LambdaCallback(Callback): @@ -7,18 +7,45 @@ class LambdaCallback(Callback): LambdaCallback. Just a shorthand for creating a callback class. See :class:`matchzoo.tuner.callbacks.Callback` for more details. + + Example: + + >>> import matchzoo as mz + >>> model = mz.models.Naive() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> data = mz.datasets.toy.load_data() + >>> data = model.get_default_preprocessor().fit_transform( + ... data, verbose=0) + >>> show_inputs = lambda *args: print(*map(type, args)) + >>> callback = mz.auto.tuner.callbacks.LambdaCallback( + ... on_run_start=show_inputs, + ... on_build_end=show_inputs, + ... on_run_end=show_inputs + ... ) + >>> _ = mz.auto.tune( + ... params=model.params, + ... train_data=data, + ... test_data=data, + ... num_runs=1, + ... callbacks=[callback], + ... verbose=0, + ... ) # noqa: E501 + + + + >>> print('hello') """ def __init__( self, on_run_start=None, on_build_end=None, - on_result_end=None + on_run_end=None ): """Init.""" self._on_run_start = on_run_start self._on_build_end = on_build_end - self._on_result_end = on_result_end + self._on_run_end = on_run_end def on_run_start(self, tuner, sample: dict): """`on_run_start`.""" @@ -32,5 +59,5 @@ def on_build_end(self, tuner, model: BaseModel): def on_run_end(self, tuner, model: BaseModel, result: dict): """`on_run_end`.""" - if self._on_result_end: - self._on_result_end(tuner, model, result) + if self._on_run_end: + self._on_run_end(tuner, model, result) diff --git a/matchzoo/auto/tuner/callbacks/load_embedding_matrix.py b/matchzoo/auto/tuner/callbacks/load_embedding_matrix.py index 0b59582f..931d38b2 100644 --- a/matchzoo/auto/tuner/callbacks/load_embedding_matrix.py +++ b/matchzoo/auto/tuner/callbacks/load_embedding_matrix.py @@ -1,13 +1,39 @@ from matchzoo.engine.base_model import BaseModel -from .callback import Callback +from matchzoo.auto.tuner.callbacks.callback import Callback class LoadEmbeddingMatrix(Callback): """ Load a pre-trained embedding after the model is built. + Used with tuner to load a pre-trained embedding matrix for each newly built + model instance. + :param embedding_matrix: Embedding matrix to load. + Example: + + >>> import matchzoo as mz + >>> model = mz.models.ArcI() + >>> prpr = model.get_default_preprocessor() + >>> data = mz.datasets.toy.load_data() + >>> data = prpr.fit_transform(data, verbose=0) + >>> embed = mz.datasets.toy.load_embedding() + >>> term_index = prpr.context['vocab_unit'].state['term_index'] + >>> matrix = embed.build_matrix(term_index) + >>> callback = mz.auto.tuner.callbacks.LoadEmbeddingMatrix(matrix) + >>> model.params.update(prpr.context) + >>> model.params['task'] = mz.tasks.Ranking() + >>> model.params['embedding_output_dim'] = embed.output_dim + >>> result = mz.auto.tune( + ... params=model.params, + ... train_data=data, + ... test_data=data, + ... num_runs=1, + ... callbacks=[callback], + ... verbose=0 + ... ) + """ def __init__(self, embedding_matrix): diff --git a/matchzoo/data_pack/data_pack.py b/matchzoo/data_pack/data_pack.py index e8a94015..df2f1746 100644 --- a/matchzoo/data_pack/data_pack.py +++ b/matchzoo/data_pack/data_pack.py @@ -350,27 +350,24 @@ def apply_on_text( ... rename='length_left', ... inplace=True, ... verbose=0) - >>> list(frame[0].columns) - ['id_left', 'text_left', 'length_left', 'id_right', 'text_right', \ -'label'] + >>> list(frame[0].columns) # noqa: E501 + ['id_left', 'text_left', 'length_left', 'id_right', 'text_right', 'label'] To do the same to the right text: >>> data_pack.apply_on_text(len, mode='right', ... rename='length_right', ... inplace=True, ... verbose=0) - >>> list(frame[0].columns) - ['id_left', 'text_left', 'length_left', 'id_right', 'text_right', \ -'length_right', 'label'] + >>> list(frame[0].columns) # noqa: E501 + ['id_left', 'text_left', 'length_left', 'id_right', 'text_right', 'length_right', 'label'] To do the same to the both texts at the same time: >>> data_pack.apply_on_text(len, mode='both', ... rename=('extra_left', 'extra_right'), ... inplace=True, ... verbose=0) - >>> list(frame[0].columns) - ['id_left', 'text_left', 'length_left', 'extra_left', 'id_right', \ -'text_right', 'length_right', 'extra_right', 'label'] + >>> list(frame[0].columns) # noqa: E501 + ['id_left', 'text_left', 'length_left', 'extra_left', 'id_right', 'text_right', 'length_right', 'extra_right', 'label'] To suppress outputs: >>> data_pack.apply_on_text(len, mode='both', verbose=0, From 50de721410dce728f553f026a54dfdde4fef5bdb Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 18:02:28 +0800 Subject: [PATCH 034/100] Update. --- matchzoo/auto/tuner/callbacks/lambda_callback.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/auto/tuner/callbacks/lambda_callback.py b/matchzoo/auto/tuner/callbacks/lambda_callback.py index 205d5626..72490eeb 100644 --- a/matchzoo/auto/tuner/callbacks/lambda_callback.py +++ b/matchzoo/auto/tuner/callbacks/lambda_callback.py @@ -33,7 +33,7 @@ class LambdaCallback(Callback): - >>> print('hello') + """ def __init__( From 69b5b1d96018adca0aaf7b5761814251081b8162 Mon Sep 17 00:00:00 2001 From: uduse Date: Thu, 11 Apr 2019 18:42:47 +0800 Subject: [PATCH 035/100] Fix print problem. --- matchzoo/auto/tuner/callbacks/lambda_callback.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/matchzoo/auto/tuner/callbacks/lambda_callback.py b/matchzoo/auto/tuner/callbacks/lambda_callback.py index 72490eeb..c64090de 100644 --- a/matchzoo/auto/tuner/callbacks/lambda_callback.py +++ b/matchzoo/auto/tuner/callbacks/lambda_callback.py @@ -16,7 +16,8 @@ class LambdaCallback(Callback): >>> data = mz.datasets.toy.load_data() >>> data = model.get_default_preprocessor().fit_transform( ... data, verbose=0) - >>> show_inputs = lambda *args: print(*map(type, args)) + >>> def show_inputs(*args): + ... print(' '.join(map(str, map(type, args)))) >>> callback = mz.auto.tuner.callbacks.LambdaCallback( ... on_run_start=show_inputs, ... on_build_end=show_inputs, From 8b65bfbc77036beeee1a84c2fb703de422b4ef47 Mon Sep 17 00:00:00 2001 From: Crystina Date: Thu, 11 Apr 2019 22:08:40 -0400 Subject: [PATCH 036/100] undo the unconscious change on base_model, local make test passed, yet seems over 50 mins --- matchzoo/engine/base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/engine/base_model.py b/matchzoo/engine/base_model.py index 9fc07dcc..c134bbb2 100644 --- a/matchzoo/engine/base_model.py +++ b/matchzoo/engine/base_model.py @@ -528,7 +528,7 @@ def _make_embedding_layer( name=name, **kwargs ) - + def _make_multi_layer_perceptron_layer(self) -> keras.layers.Layer: # TODO: do not create new layers for a second call if not self._params['with_multi_layer_perceptron']: From 529a60ed2bbf333391be4d34fa74ba84f02ca57b Mon Sep 17 00:00:00 2001 From: Wang Bo Date: Fri, 12 Apr 2019 06:38:28 +0200 Subject: [PATCH 037/100] refactor dssm tutorial (#702) --- tutorials/wikiqa/dssm.ipynb | 195 +++++++++++++++++++----------------- 1 file changed, 102 insertions(+), 93 deletions(-) diff --git a/tutorials/wikiqa/dssm.ipynb b/tutorials/wikiqa/dssm.ipynb index 8d99ebc7..8eb6e11d 100644 --- a/tutorials/wikiqa/dssm.ipynb +++ b/tutorials/wikiqa/dssm.ipynb @@ -9,30 +9,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "Using TensorFlow backend.\n", - "/data/users/fyx/.local/python3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88\n", - " return f(*args, **kwds)\n", - "/data/users/fyx/.local/python3/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88\n", - " return f(*args, **kwds)\n" + "Using TensorFlow backend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "matchzoo version 2.1.0\n", + "\n", + "data loading ...\n", + "data loaded as `train_pack_raw` `dev_pack_raw` `test_pack_raw`\n", + "`ranking_task` initialized with metrics [normalized_discounted_cumulative_gain@3(0.0), normalized_discounted_cumulative_gain@5(0.0), mean_average_precision(0.0)]\n", + "loading embedding ...\n", + "embedding loaded as `glove_embedding`\n" ] } ], "source": [ - "import keras\n", - "import numpy as np\n", - "import pandas as pd\n", - "import matchzoo as mz" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "train_pack = mz.datasets.wiki_qa.load_data('train', task='ranking')\n", - "valid_pack = mz.datasets.wiki_qa.load_data('dev', task='ranking', filter=True)\n", - "predict_pack = mz.datasets.wiki_qa.load_data('test', task='ranking', filter=True)" + "%run init.ipynb" ] }, { @@ -44,19 +39,25 @@ "name": "stderr", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit: 100%|██████████| 2118/2118 [00:00<00:00, 6893.66it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit: 100%|██████████| 18841/18841 [00:05<00:00, 3323.25it/s]\n", - "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 514034.02it/s]\n", - "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 430982.12it/s]\n", - "Building VocabularyUnit from a datapack.: 100%|██████████| 1614976/1614976 [00:00<00:00, 2964446.21it/s]\n", - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 2118/2118 [00:00<00:00, 4878.11it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 18841/18841 [00:07<00:00, 2572.20it/s]\n" + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 3802.39it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:04<00:00, 3959.06it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 822625.79it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 597166.86it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 4642343.92it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:00<00:00, 2853.90it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 18841/18841 [00:12<00:00, 1456.96it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 2308.40it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:00<00:00, 2025.86it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 2678.58it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:01<00:00, 1345.18it/s]\n" ] } ], "source": [ "preprocessor = mz.preprocessors.DSSMPreprocessor()\n", - "train_pack_processed = preprocessor.fit_transform(train_pack)" + "train_pack_processed = preprocessor.fit_transform(train_pack_raw)\n", + "valid_pack_processed = preprocessor.transform(dev_pack_raw)\n", + "test_pack_processed = preprocessor.transform(test_pack_raw)" ] }, { @@ -65,19 +66,21 @@ "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 122/122 [00:00<00:00, 4624.45it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 1115/1115 [00:00<00:00, 2609.60it/s]\n", - "Processing text_left with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 237/237 [00:00<00:00, 5193.33it/s]\n", - "Processing text_right with chain_transform of TokenizeUnit => LowercaseUnit => PuncRemovalUnit => StopRemovalUnit => NgramLetterUnit => WordHashingUnit: 100%|██████████| 2300/2300 [00:00<00:00, 2579.14it/s]\n" - ] + "data": { + "text/plain": [ + "{'vocab_unit': ,\n", + " 'vocab_size': 9645,\n", + " 'embedding_input_dim': 9645,\n", + " 'input_shapes': [(9645,), (9645,)]}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "valid_pack_processed = preprocessor.transform(valid_pack)\n", - "predict_pack_processed = preprocessor.transform(predict_pack)" + "preprocessor.context" ] }, { @@ -103,17 +106,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "Parameter \"name\" set to DSSM.\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", - "text_left (InputLayer) (None, 9644) 0 \n", + "text_left (InputLayer) (None, 9645) 0 \n", "__________________________________________________________________________________________________\n", - "text_right (InputLayer) (None, 9644) 0 \n", + "text_right (InputLayer) (None, 9645) 0 \n", "__________________________________________________________________________________________________\n", - "dense_1 (Dense) (None, 300) 2893500 text_left[0][0] \n", + "dense_1 (Dense) (None, 300) 2893800 text_left[0][0] \n", "__________________________________________________________________________________________________\n", - "dense_5 (Dense) (None, 300) 2893500 text_right[0][0] \n", + "dense_5 (Dense) (None, 300) 2893800 text_right[0][0] \n", "__________________________________________________________________________________________________\n", "dense_2 (Dense) (None, 300) 90300 dense_1[0][0] \n", "__________________________________________________________________________________________________\n", @@ -132,8 +134,8 @@ "__________________________________________________________________________________________________\n", "dense_9 (Dense) (None, 1) 2 dot_1[0][0] \n", "==================================================================================================\n", - "Total params: 6,225,258\n", - "Trainable params: 6,225,258\n", + "Total params: 6,225,858\n", + "Trainable params: 6,225,858\n", "Non-trainable params: 0\n", "__________________________________________________________________________________________________\n" ] @@ -155,38 +157,45 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "pred_x, pred_y = predict_pack_processed[:].unpack()\n", + "pred_x, pred_y = test_pack_processed[:].unpack()\n", "evaluate = mz.callbacks.EvaluateAllMetrics(model, x=pred_x, y=pred_y, batch_size=len(pred_x))" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 11, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: PairDataGenerator will be deprecated in MatchZoo v2.2. Use `DataGenerator` with callbacks instead.\n" + ] + }, { "data": { "text/plain": [ - "16" + "32" ] }, - "execution_count": 8, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "train_generator = mz.PairDataGenerator(train_pack_processed, num_dup=1, num_neg=4, batch_size=64, shuffle=True)\n", + "train_generator = mz.PairDataGenerator(train_pack_processed, num_dup=1, num_neg=4, batch_size=32, shuffle=True)\n", "len(train_generator)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 12, "metadata": { "scrolled": false }, @@ -196,65 +205,65 @@ "output_type": "stream", "text": [ "Epoch 1/20\n", - "16/16 [==============================] - 3s 175ms/step - loss: 1.5564\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.45901904458281206 - normalized_discounted_cumulative_gain@5(0): 0.5475429093192175 - mean_average_precision(0): 0.4911167747235369\n", + "32/32 [==============================] - 7s 215ms/step - loss: 1.3325\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4431849853601904 - normalized_discounted_cumulative_gain@5(0.0): 0.5295386323998266 - mean_average_precision(0.0): 0.48303488812718776\n", "Epoch 2/20\n", - "16/16 [==============================] - 2s 96ms/step - loss: 1.2718\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4654009025837788 - normalized_discounted_cumulative_gain@5(0): 0.5392725183775516 - mean_average_precision(0): 0.48941174032387735\n", + "32/32 [==============================] - 6s 176ms/step - loss: 1.3159\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4353814849661657 - normalized_discounted_cumulative_gain@5(0.0): 0.5032525911610362 - mean_average_precision(0.0): 0.4776049822282439\n", "Epoch 3/20\n", - "16/16 [==============================] - 2s 100ms/step - loss: 1.1539\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4791185363644891 - normalized_discounted_cumulative_gain@5(0): 0.5538418263100713 - mean_average_precision(0): 0.5071942064030672\n", + "32/32 [==============================] - 5s 171ms/step - loss: 1.2955\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4088637099689691 - normalized_discounted_cumulative_gain@5(0.0): 0.48351010067595823 - mean_average_precision(0.0): 0.4432379861560312\n", "Epoch 4/20\n", - "16/16 [==============================] - 2s 99ms/step - loss: 1.0995\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4886745351048811 - normalized_discounted_cumulative_gain@5(0): 0.5562701289500901 - mean_average_precision(0): 0.5133703768780384\n", + "32/32 [==============================] - 6s 173ms/step - loss: 1.2726\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.46569627211992487 - normalized_discounted_cumulative_gain@5(0.0): 0.5305277638291452 - mean_average_precision(0.0): 0.4903964896023526\n", "Epoch 5/20\n", - "16/16 [==============================] - 2s 95ms/step - loss: 1.0674\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4853827809349306 - normalized_discounted_cumulative_gain@5(0): 0.5682223793780434 - mean_average_precision(0): 0.5169149799106053\n", + "32/32 [==============================] - 6s 172ms/step - loss: 1.2439\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44778538209256513 - normalized_discounted_cumulative_gain@5(0.0): 0.5104380434420628 - mean_average_precision(0.0): 0.47615129143046664\n", "Epoch 6/20\n", - "16/16 [==============================] - 2s 99ms/step - loss: 1.0479\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.46480280740048857 - normalized_discounted_cumulative_gain@5(0): 0.5281305738905067 - mean_average_precision(0): 0.492201293611383\n", + "32/32 [==============================] - 6s 172ms/step - loss: 1.2202\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4452573045503587 - normalized_discounted_cumulative_gain@5(0.0): 0.5137975378931312 - mean_average_precision(0.0): 0.4742872412051932\n", "Epoch 7/20\n", - "16/16 [==============================] - 2s 94ms/step - loss: 1.0274\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4898804500151732 - normalized_discounted_cumulative_gain@5(0): 0.560890920302221 - mean_average_precision(0): 0.5058987750652866\n", + "32/32 [==============================] - 5s 170ms/step - loss: 1.2038\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.41264292792428936 - normalized_discounted_cumulative_gain@5(0.0): 0.4740615140630128 - mean_average_precision(0.0): 0.45294026408574084\n", "Epoch 8/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 1.0142\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4941487381639577 - normalized_discounted_cumulative_gain@5(0): 0.5665778188888335 - mean_average_precision(0): 0.5140344974996873\n", + "32/32 [==============================] - 6s 172ms/step - loss: 1.1848\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45527149721829696 - normalized_discounted_cumulative_gain@5(0.0): 0.5229678873030444 - mean_average_precision(0.0): 0.48490323375232625\n", "Epoch 9/20\n", - "16/16 [==============================] - 2s 98ms/step - loss: 1.0008\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5069173712527351 - normalized_discounted_cumulative_gain@5(0): 0.5866287176354987 - mean_average_precision(0): 0.5269820047509921\n", + "32/32 [==============================] - 5s 171ms/step - loss: 1.1504 3\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4401749964298954 - normalized_discounted_cumulative_gain@5(0.0): 0.5202410581724496 - mean_average_precision(0.0): 0.47967943778482564\n", "Epoch 10/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 0.9873\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.49700543338958786 - normalized_discounted_cumulative_gain@5(0): 0.5805879493729443 - mean_average_precision(0): 0.5150557804829956\n", + "32/32 [==============================] - 5s 172ms/step - loss: 1.1314\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44883790476151675 - normalized_discounted_cumulative_gain@5(0.0): 0.5215788412779597 - mean_average_precision(0.0): 0.48274548802838624\n", "Epoch 11/20\n", - "16/16 [==============================] - 2s 109ms/step - loss: 0.9750\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5025024116631714 - normalized_discounted_cumulative_gain@5(0): 0.5923504552250592 - mean_average_precision(0): 0.5225994206215725\n", + "32/32 [==============================] - 6s 173ms/step - loss: 1.1109\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45835958548802597 - normalized_discounted_cumulative_gain@5(0.0): 0.5254562351939174 - mean_average_precision(0.0): 0.48819163523037407\n", "Epoch 12/20\n", - "16/16 [==============================] - 2s 98ms/step - loss: 0.9644\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5103579714392016 - normalized_discounted_cumulative_gain@5(0): 0.5903011924569881 - mean_average_precision(0): 0.5302960840144384\n", + "32/32 [==============================] - 6s 174ms/step - loss: 1.0915\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4540812972538116 - normalized_discounted_cumulative_gain@5(0.0): 0.502728792326375 - mean_average_precision(0.0): 0.48229166522394096\n", "Epoch 13/20\n", - "16/16 [==============================] - 2s 95ms/step - loss: 0.9534\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5160164432378087 - normalized_discounted_cumulative_gain@5(0): 0.5993189848710705 - mean_average_precision(0): 0.5396924014803761\n", + "32/32 [==============================] - 6s 173ms/step - loss: 1.0805\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4462255256302118 - normalized_discounted_cumulative_gain@5(0.0): 0.5097488218798687 - mean_average_precision(0.0): 0.4751972950775518\n", "Epoch 14/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 0.9442\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5032196943848134 - normalized_discounted_cumulative_gain@5(0): 0.5852110589773137 - mean_average_precision(0): 0.5268703682283354\n", + "32/32 [==============================] - 6s 174ms/step - loss: 1.0575\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4263585495923587 - normalized_discounted_cumulative_gain@5(0.0): 0.5014903707963352 - mean_average_precision(0.0): 0.46364289738480496\n", "Epoch 15/20\n", - "16/16 [==============================] - 2s 95ms/step - loss: 0.9336\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5317052606549753 - normalized_discounted_cumulative_gain@5(0): 0.6023052111746768 - mean_average_precision(0): 0.5478608387627374\n", + "32/32 [==============================] - 6s 179ms/step - loss: 1.0396\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.43936705108731194 - normalized_discounted_cumulative_gain@5(0.0): 0.5218713927469146 - mean_average_precision(0.0): 0.47233172236473137\n", "Epoch 16/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 0.9239\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.508831525587222 - normalized_discounted_cumulative_gain@5(0): 0.5817387639362221 - mean_average_precision(0): 0.5274733502791022\n", + "32/32 [==============================] - 6s 182ms/step - loss: 1.0156\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45080782122574514 - normalized_discounted_cumulative_gain@5(0.0): 0.5181271382497495 - mean_average_precision(0.0): 0.4832342072703635\n", "Epoch 17/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 0.9144\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5203610304609562 - normalized_discounted_cumulative_gain@5(0): 0.5991831842478874 - mean_average_precision(0): 0.5431669157143841\n", + "32/32 [==============================] - 6s 175ms/step - loss: 0.9932\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.423108628561739 - normalized_discounted_cumulative_gain@5(0.0): 0.49596605935842625 - mean_average_precision(0.0): 0.4667294180948952\n", "Epoch 18/20\n", - "16/16 [==============================] - 2s 98ms/step - loss: 0.9071\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5138966254324063 - normalized_discounted_cumulative_gain@5(0): 0.5919938110840292 - mean_average_precision(0): 0.5360874679703793\n", + "32/32 [==============================] - 5s 172ms/step - loss: 0.9800\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4378084124127128 - normalized_discounted_cumulative_gain@5(0.0): 0.5098753091251295 - mean_average_precision(0.0): 0.4734416114488085\n", "Epoch 19/20\n", - "16/16 [==============================] - 2s 97ms/step - loss: 0.8990\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.4872557976860261 - normalized_discounted_cumulative_gain@5(0): 0.5698167643783474 - mean_average_precision(0): 0.5167562193088068\n", + "32/32 [==============================] - 6s 172ms/step - loss: 0.9662\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4504450479915345 - normalized_discounted_cumulative_gain@5(0.0): 0.519107636100811 - mean_average_precision(0.0): 0.48712867088141415\n", "Epoch 20/20\n", - "16/16 [==============================] - 2s 98ms/step - loss: 0.8915\n", - "Validation: normalized_discounted_cumulative_gain@3(0): 0.5492809107350253 - normalized_discounted_cumulative_gain@5(0): 0.6194080901274281 - mean_average_precision(0): 0.5626976311311754\n" + "32/32 [==============================] - 6s 172ms/step - loss: 0.9512\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45663442312293695 - normalized_discounted_cumulative_gain@5(0.0): 0.5363645153841258 - mean_average_precision(0.0): 0.4956098197015037\n" ] } ], @@ -286,7 +295,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.6.7" } }, "nbformat": 4, From c59179d609532270921b6adf1055633aea64b66b Mon Sep 17 00:00:00 2001 From: zhen Date: Fri, 12 Apr 2019 16:17:42 +0800 Subject: [PATCH 038/100] refactor cdssm tutorial for branch 2.2-dev (#709) --- tutorials/wikiqa/cdssm.ipynb | 220 +++++++++++++++-------------------- 1 file changed, 92 insertions(+), 128 deletions(-) diff --git a/tutorials/wikiqa/cdssm.ipynb b/tutorials/wikiqa/cdssm.ipynb index 296935cd..84f17bb1 100644 --- a/tutorials/wikiqa/cdssm.ipynb +++ b/tutorials/wikiqa/cdssm.ipynb @@ -11,105 +11,70 @@ "text": [ "Using TensorFlow backend.\n" ] - } - ], - "source": [ - "import os\n", - "import keras\n", - "import pandas as pd\n", - "import numpy as np\n", - "import matchzoo as mz\n", - "\n", - "os.environ['CUDA_VISIBLE_DEVICES'] = ''" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "train_pack = mz.datasets.wiki_qa.load_data('train', task='ranking')\n", - "valid_pack = mz.datasets.wiki_qa.load_data('dev', task='ranking', filtered=True)\n", - "predict_pack = mz.datasets.wiki_qa.load_data('test', task='ranking', filtered=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + }, { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 6542.53it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:05<00:00, 3325.99it/s]\n", - "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 584789.41it/s]\n", - "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 438625.05it/s]\n", - "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 3082231.57it/s]\n", - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 7934.07it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 18841/18841 [00:04<00:00, 3811.25it/s]\n", - "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 115942.78it/s]\n", - "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 87315.29it/s]\n", - "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:08<00:00, 261.04it/s]\n", - "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 18841/18841 [01:24<00:00, 220.85it/s]\n" + "matchzoo version 2.1.0\n", + "\n", + "data loading ...\n", + "data loaded as `train_pack_raw` `dev_pack_raw` `test_pack_raw`\n", + "`ranking_task` initialized with metrics [normalized_discounted_cumulative_gain@3(0.0), normalized_discounted_cumulative_gain@5(0.0), mean_average_precision(0.0)]\n", + "loading embedding ...\n", + "embedding loaded as `glove_embedding`\n" ] } ], "source": [ - "preprocessor = mz.preprocessors.CDSSMPreprocessor(fixed_length_left=10, fixed_length_right=10)\n", - "train_pack_processed = preprocessor.fit_transform(train_pack)" + "%run init.ipynb" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": false - }, + "execution_count": 2, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 122/122 [00:00<00:00, 7332.17it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 1115/1115 [00:00<00:00, 4039.28it/s]\n", - "Processing text_left with transform: 100%|██████████| 122/122 [00:00<00:00, 71677.42it/s]\n", - "Processing text_right with transform: 100%|██████████| 1115/1115 [00:00<00:00, 86562.93it/s]\n", - "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 249.16it/s]\n", - "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:18<00:00, 60.13it/s] \n", - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 237/237 [00:00<00:00, 8283.96it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2300/2300 [00:01<00:00, 1951.14it/s]\n", - "Processing text_left with transform: 100%|██████████| 237/237 [00:00<00:00, 92016.11it/s]\n", - "Processing text_right with transform: 100%|██████████| 2300/2300 [00:00<00:00, 89923.46it/s]\n", - "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 249.05it/s]\n", - "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:11<00:00, 239.25it/s]\n" + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 5365.33it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:05<00:00, 3205.80it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 310569.71it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 349915.35it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 3031577.24it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 8384.04it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 18841/18841 [00:04<00:00, 3939.48it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 125562.34it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 96621.02it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:07<00:00, 269.84it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 18841/18841 [01:27<00:00, 216.37it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 122/122 [00:00<00:00, 7746.89it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 1115/1115 [00:14<00:00, 77.28it/s] \n", + "Processing text_left with transform: 100%|██████████| 122/122 [00:00<00:00, 63447.62it/s]\n", + "Processing text_right with transform: 100%|██████████| 1115/1115 [00:00<00:00, 88946.88it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 273.77it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:04<00:00, 226.13it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 237/237 [00:00<00:00, 8707.90it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval: 100%|██████████| 2300/2300 [00:01<00:00, 2237.22it/s]\n", + "Processing text_left with transform: 100%|██████████| 237/237 [00:00<00:00, 101299.30it/s]\n", + "Processing text_right with transform: 100%|██████████| 2300/2300 [00:00<00:00, 97484.78it/s]\n", + "Processing text_left with chain_transform of NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 269.12it/s]\n", + "Processing text_right with chain_transform of NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:10<00:00, 212.35it/s]\n" ] } ], "source": [ - "valid_pack_processed = preprocessor.transform(valid_pack)\n", - "predict_pack_processed = preprocessor.transform(predict_pack)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "ranking_task = mz.tasks.Ranking(loss=mz.losses.RankHingeLoss())\n", - "ranking_task.metrics = [\n", - " mz.metrics.NormalizedDiscountedCumulativeGain(k=3),\n", - " mz.metrics.NormalizedDiscountedCumulativeGain(k=5),\n", - " mz.metrics.MeanAveragePrecision()\n", - "]" + "preprocessor = mz.preprocessors.CDSSMPreprocessor(fixed_length_left=10, fixed_length_right=10)\n", + "train_pack_processed = preprocessor.fit_transform(train_pack_raw)\n", + "valid_pack_processed = preprocessor.transform(dev_pack_raw)\n", + "test_pack_processed = preprocessor.transform(test_pack_raw)" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": { "scrolled": false }, @@ -182,34 +147,33 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "pred_x, pred_y = predict_pack_processed[:].unpack()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "WARNING: PairDataGenerator will be deprecated in MatchZoo v2.2. Use `DataGenerator` with callbacks instead.\n" + "num batches: 102\n" ] } ], "source": [ + "pred_x, pred_y = test_pack_processed[:].unpack()\n", "evaluate = mz.callbacks.EvaluateAllMetrics(model, x=pred_x, y=pred_y, batch_size=len(pred_x))\n", - "train_generator = mz.PairDataGenerator(train_pack_processed, num_dup=2, num_neg=1, batch_size=64, shuffle=True)" + "train_generator = mz.DataGenerator(\n", + " train_pack_processed,\n", + " mode='pair',\n", + " num_dup=2,\n", + " num_neg=1,\n", + " batch_size=20\n", + ")\n", + "print('num batches:', len(train_generator))" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": { "scrolled": false }, @@ -219,65 +183,65 @@ "output_type": "stream", "text": [ "Epoch 1/20\n", - "32/32 [==============================] - 72s 2s/step - loss: 0.9808\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42488215100974375 - normalized_discounted_cumulative_gain@5(0.0): 0.4909840291447614 - mean_average_precision(0.0): 0.45215174584733625\n", + "102/102 [==============================] - 65s 635ms/step - loss: 0.8021\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42304382290227854 - normalized_discounted_cumulative_gain@5(0.0): 0.49915948768338086 - mean_average_precision(0.0): 0.46037758752542035\n", "Epoch 2/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.7890\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4523924010888256 - normalized_discounted_cumulative_gain@5(0.0): 0.526580105002082 - mean_average_precision(0.0): 0.4843661871232366\n", + "102/102 [==============================] - 45s 445ms/step - loss: 0.5966\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.43781763271520285 - normalized_discounted_cumulative_gain@5(0.0): 0.520097599085372 - mean_average_precision(0.0): 0.4762598411822459\n", "Epoch 3/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.6269\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42912083006483787 - normalized_discounted_cumulative_gain@5(0.0): 0.5059856809765926 - mean_average_precision(0.0): 0.46958607676474695\n", + "102/102 [==============================] - 46s 447ms/step - loss: 0.4992\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44923101748788413 - normalized_discounted_cumulative_gain@5(0.0): 0.5136672947113214 - mean_average_precision(0.0): 0.4803110559647868\n", "Epoch 4/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.5425\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45161347891396936 - normalized_discounted_cumulative_gain@5(0.0): 0.5246607686333176 - mean_average_precision(0.0): 0.4894374228928154\n", + "102/102 [==============================] - 46s 446ms/step - loss: 0.4143\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.467714954371615 - normalized_discounted_cumulative_gain@5(0.0): 0.5353130653753986 - mean_average_precision(0.0): 0.5017560318255102\n", "Epoch 5/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.4786\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44182189699245444 - normalized_discounted_cumulative_gain@5(0.0): 0.5185925913281365 - mean_average_precision(0.0): 0.4785410987945083\n", + "102/102 [==============================] - 46s 451ms/step - loss: 0.3489\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4706511291875292 - normalized_discounted_cumulative_gain@5(0.0): 0.5275832328072992 - mean_average_precision(0.0): 0.5026243479583462\n", "Epoch 6/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.4312\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4353736449145257 - normalized_discounted_cumulative_gain@5(0.0): 0.5193283626946119 - mean_average_precision(0.0): 0.47581070046166846\n", + "102/102 [==============================] - 45s 443ms/step - loss: 0.3231\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4641151831570107 - normalized_discounted_cumulative_gain@5(0.0): 0.5219564667466021 - mean_average_precision(0.0): 0.4934049132027672\n", "Epoch 7/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.3918\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.42860677523860297 - normalized_discounted_cumulative_gain@5(0.0): 0.511305679951288 - mean_average_precision(0.0): 0.465896748198743\n", + "102/102 [==============================] - 44s 433ms/step - loss: 0.2695\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4760514687477512 - normalized_discounted_cumulative_gain@5(0.0): 0.5285019348702702 - mean_average_precision(0.0): 0.49994736585416333\n", "Epoch 8/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.3399\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4483104574863611 - normalized_discounted_cumulative_gain@5(0.0): 0.514850172629585 - mean_average_precision(0.0): 0.47729829884300434\n", + "102/102 [==============================] - 47s 457ms/step - loss: 0.2331\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4661781341235399 - normalized_discounted_cumulative_gain@5(0.0): 0.5260071867435453 - mean_average_precision(0.0): 0.4922605321622356\n", "Epoch 9/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.3133\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44683839351327287 - normalized_discounted_cumulative_gain@5(0.0): 0.5179511840387869 - mean_average_precision(0.0): 0.47938829437070807\n", + "102/102 [==============================] - 46s 453ms/step - loss: 0.1942\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4645719968337067 - normalized_discounted_cumulative_gain@5(0.0): 0.5238558790194195 - mean_average_precision(0.0): 0.48851468090847294\n", "Epoch 10/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.2852\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45147495790907527 - normalized_discounted_cumulative_gain@5(0.0): 0.5115591547752104 - mean_average_precision(0.0): 0.4816185898296844\n", + "102/102 [==============================] - 45s 444ms/step - loss: 0.1734\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4600910137969285 - normalized_discounted_cumulative_gain@5(0.0): 0.5320923473092672 - mean_average_precision(0.0): 0.48703092961044614\n", "Epoch 11/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.2503\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45606725359003863 - normalized_discounted_cumulative_gain@5(0.0): 0.5137853825095071 - mean_average_precision(0.0): 0.4898566499228558\n", + "102/102 [==============================] - 47s 464ms/step - loss: 0.1644\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.45786306386326225 - normalized_discounted_cumulative_gain@5(0.0): 0.5246949873542252 - mean_average_precision(0.0): 0.48502089087514016\n", "Epoch 12/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.2114\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4536596944525606 - normalized_discounted_cumulative_gain@5(0.0): 0.5195598827593197 - mean_average_precision(0.0): 0.48509265834715537\n", + "102/102 [==============================] - 45s 443ms/step - loss: 0.1560\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4567332855642369 - normalized_discounted_cumulative_gain@5(0.0): 0.528074374789356 - mean_average_precision(0.0): 0.4905494464640722\n", "Epoch 13/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.1886\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.46086526212639095 - normalized_discounted_cumulative_gain@5(0.0): 0.5347221469997477 - mean_average_precision(0.0): 0.4972628568563632\n", + "102/102 [==============================] - 45s 440ms/step - loss: 0.1365\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4698836510431016 - normalized_discounted_cumulative_gain@5(0.0): 0.5317255666034969 - mean_average_precision(0.0): 0.49152222966181813\n", "Epoch 14/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.1770\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4524514918879093 - normalized_discounted_cumulative_gain@5(0.0): 0.5259706685008083 - mean_average_precision(0.0): 0.4886127130697417\n", + "102/102 [==============================] - 45s 437ms/step - loss: 0.1263\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.46841048236088156 - normalized_discounted_cumulative_gain@5(0.0): 0.5197949838102164 - mean_average_precision(0.0): 0.4887341126171474\n", "Epoch 15/20\n", - "32/32 [==============================] - 38s 1s/step - loss: 0.1454\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.447793222144205 - normalized_discounted_cumulative_gain@5(0.0): 0.523210520595902 - mean_average_precision(0.0): 0.4842295350811732\n", + "102/102 [==============================] - 46s 449ms/step - loss: 0.1208\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4591952265806063 - normalized_discounted_cumulative_gain@5(0.0): 0.5306329604843507 - mean_average_precision(0.0): 0.4956899590808506\n", "Epoch 16/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.1573\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4617597821704854 - normalized_discounted_cumulative_gain@5(0.0): 0.5233844194501931 - mean_average_precision(0.0): 0.48736454745855345\n", + "102/102 [==============================] - 44s 430ms/step - loss: 0.0977\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4698790408918565 - normalized_discounted_cumulative_gain@5(0.0): 0.5355447042513717 - mean_average_precision(0.0): 0.5005823464725863\n", "Epoch 17/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.1437\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.446051744365399 - normalized_discounted_cumulative_gain@5(0.0): 0.511689458533883 - mean_average_precision(0.0): 0.47390160852977303\n", + "102/102 [==============================] - 44s 436ms/step - loss: 0.0975\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4699380823064665 - normalized_discounted_cumulative_gain@5(0.0): 0.5335843828018585 - mean_average_precision(0.0): 0.4945873841691485\n", "Epoch 18/20\n", - "32/32 [==============================] - 40s 1s/step - loss: 0.1396\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44155513060981444 - normalized_discounted_cumulative_gain@5(0.0): 0.508852366919329 - mean_average_precision(0.0): 0.47430841711913996\n", + "102/102 [==============================] - 44s 431ms/step - loss: 0.1070\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4558123512520484 - normalized_discounted_cumulative_gain@5(0.0): 0.5280824209271964 - mean_average_precision(0.0): 0.49009730599920476\n", "Epoch 19/20\n", - "32/32 [==============================] - 39s 1s/step - loss: 0.1176\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4480183178506102 - normalized_discounted_cumulative_gain@5(0.0): 0.5177348617853279 - mean_average_precision(0.0): 0.4799578376954719\n", + "102/102 [==============================] - 45s 446ms/step - loss: 0.0846\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.47468488947984894 - normalized_discounted_cumulative_gain@5(0.0): 0.5462940161373581 - mean_average_precision(0.0): 0.5050693971440435\n", "Epoch 20/20\n", - "32/32 [==============================] - 37s 1s/step - loss: 0.1094\n", - "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.44665417415821596 - normalized_discounted_cumulative_gain@5(0.0): 0.5142203489288135 - mean_average_precision(0.0): 0.47726846390007227\n" + "102/102 [==============================] - 43s 425ms/step - loss: 0.0833\n", + "Validation: normalized_discounted_cumulative_gain@3(0.0): 0.4571219999869289 - normalized_discounted_cumulative_gain@5(0.0): 0.527098973778668 - mean_average_precision(0.0): 0.4884211445807594\n" ] } ], From bc85e1ad7b2346a33ae02fd8180f22e5800ee034 Mon Sep 17 00:00:00 2001 From: bo Date: Fri, 12 Apr 2019 15:51:00 +0200 Subject: [PATCH 039/100] fix variable error in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6e4e0571..bb49d2dd 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Generate pair-wise training data on-the-fly, evaluate model performance using cu train_generator = mz.PairDataGenerator(train_processed, num_dup=1, num_neg=4, batch_size=64, shuffle=True) valid_x, valid_y = valid_processed.unpack() -evaluate = mz.callbacks.EvaluateAllMetrics(model, x=valid_x, y=valid_y, batch_size=len(pred_x)) +evaluate = mz.callbacks.EvaluateAllMetrics(model, x=valid_x, y=valid_y, batch_size=len(valid_x)) history = model.fit_generator(train_generator, epochs=20, callbacks=[evaluate], workers=5, use_multiprocessing=False) ``` From dc950a7ee2a392b6e4b419fa5004338537d80e71 Mon Sep 17 00:00:00 2001 From: uduse Date: Sat, 13 Apr 2019 13:53:08 +0800 Subject: [PATCH 040/100] Increase CI information on failure. '-v' prints out all test names '--full-trace' prints out entire stack trace on errors '-l' prints out local vars on errors --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c1caf3ab..df5408cd 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ init: pip install -r requirements.txt -TEST_ARGS = --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning --ignore=matchzoo/contrib +TEST_ARGS = -v --full-trace -l --doctest-modules --doctest-continue-on-failure --cov matchzoo/ --cov-report term-missing --cov-report html --cov-config .coveragerc matchzoo/ tests/ -W ignore::DeprecationWarning --ignore=matchzoo/contrib FLAKE_ARGS = ./matchzoo --exclude=__init__.py,matchzoo/contrib test: From b93a9856f3ca2ac0358fb4d544265c5bd588cf27 Mon Sep 17 00:00:00 2001 From: Wang Bo Date: Sat, 13 Apr 2019 08:21:27 +0200 Subject: [PATCH 041/100] Feature/dssm tutorial (#711) * refactor dssm tutorial * add parametetrs to readme --- tutorials/wikiqa/README.rst | 17 +++++++++++++++++ tutorials/wikiqa/dssm.ipynb | 38 +++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/tutorials/wikiqa/README.rst b/tutorials/wikiqa/README.rst index 58da266f..a5521c9a 100644 --- a/tutorials/wikiqa/README.rst +++ b/tutorials/wikiqa/README.rst @@ -92,3 +92,20 @@ MatchLSTM 10 dropout_rate 0.5 ==== ==================== ====================================================== +DSSM +#### + +==== =========================== =================================== + .. Name Value +==== =========================== =================================== + 0 model_class + 1 input_shapes [(9645,), (9645,)] + 2 task Ranking Task + 3 optimizer adam + 4 with_multi_layer_perceptron True + 5 mlp_num_units 300 + 6 mlp_num_layers 3 + 7 mlp_num_fan_out 128 + 8 mlp_activation_func relu +==== =========================== =================================== + diff --git a/tutorials/wikiqa/dssm.ipynb b/tutorials/wikiqa/dssm.ipynb index 8eb6e11d..a7545b85 100644 --- a/tutorials/wikiqa/dssm.ipynb +++ b/tutorials/wikiqa/dssm.ipynb @@ -32,24 +32,24 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 3802.39it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:04<00:00, 3959.06it/s]\n", - "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 822625.79it/s]\n", - "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 597166.86it/s]\n", - "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 4642343.92it/s]\n", - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:00<00:00, 2853.90it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 18841/18841 [00:12<00:00, 1456.96it/s]\n", - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 2308.40it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:00<00:00, 2025.86it/s]\n", - "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 2678.58it/s]\n", - "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:01<00:00, 1345.18it/s]\n" + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 2118/2118 [00:00<00:00, 3587.72it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter: 100%|██████████| 18841/18841 [00:04<00:00, 4528.13it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 592156.77it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 432217.30it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 1614998/1614998 [00:00<00:00, 4239505.32it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2118/2118 [00:00<00:00, 2709.71it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 18841/18841 [00:11<00:00, 1656.57it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 122/122 [00:00<00:00, 1120.91it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 1115/1115 [00:00<00:00, 1895.34it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 237/237 [00:00<00:00, 1910.44it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval => StopRemoval => NgramLetter => WordHashing: 100%|██████████| 2300/2300 [00:01<00:00, 1630.79it/s]\n" ] } ], @@ -62,19 +62,19 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'vocab_unit': ,\n", + "{'vocab_unit': ,\n", " 'vocab_size': 9645,\n", " 'embedding_input_dim': 9645,\n", " 'input_shapes': [(9645,), (9645,)]}" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -85,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -99,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -152,7 +152,9 @@ "model.guess_and_fill_missing_params()\n", "model.build()\n", "model.compile()\n", - "model.backend.summary()" + "model.backend.summary()\n", + "\n", + "append_params_to_readme(model)" ] }, { From d5789ac415a419680b3a1e0ff8c599d142468ebb Mon Sep 17 00:00:00 2001 From: rgtjf Date: Sun, 14 Apr 2019 22:16:25 +0800 Subject: [PATCH 042/100] hotfix: typo --- matchzoo/contrib/models/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 59aa4b78..7b48145f 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,3 +1,3 @@ from .match_lstm import MatchLSTM from .esim import ESIM -from .bimpm_model import BiMpM +from .bimpm import BiMPM From 49cfea5a578b3f1bad74f09988467bc453791514 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Sun, 14 Apr 2019 22:46:06 +0800 Subject: [PATCH 043/100] hotfix: reduce hidden_size from 128 to 32 --- matchzoo/contrib/models/bimpm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/contrib/models/bimpm.py b/matchzoo/contrib/models/bimpm.py index d795889e..e49e0de8 100644 --- a/matchzoo/contrib/models/bimpm.py +++ b/matchzoo/contrib/models/bimpm.py @@ -45,7 +45,7 @@ def get_default_params(cls) -> ParamTable: 'max-attentive': True})) params.add(Param('mp_dim', 20)) params.add(Param('att_dim', 20)) - params.add(Param('hidden_size', 128)) + params.add(Param('hidden_size', 32)) params.add(Param('dropout_rate', 0.0)) params.add(Param('w_initializer', 'glorot_uniform')) params.add(Param('b_initializer', 'zeros')) From 42b4fcf274615480bc6a3afa891ce2ae34d3bcea Mon Sep 17 00:00:00 2001 From: rgtjf Date: Sun, 14 Apr 2019 23:14:23 +0800 Subject: [PATCH 044/100] hotfix: remove unused code --- matchzoo/contrib/layers/attention_layer.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/matchzoo/contrib/layers/attention_layer.py b/matchzoo/contrib/layers/attention_layer.py index 74bb1331..3ec88114 100644 --- a/matchzoo/contrib/layers/attention_layer.py +++ b/matchzoo/contrib/layers/attention_layer.py @@ -23,7 +23,7 @@ class AttentionLayer(Layer): def __init__(self, att_dim: int, att_type: str = 'default', - remove_diagonal: bool = False, + # remove_diagonal: bool = False, dropout_rate: float = 0.0): """ class: `AttentionLayer` constructor. @@ -35,7 +35,7 @@ def __init__(self, super(AttentionLayer, self).__init__() self._att_dim = att_dim self._att_type = att_type - self._remove_diagonal = remove_diagonal + # self._remove_diagonal = remove_diagonal self._dropout_rate = dropout_rate @property @@ -128,16 +128,10 @@ def call(self, x: list, **kwargs): # diagonal = tf.expand_dims(diagonal, axis=0) # ['x', len1, len1] # attn_value = attn_value * diagonal - if len(x) == 4: - mask_lt = x[2] - mask_rt = x[3] - attn_value = attn_value * K.expand_dims(mask_lt, axis=2) - attn_value = attn_value * K.expand_dims(mask_rt, axis=1) - # softmax attn_prob = K.softmax(attn_value) # [batch_size, len_1, len_2] - # if remove_diagonal: attn_value = attn_value * diagonal + if len(x) == 4: mask_lt = x[2] mask_rt = x[3] From 62acc732d9c8cf5f1088e154aa606f42b8473773 Mon Sep 17 00:00:00 2001 From: bo Date: Mon, 15 Apr 2019 10:20:07 +0200 Subject: [PATCH 045/100] simplify quick start --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index bb49d2dd..ad5c345c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,6 @@ import matchzoo as mz train_pack = mz.datasets.wiki_qa.load_data('train', task='ranking') valid_pack = mz.datasets.wiki_qa.load_data('dev', task='ranking') -predict_pack = mz.datasets.wiki_qa.load_data('test', task='ranking') ``` Preprocess your input data in three lines of code, keep track parameters to be passed into the model. @@ -84,7 +83,6 @@ Make use of MatchZoo customized loss functions and evaluation metrics: ranking_task = mz.tasks.Ranking(loss=mz.losses.RankCrossEntropyLoss(num_neg=4)) ranking_task.metrics = [ mz.metrics.NormalizedDiscountedCumulativeGain(k=3), - mz.metrics.NormalizedDiscountedCumulativeGain(k=5), mz.metrics.MeanAveragePrecision() ] ``` @@ -95,10 +93,6 @@ Initialize the model, fine-tune the hyper-parameters. model = mz.models.DSSM() model.params['input_shapes'] = preprocessor.context['input_shapes'] model.params['task'] = ranking_task -model.params['mlp_num_layers'] = 3 -model.params['mlp_num_units'] = 300 -model.params['mlp_num_fan_out'] = 128 -model.params['mlp_activation_func'] = 'relu' model.guess_and_fill_missing_params() model.build() model.compile() @@ -108,10 +102,8 @@ Generate pair-wise training data on-the-fly, evaluate model performance using cu ```python train_generator = mz.PairDataGenerator(train_processed, num_dup=1, num_neg=4, batch_size=64, shuffle=True) - valid_x, valid_y = valid_processed.unpack() evaluate = mz.callbacks.EvaluateAllMetrics(model, x=valid_x, y=valid_y, batch_size=len(valid_x)) - history = model.fit_generator(train_generator, epochs=20, callbacks=[evaluate], workers=5, use_multiprocessing=False) ``` From 9137e0180e67b96f8963aa3a93521c0f1e6aceae Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Mon, 15 Apr 2019 19:43:35 +0800 Subject: [PATCH 046/100] add HBMP model (#663) * add HBMP model * makefile modify * remove changes to Makefile * rename 'alpha' param; move _output_layer to build() * Modify the model name; use Bidirectional Wrappers * modify variable nameing issue, line formatting and first letter upper case --- matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/hbmp.py | 154 ++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 matchzoo/contrib/models/hbmp.py diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 6a81f8f3..d6d85e33 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,2 +1,3 @@ from .match_lstm import MatchLSTM +from .hbmp import HBMP from .esim import ESIM \ No newline at end of file diff --git a/matchzoo/contrib/models/hbmp.py b/matchzoo/contrib/models/hbmp.py new file mode 100644 index 00000000..342ec53b --- /dev/null +++ b/matchzoo/contrib/models/hbmp.py @@ -0,0 +1,154 @@ +"""HBMP model.""" +import keras +import typing + +from matchzoo.engine import hyper_spaces +from matchzoo.engine.param_table import ParamTable +from matchzoo.engine.param import Param +from matchzoo.engine.base_model import BaseModel + + +class HBMP(BaseModel): + """ + HBMP model. + + Examples: + >>> model = HBMP() + >>> model.guess_and_fill_missing_params(verbose=0) + >>> model.params['embedding_input_dim'] = 10000 + >>> model.params['embedding_output_dim'] = 100 + >>> model.params['embedding_trainable'] = True + >>> model.params['alpha'] = 0.1 + >>> model.params['mlp_num_layers'] = 3 + >>> model.params['mlp_num_units'] = [600, 600] + >>> model.params['lstm_num_units'] = 600 + >>> model.params['dropout_rate'] = 0.1 + >>> model.build() + """ + + @classmethod + def get_default_params(cls) -> ParamTable: + """:return: model default parameters.""" + params = super().get_default_params(with_embedding=True) + params['optimizer'] = 'adam' + params.add(Param(name='alpha', value=0.1, + desc="Negative slope coefficient of LeakyReLU " + "function.")) + params.add(Param(name='mlp_num_layers', value=3, + desc="The number of layers of mlp.")) + params.add(Param(name='mlp_num_units', value=[600, 600], + desc="The hidden size of the FC layers, but not " + "include the final layer.")) + params.add(Param(name='lstm_num_units', value=600, + desc="The hidden size of the LSTM layer.")) + params.add(Param( + name='dropout_rate', value=0.1, + hyper_space=hyper_spaces.quniform( + low=0.0, high=0.8, q=0.01), + desc="The dropout rate." + )) + return params + + def build(self): + """Build model structure.""" + input_left, input_right = self._make_inputs() + + embedding = self._make_embedding_layer() + embed_left = embedding(input_left) + embed_right = embedding(input_right) + + # Get sentence embedding + embed_sen_left = self._sentence_encoder( + embed_left, + lstm_num_units=self._params['lstm_num_units'], + drop_rate=self._params['dropout_rate']) + embed_sen_right = self._sentence_encoder( + embed_right, + lstm_num_units=self._params['lstm_num_units'], + drop_rate=self._params['dropout_rate']) + + # Concatenate two sentence embedding: [embed_sen_left, embed_sen_right, + # |embed_sen_left-embed_sen_right|, embed_sen_left*embed_sen_right] + embed_minus = keras.layers.Subtract()( + [embed_sen_left, embed_sen_right]) + embed_minus_abs = keras.layers.Lambda(lambda x: abs(x))(embed_minus) + embed_multiply = keras.layers.Multiply()( + [embed_sen_left, embed_sen_right]) + concat = keras.layers.Concatenate(axis=1)( + [embed_sen_left, embed_sen_right, embed_minus_abs, embed_multiply]) + + # Multiply perception layers to classify + mlp_out = self._classifier( + concat, + mlp_num_layers=self._params['mlp_num_layers'], + mlp_num_units=self._params['mlp_num_units'], + drop_rate=self._params['dropout_rate'], + leaky_relu_alpah=self._params['alpha']) + out = self._make_output_layer()(mlp_out) + + self._backend = keras.Model( + inputs=[input_left, input_right], outputs=out) + + def _classifier( + self, + input_: typing.Any, + mlp_num_layers: int, + mlp_num_units: list, + drop_rate: float, + leaky_relu_alpah: float + ) -> typing.Any: + for i in range(mlp_num_layers - 1): + input_ = keras.layers.Dropout(rate=drop_rate)(input_) + input_ = keras.layers.Dense(mlp_num_units[i])(input_) + input_ = keras.layers.LeakyReLU(alpha=leaky_relu_alpah)(input_) + + return input_ + + def _sentence_encoder( + self, + input_: typing.Any, + lstm_num_units: int, + drop_rate: float + ) -> typing.Any: + """ + Stack three BiLSTM MaxPooling blocks as a hierarchical structure. + Concatenate the output of three blocs as the input sentence embedding. + Each BiLSTM layer reads the input sentence as the input. + Each BiLSTM layer except the first one is initialized(the initial + hidden state and the cell state) with the final state of the previous + layer. + """ + emb1 = keras.layers.Bidirectional( + keras.layers.LSTM( + units=lstm_num_units, + return_sequences=True, + return_state=True, + dropout=drop_rate, + recurrent_dropout=drop_rate), + merge_mode='concat')(input_) + emb1_maxpooling = keras.layers.GlobalMaxPooling1D()(emb1[0]) + + emb2 = keras.layers.Bidirectional( + keras.layers.LSTM( + units=lstm_num_units, + return_sequences=True, + return_state=True, + dropout=drop_rate, + recurrent_dropout=drop_rate), + merge_mode='concat')(input_, initial_state=emb1[1:5]) + emb2_maxpooling = keras.layers.GlobalMaxPooling1D()(emb2[0]) + + emb3 = keras.layers.Bidirectional( + keras.layers.LSTM( + units=lstm_num_units, + return_sequences=True, + return_state=True, + dropout=drop_rate, + recurrent_dropout=drop_rate), + merge_mode='concat')(input_, initial_state=emb2[1:5]) + emb3_maxpooling = keras.layers.GlobalMaxPooling1D()(emb3[0]) + + emb = keras.layers.Concatenate(axis=1)( + [emb1_maxpooling, emb2_maxpooling, emb3_maxpooling]) + + return emb From a3d97fa002033ac975cd00487499c2b2daab0754 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Thu, 18 Apr 2019 14:02:58 +0800 Subject: [PATCH 047/100] feature/bimpm: clean code 1. add layer examples 2. remove comment codes 3. resolve conficts --- matchzoo/contrib/layers/attention_layer.py | 59 ++++---- .../contrib/layers/multi_perspective_layer.py | 138 +++++++++++++----- matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/bimpm.py | 44 ------ 4 files changed, 126 insertions(+), 116 deletions(-) diff --git a/matchzoo/contrib/layers/attention_layer.py b/matchzoo/contrib/layers/attention_layer.py index 3ec88114..53714f06 100644 --- a/matchzoo/contrib/layers/attention_layer.py +++ b/matchzoo/contrib/layers/attention_layer.py @@ -6,7 +6,7 @@ class AttentionLayer(Layer): """ - Layer that compute attention for Bimpm model. + Layer that compute attention for BiMPM model. For detailed information, see Bilateral Multi-Perspective Matching for Natural Language Sentences, section 3.2. @@ -17,25 +17,24 @@ class AttentionLayer(Layer): Examples: >>> import matchzoo as mz >>> layer = mz.contrib.layers.AttentionLayer(att_dim=50) + >>> layer.compute_output_shape([(32, 10, 100), (32, 40, 100)]) + (32, 10, 40) """ def __init__(self, att_dim: int, att_type: str = 'default', - # remove_diagonal: bool = False, dropout_rate: float = 0.0): """ class: `AttentionLayer` constructor. :param att_dim: int :param att_type: int - :param remove_diagonal: bool """ super(AttentionLayer, self).__init__() self._att_dim = att_dim self._att_type = att_type - # self._remove_diagonal = remove_diagonal self._dropout_rate = dropout_rate @property @@ -52,14 +51,15 @@ def build(self, input_shapes): """ Build the layer. - :param input_shapes: input_shapes + :param input_shapes: input_shape_lt, input_shape_rt """ if not isinstance(input_shapes, list): raise ValueError('A attention layer should be called ' 'on a list of inputs.') - # input_shapes[0]: batch, time_steps, d + hidden_dim_lt = input_shapes[0][2] hidden_dim_rt = input_shapes[1][2] + self.attn_w1 = self.add_weight(name='attn_w1', shape=(hidden_dim_lt, self._att_dim), @@ -73,7 +73,7 @@ def build(self, input_shapes): self._att_dim), initializer='uniform', trainable=True) - + # diagonal_W: (1, 1, a) self.diagonal_W = self.add_weight(name='diagonal_W', shape=(1, 1, @@ -87,7 +87,7 @@ def call(self, x: list, **kwargs): Calculate attention. :param x: [reps_lt, reps_rt] - :return attn_prob: [batch_size, len_1, len_2] + :return attn_prob: [b, s_lt, s_rt] """ if not isinstance(x, list): @@ -96,47 +96,41 @@ def call(self, x: list, **kwargs): reps_lt, reps_rt = x - # [1, 1, d, 20] attn_w1 = self.attn_w1 attn_w1 = K.expand_dims(K.expand_dims(attn_w1, axis=0), axis=0) - # [b, s, d, -1] + # => [1, 1, d, a] + reps_lt = K.expand_dims(reps_lt, axis=-1) attn_reps_lt = K.sum(reps_lt * attn_w1, axis=2) + # => [b, s_lt, d, -1] - # [1, 1, d, 20] attn_w2 = self.attn_w2 attn_w2 = K.expand_dims(K.expand_dims(attn_w2, axis=0), axis=0) - # [b, s, d, -1] + # => [1, 1, d, a] + reps_rt = K.expand_dims(reps_rt, axis=-1) - attn_reps_rt = K.sum(reps_rt * attn_w2, axis=2) + attn_reps_rt = K.sum(reps_rt * attn_w2, axis=2) # [b, s_rt, d, -1] - # Tanh - attn_reps_lt = K.tanh(attn_reps_lt) # [b, s, 20] - attn_reps_rt = K.tanh(attn_reps_rt) + attn_reps_lt = K.tanh(attn_reps_lt) # [b, s_lt, a] + attn_reps_rt = K.tanh(attn_reps_rt) # [b, s_rt, a] # diagonal_W - attn_reps_lt = attn_reps_lt * self.diagonal_W # [b, s, 20] + attn_reps_lt = attn_reps_lt * self.diagonal_W # [b, s_lt, a] attn_reps_rt = K.permute_dimensions(attn_reps_rt, (0, 2, 1)) + # => [b, a, s_rt] - # [batch_size, s, s] - attn_value = K.batch_dot(attn_reps_lt, attn_reps_rt) + attn_value = K.batch_dot(attn_reps_lt, attn_reps_rt) # [b, s_lt, s_rt] - # TODO(tjf) or remove: normalize - # if self.remove_diagonal: - # diagonal = K.ones([len_1], tf.float32) # [len1] - # diagonal = 1.0 - tf.diag(diagonal) # [len1, len1] - # diagonal = tf.expand_dims(diagonal, axis=0) # ['x', len1, len1] - # attn_value = attn_value * diagonal + # Softmax operation + attn_prob = K.softmax(attn_value) # [b, s_lt, s_rt] - # softmax - attn_prob = K.softmax(attn_value) # [batch_size, len_1, len_2] + # TODO(tjf) remove diagonal or not for normalization # if remove_diagonal: attn_value = attn_value * diagonal if len(x) == 4: - mask_lt = x[2] - mask_rt = x[3] - attn_prob = attn_prob * K.expand_dims(mask_lt, axis=2) - attn_prob = attn_prob * K.expand_dims(mask_rt, axis=1) + mask_lt, mask_rt = x[2], x[3] + attn_prob *= K.expand_dims(mask_lt, axis=2) + attn_prob *= K.expand_dims(mask_rt, axis=1) return attn_prob @@ -145,4 +139,5 @@ def compute_output_shape(self, input_shapes): if not isinstance(input_shapes, list): raise ValueError('A attention layer should be called ' 'on a list of inputs.') - return input_shapes[0][0], input_shapes[0][1], input_shapes[1][1] + input_shape_lt, input_shape_rt = input_shapes[0], input_shapes[1] + return input_shape_lt[0], input_shape_lt[1], input_shape_rt[1] diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index 212da13c..e801df3a 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -8,14 +8,21 @@ class MultiPerspectiveLayer(Layer): """ - A keras implementation of Bimpm multi-perspective layer. + A keras implementation of multi-perspective layer of BiMPM. For detailed information, see Bilateral Multi-Perspective Matching for Natural Language Sentences, section 3.2. Examples: >>> import matchzoo as mz - >>> layer = mz.contrib.layers.MultiPerspectiveLayer(50, 20, None) + >>> perspective={'full': True, 'max-pooling': True, + ... 'attentive': True, 'max-attentive': True} + >>> layer = mz.contrib.layers.MultiPerspectiveLayer( + ... att_dim=50, mp_dim=20, perspective=perspective) + >>> layer.compute_output_shape( + ... [(32, 10, 100), (32, 50), None, (32, 50), None, + ... [(32, 40, 100), (32, 50), None, (32, 50), None]]) + (32, 10, 83) """ @@ -54,7 +61,6 @@ def build(self, input_shape: list): if self._perspective.get('max-attentive'): self.max_attentive_match = MpMaxAttentiveMatch(self._att_dim) - self.built = True def call(self, x: list, **kwargs): @@ -105,14 +111,23 @@ def call(self, x: list, **kwargs): match_dim += self._mp_dim + 1 mp_tensor = K.concatenate(match_tensor_list, axis=-1) - self.output_dim = match_dim - return mp_tensor def compute_output_shape(self, input_shape: list): """Compute output shape.""" shape_a = input_shape[0] - return shape_a[0], shape_a[1], self.output_dim + + match_dim = 0 + if self._perspective.get('full'): + match_dim += self._mp_dim + 1 + if self._perspective.get('max-pooling'): + match_dim += self._mp_dim + if self._perspective.get('attentive'): + match_dim += self._mp_dim + 1 + if self._perspective.get('max-attentive'): + match_dim += self._mp_dim + 1 + + return shape_a[0], shape_a[1], match_dim class MpFullMatch(Layer): @@ -191,6 +206,13 @@ class MpAttentiveMatch(Layer): Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L188-L193 + Examples: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.multi_perspective_layer.MpAttentiveMatch( + ... att_dim=30, mp_dim=20) + >>> layer.compute_output_shape([(32, 10, 100), (32, 40, 100)]) + (32, 10, 20) + """ def __init__(self, att_dim, mp_dim): @@ -265,8 +287,8 @@ def collect_representation(representation, positions): Collect_representation. :param representation: [batch_size, node_num, feature_dim] - :param positions: [batch_size, neigh_num] - :return: + :param positions: [batch_size, neighbour_num] + :return: [batch_size, neighbour_num]? """ return collect_probs(representation, positions) @@ -275,7 +297,7 @@ def collect_final_step_of_lstm(lstm_representation, lengths): """ Collect final step of lstm. - :param lstm_representation: [batch_size, passsage_length, dim] + :param lstm_representation: [batch_size, len_rt, dim] :param lengths: [batch_size] :return: [batch_size, dim] """ @@ -294,7 +316,7 @@ def collect_final_step_of_lstm(lstm_representation, lengths): def collect_probs(probs, positions): """ - Collect Probs. + Collect Probabilities. Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/layer_utils.py#L128-L140 @@ -312,7 +334,7 @@ def collect_probs(probs, positions): batch_nums = K.tile(batch_nums, [1, pair_size]) # shape (batch_size, pair_size, 2) - # alert: to solve error message + # Alert: to solve error message positions = K.tf.to_int32(positions) indices = K.stack([batch_nums, positions], axis=2) @@ -329,28 +351,31 @@ def _multi_perspective_match(mp_dim, reps_lt, reps_rt, reference: https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L207-L223 :param mp_dim: about 20 - :param reps_lt: [batch, len, dim] - :param reps_rt: [batch, len, dim] + :param reps_lt: [batch, len_lt, dim] + :param reps_rt: [batch, len_rt, dim] :param with_cosine: True :param with_mp_cosine: True :return: [batch, len, feature_dim*2] """ - input_shape = K.shape(reps_lt) - batch_size = input_shape[0] - seq_length = input_shape[1] + shape_lt = K.shape(reps_lt) + batch_size = shape_lt[0] + len_lt = shape_lt[1] match_dim = 0 match_result_list = [] if with_cosine: - cosine_value = _cosine_distance(reps_lt, reps_rt, False) - cosine_value = K.reshape(cosine_value, [batch_size, seq_length, 1]) - match_result_list.append(cosine_value) + cosine_tensor = _safe_cosine_distance(reps_lt, reps_rt, False) + cosine_tensor = K.reshape(cosine_tensor, + [batch_size, len_lt, 1]) + match_result_list.append(cosine_tensor) match_dim += 1 if with_mp_cosine: mp_cosine_layer = MpCosineLayer(mp_dim) - match_tensor = mp_cosine_layer([reps_lt, reps_rt]) - match_result_list.append(match_tensor) + mp_cosine_tensor = mp_cosine_layer([reps_lt, reps_rt]) + mp_cosine_tensor = K.reshape(mp_cosine_tensor, + [batch_size, len_lt, mp_dim]) + match_result_list.append(mp_cosine_tensor) match_dim += mp_cosine_layer.mp_dim match_result = K.concatenate(match_result_list, 2) @@ -363,6 +388,14 @@ class MpCosineLayer(Layer): Reference: https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L121-L129 + + Examples: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.multi_perspective_layer.MpCosineLayer( + ... mp_dim=50) + >>> layer.compute_output_shape([(32, 10, 100), (32, 40, 100)]) + (32, 10, 40, 50) + """ def __init__(self, mp_dim, **kwargs): @@ -382,44 +415,69 @@ def build(self, input_shape): def call(self, x, **kwargs): """Call.""" v1, v2 = x - v1 = K.expand_dims(v1, 2) * self.kernel - v2 = K.expand_dims(v2, 2) - return _cosine_distance(v1, v2, False) + v1 = K.expand_dims(v1, 2) * self.kernel # [b, s_lt, m, d] + v2 = K.expand_dims(v2, 2) # [b, s_rt, 1, d] + return _safe_cosine_distance(v1, v2, False) def compute_output_shape(self, input_shape): """Compute output shape.""" - return input_shape[0][0], input_shape[0][1], self.mp_dim + return input_shape[0][0], input_shape[0][1], input_shape[1][1], \ + self.mp_dim def _calc_relevancy_matrix(reps_lt, reps_rt): - # -> [batch_size, 1, len_lt, dim] - reps_lt = K.expand_dims(reps_lt, 1) - reps_rt = K.expand_dims(reps_rt, 2) - # -> [batch_size, len_rt, 1, dim] - # in_passage_repres_tmp = K.expand_dims(reps_rt, 2) + reps_lt = K.expand_dims(reps_lt, 1) # [b, 1, len_lt, d] + reps_rt = K.expand_dims(reps_rt, 2) # [b, len_rt, 1, d] relevancy_matrix = _cosine_distance(reps_lt, reps_rt) return relevancy_matrix -def _mask_relevancy_matrix(relevancy_matrix, question_mask, passage_mask): - # relevancy_matrix: [batch_size, passage_len, question_len] - # question_mask: [batch_size, question_len] - # passage_mask: [batch_size, passsage_len] - if question_mask is not None: - relevancy_matrix = relevancy_matrix * K.expand_dims(question_mask, 1) - relevancy_matrix = relevancy_matrix * K.expand_dims(passage_mask, 2) +def _mask_relevancy_matrix(relevancy_matrix, mask_lt, mask_rt): + """ + Mask relevancy matrix. + + :param relevancy_matrix: [b, len_rt, len_lt] + :param mask_lt: [b, len_lt] + :param mask_rt: [b, len_rt] + :return: masked_matrix: [b, len_rt, len_lt] + """ + if mask_lt is not None: + relevancy_matrix = relevancy_matrix * K.expand_dims(mask_lt, 1) + relevancy_matrix = relevancy_matrix * K.expand_dims(mask_rt, 2) return relevancy_matrix +def _safe_cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): + """ + Only requires `K.sum(v1 * v2, axis=-1)`. + + :param v1: [batch, time_steps(v1), 1, m, d] + :param v2: [batch, 1, time_steps(v2), m, d] + :param cosine_norm: True + :param eps: 1e-6 + :return: [batch, time_steps(v1), time_steps(v2), m] + """ + shape1, shape2 = K.shape(v1), K.shape(v2) + if shape1[1] != shape2[1]: + v1 = K.expand_dims(v1, 2) # [b, s_lt, 1, m, d] + v2 = K.expand_dims(v2, 1) # [b, 1, s_rt, m, d] + cosine_numerator = K.sum(v1 * v2, axis=-1) + if not cosine_norm: + return K.tanh(cosine_numerator) + v1_norm = K.sqrt(K.maximum(K.sum(K.square(v1), axis=-1), eps)) + v2_norm = K.sqrt(K.maximum(K.sum(K.square(v2), axis=-1), eps)) + return cosine_numerator / v1_norm / v2_norm + + def _cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): """ Only requires `K.sum(v1 * v2, axis=-1)`. - :param v1: [batch, time_steps(v1), 1, l, d] - :param v2: [batch, 1, time_steps(v2), l, d] + :param v1: [batch, time_steps(v1), 1, m, d] + :param v2: [batch, 1, time_steps(v2), m, d] :param cosine_norm: True :param eps: 1e-6 - :return: [batch, time_steps(v1), time_steps(v2), l] + :return: [batch, time_steps(v1), time_steps(v2), m] """ cosine_numerator = K.sum(v1 * v2, axis=-1) if not cosine_norm: diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index 7b48145f..7c51acbb 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -1,3 +1,4 @@ from .match_lstm import MatchLSTM + from .esim import ESIM from .bimpm import BiMPM diff --git a/matchzoo/contrib/models/bimpm.py b/matchzoo/contrib/models/bimpm.py index e49e0de8..b5ee162f 100644 --- a/matchzoo/contrib/models/bimpm.py +++ b/matchzoo/contrib/models/bimpm.py @@ -56,50 +56,6 @@ def get_default_params(cls) -> ParamTable: return params - # @classmethod - # def get_default_preprocessor(cls): - # """:return: Instance of :class:`NaivePreprocessor`.""" - # return preprocessors.NaivePreprocessor() - # - # @property - # def word_embedding_mat(self) -> np.ndarray: - # """Get pretrained embedding for ArcI model.""" - # # Check if provided embedding matrix - # if self._params['word_embedding_mat'] is None: - # raise TypeError('No pre-trained word embeddings provided.') - # - # @word_embedding_mat.setter - # def word_embedding_mat(self, embedding_mat: np.ndarray): - # """ - # Set pretrained embedding for ArcI model. - # - # :param embedding_mat: pretrained embedding in numpy format. - # """ - # self._params['word_embedding_mat'] = embedding_mat - # self._params['vocab_size'], self._params['dim_word_embedding'] = \ - # embedding_mat.shape - # - # @property - # def char_embedding_mat(self) -> np.ndarray: - # """Initialize character level embedding.""" - # s = self._params['embedding_random_scale'] - # self._params['char_embedding_mat'] = \ - # np.random.uniform(-s, s, (self._params['vocab_size'], - # self._params['dim_char_embedding'])) - # return self._params['char_embedding_mat'] - # - # def char_embedding(self, char_input_shape, char_vocab_size): - # """Create a character level embedding model.""" - # input_char = Input(shape=char_input_shape) - # embed_char = LSTM(self._params['dim_char_embedding'], - # kernel_initializer=self._params['w_initializer'], - # bias_initializer=self._params['b_initializer'])( - # input_char) - # embed_char = Dense(char_vocab_size, - # activation=self._params['activation_embedding'])( - # embed_char) - # return Model(input_char, embed_char) - def build(self): """Build model structure.""" # ~ Input Layer From e3bb68bb772a39121d9ab9393a1529ca07e3f6aa Mon Sep 17 00:00:00 2001 From: rgtjf Date: Thu, 18 Apr 2019 14:41:42 +0800 Subject: [PATCH 048/100] feature/bimpm: fix att matching --- .../contrib/layers/multi_perspective_layer.py | 55 ++++++------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index e801df3a..dccd8bd9 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -233,11 +233,11 @@ def call(self, x, **kwargs): attention_layer = AttentionLayer(self.att_dim) attn_prob = attention_layer([reps_rt, reps_lt]) # attention reps - reps_lt = K.batch_dot(attn_prob, reps_lt) + att_lt = K.batch_dot(attn_prob, reps_lt) # mp match attn_match_tensor, match_dim = _multi_perspective_match(self.mp_dim, - reps_lt, - reps_rt) + reps_rt, + att_lt) return attn_match_tensor def compute_output_shape(self, input_shape): @@ -343,7 +343,7 @@ def collect_probs(probs, positions): return pair_probs -def _multi_perspective_match(mp_dim, reps_lt, reps_rt, +def _multi_perspective_match(mp_dim, reps_rt, att_lt, with_cosine=True, with_mp_cosine=True): """ The core function of zhiguowang's implementation. @@ -351,20 +351,20 @@ def _multi_perspective_match(mp_dim, reps_lt, reps_rt, reference: https://github.com/zhiguowang/BiMPM/blob/master/src/match_utils.py#L207-L223 :param mp_dim: about 20 - :param reps_lt: [batch, len_lt, dim] :param reps_rt: [batch, len_rt, dim] + :param att_lt: [batch, len_rt, dim] :param with_cosine: True :param with_mp_cosine: True - :return: [batch, len, feature_dim*2] + :return: [batch, len, 1 + mp_dim] """ - shape_lt = K.shape(reps_lt) - batch_size = shape_lt[0] - len_lt = shape_lt[1] + shape_rt = K.shape(reps_rt) + batch_size = shape_rt[0] + len_lt = shape_rt[1] match_dim = 0 match_result_list = [] if with_cosine: - cosine_tensor = _safe_cosine_distance(reps_lt, reps_rt, False) + cosine_tensor = _cosine_distance(reps_rt, att_lt, False) cosine_tensor = K.reshape(cosine_tensor, [batch_size, len_lt, 1]) match_result_list.append(cosine_tensor) @@ -372,7 +372,7 @@ def _multi_perspective_match(mp_dim, reps_lt, reps_rt, if with_mp_cosine: mp_cosine_layer = MpCosineLayer(mp_dim) - mp_cosine_tensor = mp_cosine_layer([reps_lt, reps_rt]) + mp_cosine_tensor = mp_cosine_layer([reps_rt, att_lt]) mp_cosine_tensor = K.reshape(mp_cosine_tensor, [batch_size, len_lt, mp_dim]) match_result_list.append(mp_cosine_tensor) @@ -393,8 +393,8 @@ class MpCosineLayer(Layer): >>> import matchzoo as mz >>> layer = mz.contrib.layers.multi_perspective_layer.MpCosineLayer( ... mp_dim=50) - >>> layer.compute_output_shape([(32, 10, 100), (32, 40, 100)]) - (32, 10, 40, 50) + >>> layer.compute_output_shape([(32, 10, 100), (32, 10, 100)]) + (32, 10, 50) """ @@ -416,13 +416,12 @@ def call(self, x, **kwargs): """Call.""" v1, v2 = x v1 = K.expand_dims(v1, 2) * self.kernel # [b, s_lt, m, d] - v2 = K.expand_dims(v2, 2) # [b, s_rt, 1, d] - return _safe_cosine_distance(v1, v2, False) + v2 = K.expand_dims(v2, 2) # [b, s_lt, 1, d] + return _cosine_distance(v1, v2, False) def compute_output_shape(self, input_shape): """Compute output shape.""" - return input_shape[0][0], input_shape[0][1], input_shape[1][1], \ - self.mp_dim + return input_shape[0][0], input_shape[0][1], self.mp_dim def _calc_relevancy_matrix(reps_lt, reps_rt): @@ -447,28 +446,6 @@ def _mask_relevancy_matrix(relevancy_matrix, mask_lt, mask_rt): return relevancy_matrix -def _safe_cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): - """ - Only requires `K.sum(v1 * v2, axis=-1)`. - - :param v1: [batch, time_steps(v1), 1, m, d] - :param v2: [batch, 1, time_steps(v2), m, d] - :param cosine_norm: True - :param eps: 1e-6 - :return: [batch, time_steps(v1), time_steps(v2), m] - """ - shape1, shape2 = K.shape(v1), K.shape(v2) - if shape1[1] != shape2[1]: - v1 = K.expand_dims(v1, 2) # [b, s_lt, 1, m, d] - v2 = K.expand_dims(v2, 1) # [b, 1, s_rt, m, d] - cosine_numerator = K.sum(v1 * v2, axis=-1) - if not cosine_norm: - return K.tanh(cosine_numerator) - v1_norm = K.sqrt(K.maximum(K.sum(K.square(v1), axis=-1), eps)) - v2_norm = K.sqrt(K.maximum(K.sum(K.square(v2), axis=-1), eps)) - return cosine_numerator / v1_norm / v2_norm - - def _cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): """ Only requires `K.sum(v1 * v2, axis=-1)`. From d7de730d9d1c20915524088ca4d1aeb4bfca0534 Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Thu, 18 Apr 2019 14:47:56 +0800 Subject: [PATCH 049/100] Add test for SpatialGRU and MatchingTensorLayer --- .../contrib/layers/matching_tensor_layer.py | 4 +-- matchzoo/contrib/layers/spatial_gru.py | 15 ++++----- tests/unit_test/test_layers.py | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py index 44de9f2f..1d494a6c 100644 --- a/matchzoo/contrib/layers/matching_tensor_layer.py +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -23,7 +23,7 @@ class MatchingTensorLayer(Layer): Examples: >>> import matchzoo as mz - >>> layer = mz.contrib.layers.MatchingTensorLayer(channels=10, + >>> layer = mz.contrib.layers.MatchingTensorLayer(channels=4, ... normalize=True, ... init_diag=True) >>> num_batch, left_len, right_len, num_dim = 5, 3, 2, 10 @@ -32,7 +32,7 @@ class MatchingTensorLayer(Layer): """ - def __init__(self, channels: int = 10, normalize: bool = False, + def __init__(self, channels: int = 4, normalize: bool = True, init_diag: bool = True, **kwargs): """:class:`MatchingTensorLayer` constructor.""" super(MatchingTensorLayer, self).__init__(**kwargs) diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py index 7676f744..656daacc 100644 --- a/matchzoo/contrib/layers/spatial_gru.py +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -45,15 +45,15 @@ class SpatialGRU(Layer): Examples: >>> import matchzoo as mz - >>> layer = mz.contrib.layers.SpatialGRU(units=50, + >>> layer = mz.contrib.layers.SpatialGRU(units=10, ... direction='lt') - >>> num_batch, channel, left_len, right_len = 5, 10, 3, 2 + >>> num_batch, channel, left_len, right_len = 5, 5, 3, 2 >>> layer.build([num_batch, channel, left_len, right_len]) """ def __init__(self, - units: int = 50, + units: int = 10, normalize: bool = False, init_diag: bool = False, activation: str = 'tanh', @@ -166,9 +166,9 @@ def calculate_recurrent_unit(self, z = self._time_distributed_dense(self._wz, q, self._bz) zi, zl, zt, zd = self.softmax_by_row(z) - hij_1 = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) - hij_2 = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) - hij_ = self._activation(hij_1 + hij_2) + hij_l = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) + hij_r = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) + hij_ = self._activation(hij_l + hij_r) hij = zl * h_left + zt * h_top + zd * h_diag + zi * hij_ states = states.write(((i + 1) * (self._text2_maxlen + 1) + j + 1), hij) @@ -261,7 +261,4 @@ def _time_distributed_dense(cls, w, x, b): if K.backend() == 'tensorflow': x = K.dot(x, w) x = K.bias_add(x, b) - else: - raise Exception("time_distributed_dense doesn't " - "backend tensorflow") return x diff --git a/tests/unit_test/test_layers.py b/tests/unit_test/test_layers.py index 88c9c1ab..8d77816a 100644 --- a/tests/unit_test/test_layers.py +++ b/tests/unit_test/test_layers.py @@ -3,6 +3,8 @@ from keras import backend as K from matchzoo import layers +from matchzoo.contrib.layers import SpatialGRU +from matchzoo.contrib.layers import MatchingTensorLayer def test_matching_layers(): @@ -26,3 +28,34 @@ def test_matching_layers(): layers.MatchingLayer(matching_type='error') with pytest.raises(ValueError): layers.MatchingLayer()([s1_tensor, s3_tensor]) + + +def test_spatial_gru(): + s_value = K.variable(np.array([[[[1, 2], [2, 3], [3, 4]], + [[4, 5], [5, 6], [6, 7]]], + [[[0.1, 0.2], [0.2, 0.3], [0.3, 0.4]], + [[0.4, 0.5], [0.5, 0.6], [0.6, 0.7]]]])) + for direction in ['lt', 'rb']: + model = SpatialGRU(direction=direction)(s_value) + _ = K.eval(model) + with pytest.raises(ValueError): + SpatialGRU(direction='lr')(s_value) + + +def test_matching_tensor_layer(): + s1_value = np.array([[[1, 2], [2, 3], [3, 4]], + [[0.1, 0.2], [0.2, 0.3], [0.3, 0.4]]]) + s2_value = np.array([[[1, 2], [2, 3]], + [[0.1, 0.2], [0.2, 0.3]]]) + s3_value = np.array([[[1, 2], [2, 3]], + [[0.1, 0.2], [0.2, 0.3]], + [[0.1, 0.2], [0.2, 0.3]]]) + s1_tensor = K.variable(s1_value) + s2_tensor = K.variable(s2_value) + s3_tensor = K.variable(s3_value) + for init_diag in [True, False]: + model = MatchingTensorLayer( + init_diag=init_diag)([s1_tensor, s2_tensor]) + _ = K.eval(model) + with pytest.raises(ValueError): + layers.MatchingLayer()([s1_tensor, s3_tensor]) From b95b76b5b3b8cc18d60d09541e521bffead1a999 Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Thu, 18 Apr 2019 15:07:05 +0800 Subject: [PATCH 050/100] Update test for SpatialGRU and MatchingTensorLayer --- tests/unit_test/test_layers.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/unit_test/test_layers.py b/tests/unit_test/test_layers.py index 8d77816a..abfdebf4 100644 --- a/tests/unit_test/test_layers.py +++ b/tests/unit_test/test_layers.py @@ -36,8 +36,9 @@ def test_spatial_gru(): [[[0.1, 0.2], [0.2, 0.3], [0.3, 0.4]], [[0.4, 0.5], [0.5, 0.6], [0.6, 0.7]]]])) for direction in ['lt', 'rb']: - model = SpatialGRU(direction=direction)(s_value) - _ = K.eval(model) + model = SpatialGRU(direction=direction) + _ = K.eval(model(s_value)) + _ = model.get_config() with pytest.raises(ValueError): SpatialGRU(direction='lr')(s_value) @@ -54,8 +55,8 @@ def test_matching_tensor_layer(): s2_tensor = K.variable(s2_value) s3_tensor = K.variable(s3_value) for init_diag in [True, False]: - model = MatchingTensorLayer( - init_diag=init_diag)([s1_tensor, s2_tensor]) - _ = K.eval(model) + model = MatchingTensorLayer(init_diag=init_diag) + _ = K.eval(model([s1_tensor, s2_tensor])) + _ = model.get_config() with pytest.raises(ValueError): - layers.MatchingLayer()([s1_tensor, s3_tensor]) + MatchingTensorLayer()([s1_tensor, s3_tensor]) From e9cb468d6aaffee9059646dc25af423f8bb5fbe8 Mon Sep 17 00:00:00 2001 From: rgtjf Date: Thu, 18 Apr 2019 15:07:12 +0800 Subject: [PATCH 051/100] feature/bimpm: fix full matching --- .../contrib/layers/multi_perspective_layer.py | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index dccd8bd9..f8dd3566 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -78,8 +78,8 @@ def call(self, x: list, **kwargs): if self._perspective.get('full'): # Each forward & backward contextual embedding compare # with the last step of the last time step of the other sentence. - h_rt = K.concatenate([forward_h_rt, backward_h_rt], axis=-1) - full_match_tensor = self.full_match([lstm_reps_lt, h_rt]) + h_lt = K.concatenate([forward_h_lt, backward_h_lt], axis=-1) + full_match_tensor = self.full_match([h_lt, lstm_reps_rt]) match_tensor_list.append(full_match_tensor) match_dim += self._mp_dim + 1 @@ -144,18 +144,20 @@ def build(self, input_shapes): self.built = True def call(self, x, **kwargs): - """Call.""" - reps_lt, rep_rt = x - reps_rt = K.expand_dims(rep_rt, 1) - # match_tensor: [batch, steps_lt, mp_dim+1] + """Call. + """ + rep_lt, reps_rt = x + att_lt = K.expand_dims(rep_lt, 1) + match_tensor, match_dim = _multi_perspective_match(self.mp_dim, - reps_lt, - reps_rt) + reps_rt, + att_lt) + # match_tensor => [b, len_rt, mp_dim+1] return match_tensor def compute_output_shape(self, input_shape): """Compute output shape.""" - return input_shape[0][0], input_shape[0][1], self.mp_dim + 1 + return input_shape[1][0], input_shape[1][1], self.mp_dim + 1 class MpMaxPoolingMatch(Layer): @@ -168,9 +170,9 @@ def __init__(self, mp_dim): def build(self, input_shapes): """Build.""" + d = input_shapes[0][-1] self.kernel = self.add_weight(name='kernel', - shape=(1, 1, 1, - self.mp_dim, input_shapes[0][-1]), + shape=(1, 1, 1, self.mp_dim, d), initializer='uniform', trainable=True) self.built = True @@ -180,23 +182,23 @@ def call(self, x, **kwargs): reps_lt, reps_rt = x # kernel: [1, 1, 1, mp_dim, d] - # lstm_lt -> [batch, steps_lt, 1, 1, d] + # lstm_lt => [b, len_lt, 1, 1, d] reps_lt = K.expand_dims(reps_lt, axis=2) reps_lt = K.expand_dims(reps_lt, axis=2) reps_lt = reps_lt * self.kernel - # lstm_rt -> [batch, 1, steps_rt, 1, d] + # lstm_rt -> [b, 1, len_rt, 1, d] reps_rt = K.expand_dims(reps_rt, axis=2) reps_rt = K.expand_dims(reps_rt, axis=1) - # match_tensor -> [batch, steps_lt, steps_rt, mp_dim] match_tensor = _cosine_distance(reps_lt, reps_rt, cosine_norm=False) - max_match_tensor = K.max(match_tensor, axis=2) + max_match_tensor = K.max(match_tensor, axis=1) + # match_tensor => [b, len_rt, m] return max_match_tensor def compute_output_shape(self, input_shape): """Compute output shape.""" - return input_shape[0][0], input_shape[0][1], self.mp_dim + return input_shape[1][0], input_shape[1][1], self.mp_dim class MpAttentiveMatch(Layer): @@ -211,7 +213,7 @@ class MpAttentiveMatch(Layer): >>> layer = mz.contrib.layers.multi_perspective_layer.MpAttentiveMatch( ... att_dim=30, mp_dim=20) >>> layer.compute_output_shape([(32, 10, 100), (32, 40, 100)]) - (32, 10, 20) + (32, 40, 20) """ @@ -242,7 +244,7 @@ def call(self, x, **kwargs): def compute_output_shape(self, input_shape): """Compute output shape.""" - return input_shape[0][0], input_shape[0][1], self.mp_dim + return input_shape[1][0], input_shape[1][1], self.mp_dim class MpMaxAttentiveMatch(Layer): @@ -428,6 +430,7 @@ def _calc_relevancy_matrix(reps_lt, reps_rt): reps_lt = K.expand_dims(reps_lt, 1) # [b, 1, len_lt, d] reps_rt = K.expand_dims(reps_rt, 2) # [b, len_rt, 1, d] relevancy_matrix = _cosine_distance(reps_lt, reps_rt) + # => [b, len_rt, len_lt, d] return relevancy_matrix From c31c8439f5f263c1f8f928785b364540c82d87ac Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Thu, 18 Apr 2019 17:04:26 +0800 Subject: [PATCH 052/100] Remove redundant code --- .../contrib/layers/matching_tensor_layer.py | 31 ++++++------------- matchzoo/contrib/layers/spatial_gru.py | 21 ------------- tests/unit_test/test_layers.py | 2 -- 3 files changed, 9 insertions(+), 45 deletions(-) diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py index 1d494a6c..2afc23d6 100644 --- a/matchzoo/contrib/layers/matching_tensor_layer.py +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -64,26 +64,23 @@ def build(self, input_shape: list): ) if self._init_diag: - if self._shape1[2] != self._shape2[2]: - raise ValueError('Use init_diag need same embedding shape.') - M_diag = np.float32( + interaction_matrix = np.float32( np.random.uniform( -0.05, 0.05, [self._channels, self._shape1[2], self._shape2[2]] ) ) - for i in range(self._channels): - for j in range(self._shape1[2]): - M_diag[i][j][j] = 0.1 - self.M = self.add_weight( - name='M', + for channel_index in range(self._channels): + np.fill_diagonal(interaction_matrix[channel_index], 0.1) + self.interaction_matrix = self.add_weight( + name='interaction_matrix', shape=(self._channels, self._shape1[2], self._shape2[2]), - initializer=constant(M_diag), + initializer=constant(interaction_matrix), trainable=True ) else: - self.M = self.add_weight( - name='M', + self.interaction_matrix = self.add_weight( + name='interaction_matrix', shape=(self._channels, self._shape1[2], self._shape2[2]), initializer='uniform', trainable=True @@ -101,7 +98,7 @@ def call(self, inputs: list, **kwargs) -> typing.Any: if self._normalize: x1 = K.l2_normalize(x1, axis=2) x2 = K.l2_normalize(x2, axis=2) - output = K.tf.einsum('abd,fde,ace->afbc', x1, self.M, x2) + output = K.tf.einsum('abd,fde,ace->afbc', x1, self.interaction_matrix, x2) return output def compute_output_shape(self, input_shape: list) -> tuple: @@ -125,13 +122,3 @@ def compute_output_shape(self, input_shape: list) -> tuple: output_shape = [shape1[0], self._channels, shape1[1], shape2[1]] return tuple(output_shape) - - def get_config(self) -> dict: - """Get the config dict of MatchingTensorLayer.""" - config = { - 'channels': self._channels, - 'normalize': self._normalize, - 'init_diag': self._init_diag, - } - base_config = super(MatchingTensorLayer, self).get_config() - return dict(list(base_config.items()) + list(config.items())) diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py index 656daacc..9a9361b9 100644 --- a/matchzoo/contrib/layers/spatial_gru.py +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -235,27 +235,6 @@ def compute_output_shape(self, input_shape: typing.Any) -> tuple: output_shape = [input_shape[0], self._units] return tuple(output_shape) - def get_config(self) -> dict: - """Get the config dict of SpatialGRU.""" - config = { - 'units': self._units, - 'normalize': self._normalize, - 'init_diag': self._init_diag, - 'activation': activations.serialize(self._activation), - 'recurrent_activation': - activations.serialize(self._recurrent_activation), - 'use_bias': self._use_bias, - 'kernel_initializer': - initializers.serialize(self._kernel_initializer), - 'recurrent_initializer': - initializers.serialize(self._recurrent_initializer), - 'bias_initializer': - initializers.serialize(self._bias_initializer), - 'direction': self._direction - } - base_config = super(SpatialGRU, self).get_config() - return dict(list(base_config.items()) + list(config.items())) - @classmethod def _time_distributed_dense(cls, w, x, b): if K.backend() == 'tensorflow': diff --git a/tests/unit_test/test_layers.py b/tests/unit_test/test_layers.py index abfdebf4..cda16191 100644 --- a/tests/unit_test/test_layers.py +++ b/tests/unit_test/test_layers.py @@ -38,7 +38,6 @@ def test_spatial_gru(): for direction in ['lt', 'rb']: model = SpatialGRU(direction=direction) _ = K.eval(model(s_value)) - _ = model.get_config() with pytest.raises(ValueError): SpatialGRU(direction='lr')(s_value) @@ -57,6 +56,5 @@ def test_matching_tensor_layer(): for init_diag in [True, False]: model = MatchingTensorLayer(init_diag=init_diag) _ = K.eval(model([s1_tensor, s2_tensor])) - _ = model.get_config() with pytest.raises(ValueError): MatchingTensorLayer()([s1_tensor, s3_tensor]) From be9cb7cbe38b7a7fab2840580044cc7ec12bb565 Mon Sep 17 00:00:00 2001 From: bo Date: Thu, 18 Apr 2019 11:09:48 +0200 Subject: [PATCH 053/100] ignore notebook from code percentage calculate --- .github/.gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/.gitattributes diff --git a/.github/.gitattributes b/.github/.gitattributes new file mode 100644 index 00000000..037a5516 --- /dev/null +++ b/.github/.gitattributes @@ -0,0 +1 @@ +tutorials/* linguist-vendored \ No newline at end of file From 4b6da1b4c174ed743c248a454abc1fcbf5cb137e Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Thu, 18 Apr 2019 17:55:52 +0800 Subject: [PATCH 054/100] Remove unused code --- matchzoo/contrib/layers/matching_tensor_layer.py | 3 +-- matchzoo/contrib/layers/spatial_gru.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py index 2afc23d6..112b3955 100644 --- a/matchzoo/contrib/layers/matching_tensor_layer.py +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -2,7 +2,6 @@ import typing import numpy as np - from keras import backend as K from keras.engine import Layer from keras.initializers import constant @@ -35,7 +34,7 @@ class MatchingTensorLayer(Layer): def __init__(self, channels: int = 4, normalize: bool = True, init_diag: bool = True, **kwargs): """:class:`MatchingTensorLayer` constructor.""" - super(MatchingTensorLayer, self).__init__(**kwargs) + super().__init__(**kwargs) self._channels = channels self._normalize = normalize self._init_diag = init_diag diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py index 9a9361b9..fb9f5e66 100644 --- a/matchzoo/contrib/layers/spatial_gru.py +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -65,7 +65,7 @@ def __init__(self, direction: str = 'lr', **kwargs): """:class:`SpatialGRU` constructor.""" - super(SpatialGRU, self).__init__(**kwargs) + super().__init__(**kwargs) self._units = units self._normalize = normalize self._init_diag = init_diag From b5ccdef6fd93705aa8f52c6ddde6bf4395464ef5 Mon Sep 17 00:00:00 2001 From: bo Date: Thu, 18 Apr 2019 13:42:51 +0200 Subject: [PATCH 055/100] take out git attributes --- .github/.gitattributes => .gitattributes | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/.gitattributes => .gitattributes (100%) diff --git a/.github/.gitattributes b/.gitattributes similarity index 100% rename from .github/.gitattributes rename to .gitattributes From de3a0b66d0fc1df42295b82e956afc4b5457b46e Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Sat, 20 Apr 2019 11:00:03 +0800 Subject: [PATCH 056/100] add berttokenize unit --- matchzoo/preprocessors/units/__init__.py | 1 + .../preprocessors/units/bert_tokenization.py | 399 ++++++++++++++++++ matchzoo/preprocessors/units/bert_tokenize.py | 23 + .../processor_units/test_processor_units.py | 26 ++ 4 files changed, 449 insertions(+) create mode 100644 matchzoo/preprocessors/units/bert_tokenization.py create mode 100644 matchzoo/preprocessors/units/bert_tokenize.py diff --git a/matchzoo/preprocessors/units/__init__.py b/matchzoo/preprocessors/units/__init__.py index d9e88953..926b24cc 100644 --- a/matchzoo/preprocessors/units/__init__.py +++ b/matchzoo/preprocessors/units/__init__.py @@ -13,6 +13,7 @@ from .tokenize import Tokenize from .vocabulary import Vocabulary from .word_hashing import WordHashing +from .bert_tokenize import BertTokenize def list_available() -> list: diff --git a/matchzoo/preprocessors/units/bert_tokenization.py b/matchzoo/preprocessors/units/bert_tokenization.py new file mode 100644 index 00000000..0ee13595 --- /dev/null +++ b/matchzoo/preprocessors/units/bert_tokenization.py @@ -0,0 +1,399 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tokenization classes.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import collections +import re +import unicodedata +import six +import tensorflow as tf + + +def validate_case_matches_checkpoint(do_lower_case, init_checkpoint): + """Checks whether the casing config is consistent with the checkpoint name.""" + + # The casing has to be passed in by the user and there is no explicit check + # as to whether it matches the checkpoint. The casing information probably + # should have been stored in the bert_config.json file, but it's not, so + # we have to heuristically detect it to validate. + + if not init_checkpoint: + return + + m = re.match("^.*?([A-Za-z0-9_-]+)/bert_model.ckpt", init_checkpoint) + if m is None: + return + + model_name = m.group(1) + + lower_models = [ + "uncased_L-24_H-1024_A-16", "uncased_L-12_H-768_A-12", + "multilingual_L-12_H-768_A-12", "chinese_L-12_H-768_A-12" + ] + + cased_models = [ + "cased_L-12_H-768_A-12", "cased_L-24_H-1024_A-16", + "multi_cased_L-12_H-768_A-12" + ] + + is_bad_config = False + if model_name in lower_models and not do_lower_case: + is_bad_config = True + actual_flag = "False" + case_name = "lowercased" + opposite_flag = "True" + + if model_name in cased_models and do_lower_case: + is_bad_config = True + actual_flag = "True" + case_name = "cased" + opposite_flag = "False" + + if is_bad_config: + raise ValueError( + "You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. " + "However, `%s` seems to be a %s model, so you " + "should pass in `--do_lower_case=%s` so that the fine-tuning matches " + "how the model was pre-training. If this error is wrong, please " + "just comment out this check." % (actual_flag, init_checkpoint, + model_name, case_name, opposite_flag)) + + +def convert_to_unicode(text): + """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" + if six.PY3: + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + elif six.PY2: + if isinstance(text, str): + return text.decode("utf-8", "ignore") + elif isinstance(text, unicode): + return text + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + else: + raise ValueError("Not running on Python2 or Python 3?") + + +def printable_text(text): + """Returns text encoded in a way suitable for print or `tf.logging`.""" + + # These functions want `str` for both Python2 and Python3, but in one case + # it's a Unicode string and in the other it's a byte string. + if six.PY3: + if isinstance(text, str): + return text + elif isinstance(text, bytes): + return text.decode("utf-8", "ignore") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + elif six.PY2: + if isinstance(text, str): + return text + elif isinstance(text, unicode): + return text.encode("utf-8") + else: + raise ValueError("Unsupported string type: %s" % (type(text))) + else: + raise ValueError("Not running on Python2 or Python 3?") + + +def load_vocab(vocab_file): + """Loads a vocabulary file into a dictionary.""" + vocab = collections.OrderedDict() + index = 0 + with tf.gfile.GFile(vocab_file, "r") as reader: + while True: + token = convert_to_unicode(reader.readline()) + if not token: + break + token = token.strip() + vocab[token] = index + index += 1 + return vocab + + +def convert_by_vocab(vocab, items): + """Converts a sequence of [tokens|ids] using the vocab.""" + output = [] + for item in items: + output.append(vocab[item]) + return output + + +def convert_tokens_to_ids(vocab, tokens): + return convert_by_vocab(vocab, tokens) + + +def convert_ids_to_tokens(inv_vocab, ids): + return convert_by_vocab(inv_vocab, ids) + + +def whitespace_tokenize(text): + """Runs basic whitespace cleaning and splitting on a piece of text.""" + text = text.strip() + if not text: + return [] + tokens = text.split() + return tokens + + +class FullTokenizer(object): + """Runs end-to-end tokenziation.""" + + def __init__(self, vocab_file, do_lower_case=True): + self.vocab = load_vocab(vocab_file) + self.inv_vocab = {v: k for k, v in self.vocab.items()} + self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) + self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) + + def tokenize(self, text): + split_tokens = [] + for token in self.basic_tokenizer.tokenize(text): + for sub_token in self.wordpiece_tokenizer.tokenize(token): + split_tokens.append(sub_token) + + return split_tokens + + def convert_tokens_to_ids(self, tokens): + return convert_by_vocab(self.vocab, tokens) + + def convert_ids_to_tokens(self, ids): + return convert_by_vocab(self.inv_vocab, ids) + + +class BasicTokenizer(object): + """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" + + def __init__(self, do_lower_case=True): + """Constructs a BasicTokenizer. + + Args: + do_lower_case: Whether to lower case the input. + """ + self.do_lower_case = do_lower_case + + def tokenize(self, text): + """Tokenizes a piece of text.""" + text = convert_to_unicode(text) + text = self._clean_text(text) + + # This was added on November 1st, 2018 for the multilingual and Chinese + # models. This is also applied to the English models now, but it doesn't + # matter since the English models were not trained on any Chinese data + # and generally don't have any Chinese data in them (there are Chinese + # characters in the vocabulary because Wikipedia does have some Chinese + # words in the English Wikipedia.). + text = self._tokenize_chinese_chars(text) + + orig_tokens = whitespace_tokenize(text) + split_tokens = [] + for token in orig_tokens: + if self.do_lower_case: + token = token.lower() + token = self._run_strip_accents(token) + split_tokens.extend(self._run_split_on_punc(token)) + + output_tokens = whitespace_tokenize(" ".join(split_tokens)) + return output_tokens + + def _run_strip_accents(self, text): + """Strips accents from a piece of text.""" + text = unicodedata.normalize("NFD", text) + output = [] + for char in text: + cat = unicodedata.category(char) + if cat == "Mn": + continue + output.append(char) + return "".join(output) + + def _run_split_on_punc(self, text): + """Splits punctuation on a piece of text.""" + chars = list(text) + i = 0 + start_new_word = True + output = [] + while i < len(chars): + char = chars[i] + if _is_punctuation(char): + output.append([char]) + start_new_word = True + else: + if start_new_word: + output.append([]) + start_new_word = False + output[-1].append(char) + i += 1 + + return ["".join(x) for x in output] + + def _tokenize_chinese_chars(self, text): + """Adds whitespace around any CJK character.""" + output = [] + for char in text: + cp = ord(char) + if self._is_chinese_char(cp): + output.append(" ") + output.append(char) + output.append(" ") + else: + output.append(char) + return "".join(output) + + def _is_chinese_char(self, cp): + """Checks whether CP is the codepoint of a CJK character.""" + # This defines a "chinese character" as anything in the CJK Unicode block: + # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + # + # Note that the CJK Unicode block is NOT all Japanese and Korean characters, + # despite its name. The modern Korean Hangul alphabet is a different block, + # as is Japanese Hiragana and Katakana. Those alphabets are used to write + # space-separated words, so they are not treated specially and handled + # like the all of the other languages. + if ((cp >= 0x4E00 and cp <= 0x9FFF) or # + (cp >= 0x3400 and cp <= 0x4DBF) or # + (cp >= 0x20000 and cp <= 0x2A6DF) or # + (cp >= 0x2A700 and cp <= 0x2B73F) or # + (cp >= 0x2B740 and cp <= 0x2B81F) or # + (cp >= 0x2B820 and cp <= 0x2CEAF) or + (cp >= 0xF900 and cp <= 0xFAFF) or # + (cp >= 0x2F800 and cp <= 0x2FA1F)): # + return True + + return False + + def _clean_text(self, text): + """Performs invalid character removal and whitespace cleanup on text.""" + output = [] + for char in text: + cp = ord(char) + if cp == 0 or cp == 0xfffd or _is_control(char): + continue + if _is_whitespace(char): + output.append(" ") + else: + output.append(char) + return "".join(output) + + +class WordpieceTokenizer(object): + """Runs WordPiece tokenziation.""" + + def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=200): + self.vocab = vocab + self.unk_token = unk_token + self.max_input_chars_per_word = max_input_chars_per_word + + def tokenize(self, text): + """Tokenizes a piece of text into its word pieces. + + This uses a greedy longest-match-first algorithm to perform tokenization + using the given vocabulary. + + For example: + input = "unaffable" + output = ["un", "##aff", "##able"] + + Args: + text: A single token or whitespace separated tokens. This should have + already been passed through `BasicTokenizer. + + Returns: + A list of wordpiece tokens. + """ + + text = convert_to_unicode(text) + + output_tokens = [] + for token in whitespace_tokenize(text): + chars = list(token) + if len(chars) > self.max_input_chars_per_word: + output_tokens.append(self.unk_token) + continue + + is_bad = False + start = 0 + sub_tokens = [] + while start < len(chars): + end = len(chars) + cur_substr = None + while start < end: + substr = "".join(chars[start:end]) + if start > 0: + substr = "##" + substr + if substr in self.vocab: + cur_substr = substr + break + end -= 1 + if cur_substr is None: + is_bad = True + break + sub_tokens.append(cur_substr) + start = end + + if is_bad: + output_tokens.append(self.unk_token) + else: + output_tokens.extend(sub_tokens) + return output_tokens + + +def _is_whitespace(char): + """Checks whether `chars` is a whitespace character.""" + # \t, \n, and \r are technically contorl characters but we treat them + # as whitespace since they are generally considered as such. + if char == " " or char == "\t" or char == "\n" or char == "\r": + return True + cat = unicodedata.category(char) + if cat == "Zs": + return True + return False + + +def _is_control(char): + """Checks whether `chars` is a control character.""" + # These are technically control characters but we count them as whitespace + # characters. + if char == "\t" or char == "\n" or char == "\r": + return False + cat = unicodedata.category(char) + if cat in ("Cc", "Cf"): + return True + return False + + +def _is_punctuation(char): + """Checks whether `chars` is a punctuation character.""" + cp = ord(char) + # We treat all non-letter/number ASCII as punctuation. + # Characters such as "^", "$", and "`" are not in the Unicode + # Punctuation class but we treat them as punctuation anyways, for + # consistency. + if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or + (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + return True + cat = unicodedata.category(char) + if cat.startswith("P"): + return True + return False diff --git a/matchzoo/preprocessors/units/bert_tokenize.py b/matchzoo/preprocessors/units/bert_tokenize.py new file mode 100644 index 00000000..de4e546c --- /dev/null +++ b/matchzoo/preprocessors/units/bert_tokenize.py @@ -0,0 +1,23 @@ + +from .unit import Unit +from .bert_tokenization import FullTokenizer + +class BertTokenize(Unit): + """Process unit for text tokenization by bert tokenizer. + + :param vocab_path: vocab file path in bert pretrained model. + """ + + def __init__(self, vocab_path, do_lower_case=False): + """Initialization.""" + self.tokenizer = FullTokenizer(vocab_path, do_lower_case=do_lower_case) + + def transform(self, input_: str) -> list: + """ + Process input data from raw terms to list of tokens. + + :param input_: raw textual input. + + :return tokens: tokenized tokens as a list. + """ + return self.tokenizer.tokenize(input_) diff --git a/tests/unit_test/processor_units/test_processor_units.py b/tests/unit_test/processor_units/test_processor_units.py index 45afb0ad..4812bece 100644 --- a/tests/unit_test/processor_units/test_processor_units.py +++ b/tests/unit_test/processor_units/test_processor_units.py @@ -136,3 +136,29 @@ def test_this(): type(train_data_processed) test_data_transformed = dssm_preprocessor.transform(test_data) type(test_data_transformed) + + +import tempfile +import os + + +def test_bert_tokenizer_unit(): + vocab_tokens = [ + "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", + "##ing", "," + ] + with tempfile.NamedTemporaryFile(delete=False) as vocab_writer: + vocab_writer.write("".join( + [x + "\n" for x in vocab_tokens]).encode("utf-8")) + + vocab_file = vocab_writer.name + + tokenizer_unit = units.BertTokenize(vocab_file, do_lower_case=True) + os.unlink(vocab_file) + + tokens = tokenizer_unit.transform(u"UNwant\u00E9d,running") + assert tokens == ["un", "##want", "##ed", ",", "runn", "##ing"] + + assert tokenizer_unit.tokenizer.convert_tokens_to_ids(tokens) == [7, 4, 5, 10, 8, 9] + + assert tokenizer_unit.tokenizer.basic_tokenizer.tokenize(u"ah\u535A\u63A8zz") == [u"ah", u"\u535A", u"\u63A8", u"zz"] From 154a4f6a092be950a682dde5bfceec398462ed20 Mon Sep 17 00:00:00 2001 From: Chriskuei Date: Sat, 20 Apr 2019 14:00:06 +0800 Subject: [PATCH 057/100] Improve code readability --- .../contrib/layers/matching_tensor_layer.py | 13 +- matchzoo/contrib/layers/spatial_gru.py | 241 +++++++++++------- matchzoo/contrib/models/match_srnn.py | 25 +- 3 files changed, 170 insertions(+), 109 deletions(-) diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py index 112b3955..3c2aabb4 100644 --- a/matchzoo/contrib/layers/matching_tensor_layer.py +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -94,10 +94,21 @@ def call(self, inputs: list, **kwargs) -> typing.Any: """ x1 = inputs[0] x2 = inputs[1] + # Normalize x1 and x2 if self._normalize: x1 = K.l2_normalize(x1, axis=2) x2 = K.l2_normalize(x2, axis=2) - output = K.tf.einsum('abd,fde,ace->afbc', x1, self.interaction_matrix, x2) + + # b = batch size + # l = length of `x1` + # r = length of `x2` + # d, e = embedding size + # c = number of channels + # output = [b, c, l, r] + output = K.tf.einsum( + 'bld,cde,bre->bclr', + x1, self.interaction_matrix, x2 + ) return output def compute_output_shape(self, input_shape: list) -> tuple: diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py index fb9f5e66..76f9df9f 100644 --- a/matchzoo/contrib/layers/spatial_gru.py +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -8,21 +8,12 @@ from keras.layers import activations from keras.layers import initializers -from tensorflow.python.ops import control_flow_ops -from tensorflow.python.ops import tensor_array_ops - class SpatialGRU(Layer): """ Spatial GRU layer. :param units: Number of SpatialGRU units. - :param normalize: Whether to L2-normalize samples along the - dot product axis before taking the dot product. - If set to True, then the output of the dot product - is the cosine proximity between the two samples. - :param init_diag: Whether to initialize the diagonal elements - of the matrix. :param activation: Activation function to use. Default: hyperbolic tangent (`tanh`). If you pass `None`, no activation is applied (ie. "linear" activation: `a(x) = x`). @@ -30,13 +21,11 @@ class SpatialGRU(Layer): the recurrent step. Default: sigmoid (`sigmoid`). If you pass `None`, no activation is applied (ie. "linear" activation: `a(x) = x`). - :param use_bias: Boolean, whether the layer uses a bias vector. :param kernel_initializer: Initializer for the `kernel` weights matrix, used for the linear transformation of the inputs. :param recurrent_initializer: Initializer for the `recurrent_kernel` weights matrix, used for the linear transformation of the recurrent state. - :param bias_initializer: Initializer for the bias vector. :param direction: Scanning direction. `lt` (i.e., left top) indicates the scanning from left top to right bottom, and `rb` (i.e., right bottom) indicates the scanning from @@ -52,30 +41,24 @@ class SpatialGRU(Layer): """ - def __init__(self, - units: int = 10, - normalize: bool = False, - init_diag: bool = False, - activation: str = 'tanh', - recurrent_activation: str = 'sigmoid', - use_bias: bool = True, - kernel_initializer: str = 'glorot_uniform', - recurrent_initializer: str = 'orthogonal', - bias_initializer: str = 'zeros', - direction: str = 'lr', - **kwargs): + def __init__( + self, + units: int = 10, + activation: str = 'tanh', + recurrent_activation: str = 'sigmoid', + kernel_initializer: str = 'glorot_uniform', + recurrent_initializer: str = 'orthogonal', + direction: str = 'lt', + **kwargs + ): """:class:`SpatialGRU` constructor.""" super().__init__(**kwargs) self._units = units - self._normalize = normalize - self._init_diag = init_diag self._activation = activations.get(activation) self._recurrent_activation = activations.get(recurrent_activation) - self._use_bias = use_bias self._kernel_initializer = initializers.get(kernel_initializer) self._recurrent_initializer = initializers.get(recurrent_initializer) - self._bias_initializer = initializers.get(bias_initializer) self._direction = direction def build(self, input_shape: typing.Any): @@ -84,7 +67,14 @@ def build(self, input_shape: typing.Any): :param input_shape: the shapes of the input tensors. """ - # input_shape: (batch_size, channel, text1_maxlen, text2_maxlen) + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # L = `input_left` sequence length + # R = `input_right` sequence length + # C = number of channels + # U = number of units + + # input_shape = [B, C, L, R] self._batch_size = input_shape[0] self._channel = input_shape[1] self._input_dim = self._channel + 3 * self._units @@ -92,88 +82,131 @@ def build(self, input_shape: typing.Any): self._text1_maxlen = input_shape[2] self._text2_maxlen = input_shape[3] self._recurrent_step = self._text1_maxlen * self._text2_maxlen + # W = [3*U+C, 7*U] + self._W = self.add_weight( + name='W', + shape=(self._input_dim, self._units * 7), + initializer=self._kernel_initializer, + trainable=True + ) + # U = [3*U, U] + self._U = self.add_weight( + name='U', + shape=(self._units * 3, self._units), + initializer=self._recurrent_initializer, + trainable=True + ) + # bias = [8*U,] + self._bias = self.add_weight( + name='bias', + shape=(self._units * 8,), + initializer='zeros', + trainable=True + ) - self._W = self.add_weight(name='W', - shape=(self._input_dim, self._units * 7), - initializer=self._kernel_initializer, - trainable=True) - - self._U = self.add_weight(name='U', - shape=(self._units * 3, self._units), - initializer=self._recurrent_initializer, - trainable=True) - - self._bias = self.add_weight(name='bias', - shape=(self._units * 8,), - initializer='zeros', - trainable=True) - - # w_rl, w_rt, w_rd + # w_rl, w_rt, w_rd = [B, 3*U] self._wr = self._W[:, :self._units * 3] - # b_rl, b_rt, b_rd + # b_rl, b_rt, b_rd = [B, 3*U] self._br = self._bias[:self._units * 3] - # w_zi, w_zl, w_zt, w_zd + # w_zi, w_zl, w_zt, w_zd = [B, 4*U] self._wz = self._W[:, self._units * 3: self._units * 7] - # b_zi, b_zl, b_zt, b_zd + # b_zi, b_zl, b_zt, b_zd = [B, 4*U] self._bz = self._bias[self._units * 3: self._units * 7] - self._w_ij = self.add_weight(name='Wij', - shape=(self._channel, self._units), - initializer=self._recurrent_initializer, - trainable=True) + # w_ij = [C, U] + self._w_ij = self.add_weight( + name='W_ij', + shape=(self._channel, self._units), + initializer=self._recurrent_initializer, + trainable=True + ) + # b_ij = [7*U] self._b_ij = self._bias[self._units * 7:] super(SpatialGRU, self).build(input_shape) def softmax_by_row(self, z: typing.Any) -> tuple: """Conduct softmax on each dimension across the four gates.""" + # z_transform: [B, U, 4] z_transform = Permute((2, 1))(Reshape((4, self._units))(z)) + size = [-1, 1, -1] + # Perform softmax on each slice for i in range(0, self._units): - begin1 = [0, i, 0] - size = [-1, 1, -1] + begin = [0, i, 0] + # z_slice: [B, 1, 4] + z_slice = K.tf.slice(z_transform, begin, size) if i == 0: - z_s = K.tf.nn.softmax(K.tf.slice(z_transform, begin1, size)) + z_s = K.tf.nn.softmax(z_slice) else: - z_s = K.tf.concat( - [z_s, K.tf.nn.softmax( - K.tf.slice(z_transform, begin1, size))], 1) - + z_s = K.tf.concat([z_s, K.tf.nn.softmax(z_slice)], 1) + # zi, zl, zt, zd: [B, U] zi, zl, zt, zd = K.tf.unstack(z_s, axis=2) return zi, zl, zt, zd - def calculate_recurrent_unit(self, - inputs_ta: typing.Any, - states: typing.Any, - step: int, - h: typing.Any, - h0: typing.Any) -> tuple: + def calculate_recurrent_unit( + self, + inputs: typing.Any, + states: typing.Any, + step: int, + h: typing.Any, + ) -> tuple: """ Calculate recurrent unit. - :param inputs: input tensors. + :param inputs: A TensorArray which contains interaction + between left text and right text. + :param states: A TensorArray which stores the hidden state + of every step. + :param step: Recurrent step. + :param h: Hidden state from last operation. """ - i = K.tf.div(step, K.tf.constant(self._text2_maxlen)) + # Get index i, j + i = K.tf.floordiv(step, K.tf.constant(self._text2_maxlen)) j = K.tf.mod(step, K.tf.constant(self._text2_maxlen)) + # Get hidden state h_diag, h_top, h_left + # h_diag, h_top, h_left = [B, U] h_diag = states.read(i * (self._text2_maxlen + 1) + j) h_top = states.read(i * (self._text2_maxlen + 1) + j + 1) h_left = states.read((i + 1) * (self._text2_maxlen + 1) + j) - s_ij = inputs_ta.read(step) + # Get interaction between word i, j: s_ij + # s_ij = [B, C] + s_ij = inputs.read(step) + + # Concatenate h_top, h_left, h_diag, s_ij + # q = [B, 3*U+C] q = K.tf.concat([K.tf.concat([h_top, h_left], 1), K.tf.concat([h_diag, s_ij], 1)], 1) + + # Calculate reset gate + # r = [B, 3*U] r = self._recurrent_activation( self._time_distributed_dense(self._wr, q, self._br)) + + # Calculate updating gate + # z: [B, 4*U] z = self._time_distributed_dense(self._wz, q, self._bz) + + # Perform softmax + # zi, zl, zt, zd: [B, U] zi, zl, zt, zd = self.softmax_by_row(z) - hij_l = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) - hij_r = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) - hij_ = self._activation(hij_l + hij_r) - hij = zl * h_left + zt * h_top + zd * h_diag + zi * hij_ + # Get h_ij_ + # h_ij_ = [B, U] + h_ij_l = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) + h_ij_r = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) + h_ij_ = self._activation(h_ij_l + h_ij_r) + + # Calculate h_ij + # h_ij = [B, U] + h_ij = zl * h_left + zt * h_top + zd * h_diag + zi * h_ij_ + + # Write h_ij to states states = states.write(((i + 1) * (self._text2_maxlen + 1) + j + 1), - hij) - hij.set_shape(h_top.get_shape()) - return inputs_ta, states, step + 1, hij, h0 + h_ij) + h_ij.set_shape(h_top.get_shape()) + + return inputs, states, step + 1, h_ij def call(self, inputs: list, **kwargs) -> typing.Any: """ @@ -182,49 +215,64 @@ def call(self, inputs: list, **kwargs) -> typing.Any: :param inputs: input tensors. """ batch_size = K.tf.shape(inputs)[0] + # h0 = [B, U] self._bounder_state_h0 = K.tf.zeros([batch_size, self._units]) - # input_x: (text1_maxlen, text2_maxlen, batch_size, channel) + # input_x = [L, R, B, C] input_x = K.tf.transpose(inputs, [2, 3, 0, 1]) if self._direction == 'rb': + # input_x: [R, L, B, C] input_x = K.tf.reverse(input_x, [0, 1]) elif self._direction != 'lt': raise ValueError(f"Invalid direction. " f"`{self._direction}` received. " f"Must be in `lt`, `rb`.") + # input_x = [L*R*B, C] input_x = K.tf.reshape(input_x, [-1, self._channel]) + # input_x = L*R * [B, C] input_x = K.tf.split( axis=0, num_or_size_splits=self._text1_maxlen * self._text2_maxlen, - value=input_x) - inputs_ta = K.tf.TensorArray( + value=input_x + ) + + # inputs = L*R * [B, C] + inputs = K.tf.TensorArray( dtype=K.tf.float32, size=self._text1_maxlen * self._text2_maxlen, - name='input_ta') - states_ta = K.tf.TensorArray( + name='inputs' + ) + inputs = inputs.unstack(input_x) + + # states = (L+1)*(R+1) * [B, U] + states = K.tf.TensorArray( dtype=K.tf.float32, size=(self._text1_maxlen + 1) * (self._text2_maxlen + 1), - name='state_ta', clear_after_read=False) - + name='states', + clear_after_read=False + ) + # Initialize states for i in range(self._text2_maxlen + 1): - states_ta = states_ta.write(i, self._bounder_state_h0) - for i in range(self._text1_maxlen): - states_ta = states_ta.write((i + 1) * (self._text2_maxlen + 1), - self._bounder_state_h0) - inputs_ta = inputs_ta.unstack(input_x) - _, _, _, hij, _ = control_flow_ops.while_loop( - cond=lambda _0, _1, i, _3, _4: i < self._recurrent_step, + states = states.write(i, self._bounder_state_h0) + for i in range(1, self._text1_maxlen + 1): + states = states.write(i * (self._text2_maxlen + 1), + self._bounder_state_h0) + + # Calculate h_ij + # h_ij = [B, U] + _, _, _, h_ij = K.tf.while_loop( + cond=lambda _0, _1, i, _3: K.tf.less(i, self._recurrent_step), body=self.calculate_recurrent_unit, loop_vars=( - inputs_ta, - states_ta, - K.tf.Variable(0, dtype=K.tf.int32), - self._bounder_state_h0, - self._bounder_state_h0), + inputs, + states, + K.tf.constant(0, dtype=K.tf.int32), + self._bounder_state_h0 + ), parallel_iterations=1, swap_memory=True ) - return hij + return h_ij def compute_output_shape(self, input_shape: typing.Any) -> tuple: """ @@ -237,7 +285,6 @@ def compute_output_shape(self, input_shape: typing.Any) -> tuple: @classmethod def _time_distributed_dense(cls, w, x, b): - if K.backend() == 'tensorflow': - x = K.dot(x, w) - x = K.bias_add(x, b) + x = K.dot(x, w) + x = K.bias_add(x, b) return x diff --git a/matchzoo/contrib/models/match_srnn.py b/matchzoo/contrib/models/match_srnn.py index a6251d39..833581b2 100644 --- a/matchzoo/contrib/models/match_srnn.py +++ b/matchzoo/contrib/models/match_srnn.py @@ -9,6 +9,8 @@ from matchzoo.engine.param import Param from matchzoo.engine.param_table import ParamTable from matchzoo.engine import hyper_spaces +from matchzoo.contrib.layers import SpatialGRU +from matchzoo.contrib.layers import MatchingTensorLayer class MatchSRNN(BaseModel): @@ -60,34 +62,35 @@ def build(self): # C = number of channels # Left input and right input. - # shape = [B, L] - # shape = [B, R] + # query = [B, L] + # doc = [B, R] query, doc = self._make_inputs() - embedding = self._make_embedding_layer() # Process left and right input. - # shape = [B, L, D] + # embed_query = [B, L, D] + # embed_doc = [B, R, D] + embedding = self._make_embedding_layer() embed_query = embedding(query) - # shape = [B, R, D] embed_doc = embedding(doc) # Get matching tensor - # shape = [B, C, L, R] - matching_tensor_layer = matchzoo.contrib.layers.MatchingTensorLayer( + # matching_tensor = [B, C, L, R] + matching_tensor_layer = MatchingTensorLayer( channels=self._params['channels']) matching_tensor = matching_tensor_layer([embed_query, embed_doc]) - # shape = [B, L, R, C] - matching_tensor = keras.layers.Permute((2, 3, 1))(matching_tensor) - spatial_gru = matchzoo.contrib.layers.SpatialGRU( + # Apply spatial GRU to the word level interaction tensor + # h_ij = [B, U] + spatial_gru = SpatialGRU( units=self._params['units'], direction=self._params['direction']) - h_ij = spatial_gru(matching_tensor) + # Apply Dropout x = keras.layers.Dropout( rate=self._params['dropout_rate'])(h_ij) + # Make output layer x_out = self._make_output_layer()(x) self._backend = keras.Model(inputs=[query, doc], outputs=x_out) From 18c8975c675cab71df7877c918257207a0d935e2 Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Sat, 27 Apr 2019 23:58:27 +0800 Subject: [PATCH 058/100] add DIIN model --- matchzoo/contrib/layers/__init__.py | 6 +- .../contrib/layers/decaying_dropout_layer.py | 98 ++++++ matchzoo/contrib/layers/encoding_layer.py | 122 +++++++ matchzoo/contrib/models/__init__.py | 1 + matchzoo/contrib/models/diin.py | 310 ++++++++++++++++++ matchzoo/preprocessors/__init__.py | 1 + matchzoo/preprocessors/diin_preprocessor.py | 159 +++++++++ matchzoo/preprocessors/units/__init__.py | 2 + .../preprocessors/units/character_index.py | 61 ++++ .../preprocessors/units/word_exact_match.py | 66 ++++ 10 files changed, 825 insertions(+), 1 deletion(-) create mode 100644 matchzoo/contrib/layers/decaying_dropout_layer.py create mode 100644 matchzoo/contrib/layers/encoding_layer.py create mode 100644 matchzoo/contrib/models/diin.py create mode 100644 matchzoo/preprocessors/diin_preprocessor.py create mode 100644 matchzoo/preprocessors/units/character_index.py create mode 100644 matchzoo/preprocessors/units/word_exact_match.py diff --git a/matchzoo/contrib/layers/__init__.py b/matchzoo/contrib/layers/__init__.py index a66fe1ab..ea5c99b7 100644 --- a/matchzoo/contrib/layers/__init__.py +++ b/matchzoo/contrib/layers/__init__.py @@ -2,8 +2,12 @@ from .multi_perspective_layer import MultiPerspectiveLayer from .matching_tensor_layer import MatchingTensorLayer from .spatial_gru import SpatialGRU +from .decaying_dropout_layer import DecayingDropoutLayer +from .encoding_layer import EncodingLayer layer_dict = { "MatchingTensorLayer": MatchingTensorLayer, - "SpatialGRU": SpatialGRU + "SpatialGRU": SpatialGRU, + "DecayingDropoutLayer": DecayingDropoutLayer, + "EncodingLayer": EncodingLayer } diff --git a/matchzoo/contrib/layers/decaying_dropout_layer.py b/matchzoo/contrib/layers/decaying_dropout_layer.py new file mode 100644 index 00000000..fda87212 --- /dev/null +++ b/matchzoo/contrib/layers/decaying_dropout_layer.py @@ -0,0 +1,98 @@ +"""An implementation of Decaying Dropout Layer.""" +import typing + +import keras.backend as K +from keras.engine import Layer + + +class DecayingDropoutLayer(Layer): + """ + Layer that processes dropout with exponential decayed keep rate during + training. + + :param initial_keep_rate: the initial keep rate of decaying dropout. + :param decay_interval: the decay interval of decaying dropout. + :param decay_rate: the decay rate of decaying dropout. + :param noise_shape: a 1D integer tensor representing the shape of the + binary dropout mask that will be multiplied with the input. + :param seed: a python integer to use as random seed. + :param kwargs: standard layer keyword arguments. + + Examples: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.DecayingDropoutLayer( + ... initial_keep_rate=1.0, + ... decay_interval=10000, + ... decay_rate=0.977, + ... ) + >>> num_batch, num_dim =5, 10 + >>> layer.build([num_batch, num_dim]) + """ + + def __init__(self, + initial_keep_rate: float = 1.0, + decay_interval: int = 10000, + decay_rate: float = 0.977, + noise_shape=None, + seed=None, + **kwargs): + """:class: 'DecayingDropoutLayer' constructor.""" + super(DecayingDropoutLayer, self).__init__(**kwargs) + self._iterations = None + self._initial_keep_rate = initial_keep_rate + self._decay_interval = decay_interval + self._decay_rate = min(1.0, max(0.0, decay_rate)) + self._noise_shape = noise_shape + self._seed = seed + + def _get_noise_shape(self, inputs): + if self._noise_shape is None: + return self._noise_shape + + symbolic_shape = K.shape(inputs) + noise_shape = [symbolic_shape[axis] if shape is None else shape + for axis, shape in enumerate(self._noise_shape)] + return tuple(noise_shape) + + def build(self, input_shape): + """ + Build the layer. + + :param input_shape: the shape of the input tensor, + for DecayingDropoutLayer we need one input tensor. + """ + self._iterations = self.add_weight(name='iterations', + shape=(1,), + dtype=K.floatx(), + initializer='zeros', + trainable=False) + super(DecayingDropoutLayer, self).build(input_shape) + + def call(self, inputs, training=None): + """ + The computation logic of DecayingDropoutLayer. + + :param inputs: an input tensor. + """ + noise_shape = self._get_noise_shape(inputs) + t = K.cast(self._iterations, K.floatx()) + 1 + p = t / float(self._decay_interval) + + keep_rate = self._initial_keep_rate * K.pow(self._decay_rate, p) + + def dropped_inputs(): + self.add_update([K.update_add(self._iterations, [1])], inputs) + return K.dropout(inputs, 1 - keep_rate[0], noise_shape, + seed=self._seed) + + return K.in_train_phase(dropped_inputs, inputs, training=training) + + def get_config(self): + """Get the config dict of DecayingDropoutLayer.""" + config = {'initial_keep_rate': self._initial_keep_rate, + 'decay_interval': self._decay_interval, + 'decay_rate': self._decay_rate, + 'noise_shape': self._noise_shape, + 'seed': self._seed} + base_config = super(DecayingDropoutLayer, self).get_config() + return dict(list(base_config.items()) + list(config.items())) diff --git a/matchzoo/contrib/layers/encoding_layer.py b/matchzoo/contrib/layers/encoding_layer.py new file mode 100644 index 00000000..13bf6f29 --- /dev/null +++ b/matchzoo/contrib/layers/encoding_layer.py @@ -0,0 +1,122 @@ +"""An implementation of EncodingModule for DIIN model.""" +import typing + +import keras +import keras.backend as K +from keras.engine import Layer + +from matchzoo.contrib.layers import DecayingDropoutLayer + + +class EncodingLayer(Layer): + """ + Apply a self-attention layer and a semantic composite fuse gate + to compute the encoding result of one tensor. + + :param initial_keep_rate: the initial_keep_rate parameter of + DecayingDropoutLayer. + :param decay_interval: the decay_interval parameter of + DecayingDropoutLayer. + :param decay_rate: the decay_rate parameter of DecayingDropoutLayer. + :param kwargs: standard layer keyword arguments. + + Example: + >>> import matchzoo as mz + >>> layer = mz.contrib.layers.EncodingLayer(1.0, 10000, 0.977) + >>> num_batch, left_len, num_dim = 5, 32, 10 + >>> layer.build([num_batch, left_len, num_dim]) + """ + + def __init__(self, + initial_keep_rate: float, + decay_interval: int, + decay_rate: float, + **kwargs): + """:class: 'EncodingLayer' constructor.""" + super(EncodingLayer, self).__init__(**kwargs) + self._initial_keep_rate = initial_keep_rate + self._decay_interval = decay_interval + self._decay_rate = decay_rate + self._w_itr_att = None + self._w1 = None + self._w2 = None + self._w3 = None + self._b1 = None + self._b2 = None + self._b3 = None + + def build(self, input_shape): + """ + Build the layer. + + :param input_shape: the shape of the input tensor, + for EncodingLayer we need one input tensor. + """ + d = input_shape[-1] + + self._w_itr_att = self.add_weight( + name='w_itr_att', shape=(3 * d,), initializer='glorot_uniform') + self._w1 = self.add_weight( + name='w1', shape=(2 * d, d,), initializer='glorot_uniform') + self._w2 = self.add_weight( + name='w2', shape=(2 * d, d,), initializer='glorot_uniform') + self._w3 = self.add_weight( + name='w3', shape=(2 * d, d,), initializer='glorot_uniform') + self._b1 = self.add_weight( + name='b1', shape=(d,), initializer='zeros') + self._b2 = self.add_weight( + name='b2', shape=(d,), initializer='zeros') + self._b3 = self.add_weight( + name='b3', shape=(d,), initializer='zeros') + + super(EncodingLayer, self).build(input_shape) + + def call(self, inputs, **kwargs): + """ + The computation logic of EncodingLayer. + + :param inputs: an input tensor. + """ + # Scalar dimensions referenced here: + # b = batch size + # p = inputs.shape()[1] + # d = inputs.shape()[2] + + # The input shape is [b, p, d] + # shape = [b, 1, p, d] + x = K.expand_dims(inputs, 1) * 0 + # shape = [b, 1, d, p] + x = K.permute_dimensions(x, (0, 1, 3, 2)) + # shape = [b, p, d, p] + mid = x + K.expand_dims(inputs) + # shape = [b, p, d, p] + up = K.permute_dimensions(mid, pattern=(0, 3, 2, 1)) + # shape = [b, p, 3d, p] + inputs_concat = K.concatenate([up, mid, up * mid], axis=2) + + # Self-attention layer. + # shape = [b, p, p] + A = K.dot(self._w_itr_att, inputs_concat) + # shape = [b, p, p] + SA = keras.activations.softmax(A, axis=2) + # shape = [b, p, d] + itr_attn = K.batch_dot(SA, inputs) + + # Semantic composite fuse gate. + # shape = [b, p, 2d] + inputs_attn_concat = K.concatenate([inputs, itr_attn], axis=2) + concat_dropout = DecayingDropoutLayer( + initial_keep_rate=self._initial_keep_rate, + decay_interval=self._decay_interval, + decay_rate=self._decay_rate + )(inputs_attn_concat) + # shape = [b, p, d] + z = K.tanh(K.dot(concat_dropout, self._w1) + self._b1) + # shape = [b, p, d] + r = K.sigmoid(K.dot(concat_dropout, self._w2) + self._b2) + # shape = [b, p, d] + f = K.sigmoid(K.dot(concat_dropout, self._w3) + self._b3) + # shape = [b, p, d] + encoding = r * inputs + f * z + + return encoding diff --git a/matchzoo/contrib/models/__init__.py b/matchzoo/contrib/models/__init__.py index aa8c7f66..cefd02a0 100644 --- a/matchzoo/contrib/models/__init__.py +++ b/matchzoo/contrib/models/__init__.py @@ -3,3 +3,4 @@ from .hbmp import HBMP from .esim import ESIM from .bimpm import BiMPM +from .diin import DIIN diff --git a/matchzoo/contrib/models/diin.py b/matchzoo/contrib/models/diin.py new file mode 100644 index 00000000..d7f8fcd1 --- /dev/null +++ b/matchzoo/contrib/models/diin.py @@ -0,0 +1,310 @@ +"""DIIN model.""" +import typing + +import keras +import keras.backend as K + +from matchzoo.engine import hyper_spaces +from matchzoo.engine.param_table import ParamTable +from matchzoo.engine.param import Param +from matchzoo.engine.base_model import BaseModel +from matchzoo.contrib.layers import DecayingDropoutLayer +from matchzoo.contrib.layers import EncodingLayer +from matchzoo import preprocessors + + +class DIIN(BaseModel): + """ + DIIN model. + + Examples: + >>> model = DIIN() + >>> model.guess_and_fill_missing_params() + >>> model.params['embedding_input_dim'] = 10000 + >>> model.params['embedding_output_dim'] = 300 + >>> model.params['embedding_trainable'] = True + >>> model.params['optimizer'] = 'adam' + >>> model.params['dropout_initial_keep_rate'] = 1.0 + >>> model.params['dropout_decay_interval'] = 10000 + >>> model.params['dropout_decay_rate'] = 0.977 + >>> model.params['char_embedding_input_dim'] = 100 + >>> model.params['char_embedding_output_dim'] = 8 + >>> model.params['char_conv_filters'] = 100 + >>> model.params['char_conv_kernel_size'] = 5 + >>> model.params['first_scale_down_ratio'] = 0.3 + >>> model.params['nb_dense_blocks'] = 3 + >>> model.params['layers_per_dense_block'] = 8 + >>> model.params['growth_rate'] = 20 + >>> model.params['transition_scale_down_ratio'] = 0.5 + >>> model.build() + """ + + @classmethod + def get_default_params(cls) -> ParamTable: + """:return: model default parameters.""" + params = super().get_default_params(with_embedding=True) + params['optimizer'] = 'adam' + params.add(Param(name='dropout_initial_keep_rate', value=1.0, + desc="The initial keep rate of decaying_dropout.")) + params.add(Param(name='dropout_decay_interval', value=10000, + desc="The decay interval of decaying_dropout.")) + params.add(Param(name='dropout_decay_rate', value=0.977, + desc="The decay rate of decaying_dropout.")) + params.add(Param(name='char_embedding_input_dim', value=100, + desc="The input dimension of character embedding " + "layer.")) + params.add(Param(name='char_embedding_output_dim', value=8, + desc="The output dimension of character embedding " + "layer.")) + params.add(Param(name='char_conv_filters', value=100, + desc="The filter size of character convolution " + "layer.")) + params.add(Param(name='char_conv_kernel_size', value=5, + desc="The kernel size of character convolution " + "layer.")) + params.add(Param(name='first_scale_down_ratio', value=0.3, + desc="The channel scale down ratio of the " + "convolution layer before densenet.")) + params.add(Param(name='nb_dense_blocks', value=3, + desc="The number of blocks in densenet.")) + params.add(Param(name='layers_per_dense_block', value=8, + desc="The number of convolution layers in dense " + "block.")) + params.add(Param(name='growth_rate', value=20, + desc="The filter size of each convolution layer in " + "dense block.")) + params.add(Param(name='transition_scale_down_ratio', value=0.5, + desc="The channel scale down ratio of the " + "convolution layer in transition block.")) + return params + + @classmethod + def get_default_preprocessor(cls): + """:return: Default preprocessor.""" + return preprocessors.DIINPreprocessor() + + def guess_and_fill_missing_params(self, verbose: int = 1): + """ + Guess and fill missing parameters in :attr:'params'. + + Use this method to automatically fill-in hyper parameters. + This involves some guessing so the parameter it fills could be + wrong. For example, the default task is 'Ranking', and if we do not + set it to 'Classification' manually for data packs prepared for + classification, then the shape of the model output and the data will + mismatch. + + :param verbose: Verbosity. + """ + self._params.get('input_shapes').set_default([(32,), + (32,), + (32, 16), + (32, 16), + (32,), + (32,)], verbose) + super().guess_and_fill_missing_params(verbose) + + def _make_inputs(self) -> list: + text_left = keras.layers.Input( + name='text_left', + shape=self._params['input_shapes'][0] + ) + text_right = keras.layers.Input( + name='text_right', + shape=self._params['input_shapes'][1] + ) + char_left = keras.layers.Input( + name='char_left', + shape=self._params['input_shapes'][2] + ) + char_right = keras.layers.Input( + name='char_right', + shape=self._params['input_shapes'][3] + ) + match_left = keras.layers.Input( + name='match_left', + shape=self._params['input_shapes'][4] + ) + match_right = keras.layers.Input( + name='match_right', + shape=self._params['input_shapes'][5] + ) + return [text_left, text_right, + char_left, char_right, + match_left, match_right] + + def build(self): + """Build model structure.""" + + # Scalar dimensions referenced here: + # B = batch size (number of sequences) + # D = word embedding size + # L = 'input_left' sequence length + # R = 'input_right' sequence length + # C = fixed word length + + # Left text and right text. + # shape = [B, L] + # shape = [B, R] + text_left, text_right = self._make_inputs()[0:2] + # Left character and right character. + # shape = [B, L, C] + # shape = [B, R, C] + char_left, char_right = self._make_inputs()[2:4] + # Left exact match and right exact match. + # shape = [B, L] + # shape = [B, R] + match_left, match_right = self._make_inputs()[4:6] + + # Embedding module + inputs = [] + left_embeddings = [] + right_embeddings = [] + + # Word embedding feature + word_embedding = self._make_embedding_layer() + # shape = [B, L, D] + left_word_embedding = word_embedding(text_left) + # shape = [B, R, D] + right_word_embedding = word_embedding(text_right) + left_word_embedding = DecayingDropoutLayer( + initial_keep_rate=self._params['dropout_initial_keep_rate'], + decay_interval=self._params['dropout_decay_interval'], + decay_rate=self._params['dropout_decay_rate'] + )(left_word_embedding) + right_word_embedding = DecayingDropoutLayer( + initial_keep_rate=self._params['dropout_initial_keep_rate'], + decay_interval=self._params['dropout_decay_interval'], + decay_rate=self._params['dropout_decay_rate'] + )(right_word_embedding) + left_embeddings.append(left_word_embedding) + right_embeddings.append(right_word_embedding) + inputs.append(text_left) + inputs.append(text_right) + + # Exact match feature + # shape = [B, L, 1] + left_exact_match = keras.layers.Reshape( + target_shape=(K.int_shape(match_left)[1], 1,) + )(match_left) + # shape = [B, R, 1] + right_exact_match = keras.layers.Reshape( + target_shape=(K.int_shape(match_left)[1], 1,) + )(match_right) + left_embeddings.append(left_exact_match) + right_embeddings.append(right_exact_match) + inputs.append(match_left) + inputs.append(match_right) + + # Char embedding feature + char_embedding = self._make_char_embedding_layer() + char_embedding.build( + input_shape=(None, None, K.int_shape(char_left)[-1])) + left_char_embedding = char_embedding(char_left) + right_char_embedding = char_embedding(char_right) + left_embeddings.append(left_char_embedding) + right_embeddings.append(right_char_embedding) + inputs.append(char_left) + inputs.append(char_right) + + # Concatenate + left_embedding = keras.layers.Concatenate()(left_embeddings) + right_embedding = keras.layers.Concatenate()(right_embeddings) + d = K.int_shape(left_embedding)[-1] + + # Encoding module + left_encoding = EncodingLayer( + initial_keep_rate=self._params['dropout_initial_keep_rate'], + decay_interval=self._params['dropout_decay_interval'], + decay_rate=self._params['dropout_decay_rate'] + )(left_embedding) + right_encoding = EncodingLayer( + initial_keep_rate=self._params['dropout_initial_keep_rate'], + decay_interval=self._params['dropout_decay_interval'], + decay_rate=self._params['dropout_decay_rate'] + )(right_embedding) + + # Interaction module + interaction = keras.layers.Lambda(self._make_interaction)( + [left_encoding, right_encoding]) + + # Feature extraction module + feature_extractor_input = keras.layers.Conv2D( + filters=int(d * self._params['first_scale_down_ratio']), + kernel_size=(1, 1), + activation=None)(interaction) + feature_extractor = self._create_densenet() + features = feature_extractor(feature_extractor_input) + + # Output module + features = DecayingDropoutLayer( + initial_keep_rate=self._params['dropout_initial_keep_rate'], + decay_interval=self._params['dropout_decay_interval'], + decay_rate=self._params['dropout_decay_rate'])(features) + out = self._make_output_layer()(features) + + self._backend = keras.Model(inputs=inputs, outputs=out) + + def _make_char_embedding_layer(self) -> keras.layers.Layer: + """ + Apply embedding, conv and maxpooling operation over time dimension + for each token to obtain a vector. + + :return: Wrapper Keras 'Layer' as character embedding feature + extractor. + """ + + return keras.layers.TimeDistributed(keras.Sequential([ + keras.layers.Embedding( + input_dim=self._params['char_embedding_input_dim'], + output_dim=self._params['char_embedding_output_dim'], + input_length=self._params['input_shapes'][2][-1]), + keras.layers.Conv1D( + filters=self._params['char_conv_filters'], + kernel_size=self._params['char_conv_kernel_size']), + keras.layers.GlobalMaxPooling1D()])) + + def _make_interaction(self, inputs_) -> typing.Any: + left_encoding = inputs_[0] + right_encoding = inputs_[1] + + left_encoding = K.expand_dims(left_encoding, axis=2) + right_encoding = K.expand_dims(right_encoding, axis=1) + + interaction = left_encoding * right_encoding + return interaction + + def _create_densenet(self) -> typing.Callable: + """ + DenseNet is consisted of 'nb_dense_blocks' sets of Dense block + and Transition block pair. + + :return: Wrapper Keras 'Layer' as DenseNet, tensor in tensor out. + """ + def _wrapper(x): + for _ in range(self._params['nb_dense_blocks']): + # Dense block + # Apply 'layers_per_dense_block' convolution layers. + for _ in range(self._params['layers_per_dense_block']): + out_conv = keras.layers.Conv2D( + filters=self._params['growth_rate'], + kernel_size=(3, 3), + padding='same', + activation='relu')(x) + x = keras.layers.Concatenate(axis=-1)([x, out_conv]) + + # Transition block + # Apply a convolution layer and a maxpooling layer. + scale_down_ratio = self._params['transition_scale_down_ratio'] + nb_filter = int(K.int_shape(x)[-1] * scale_down_ratio) + x = keras.layers.Conv2D( + filters=nb_filter, + kernel_size=(1, 1), + padding='same', + activation=None)(x) + x = keras.layers.MaxPool2D(strides=(2, 2))(x) + + out_densenet = keras.layers.Flatten()(x) + return out_densenet + + return _wrapper diff --git a/matchzoo/preprocessors/__init__.py b/matchzoo/preprocessors/__init__.py index 3042e574..656c1586 100644 --- a/matchzoo/preprocessors/__init__.py +++ b/matchzoo/preprocessors/__init__.py @@ -3,6 +3,7 @@ from .naive_preprocessor import NaivePreprocessor from .basic_preprocessor import BasicPreprocessor from .cdssm_preprocessor import CDSSMPreprocessor +from .diin_preprocessor import DIINPreprocessor def list_available() -> list: diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py new file mode 100644 index 00000000..14b0a78e --- /dev/null +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -0,0 +1,159 @@ +"""DIIN Preprocessor.""" + +from tqdm import tqdm +import pandas as pd + +from matchzoo.engine.base_preprocessor import BasePreprocessor +from matchzoo import DataPack +from .build_vocab_unit import build_vocab_unit +from .chain_transform import chain_transform +from . import units + +tqdm.pandas() + + +class DIINPreprocessor(BasePreprocessor): + """DIIN Model preprocessor.""" + + def __init__(self, + fixed_length_left: int = 32, + fixed_length_right: int = 32, + fixed_length_word: int = 16): + """ + DIIN Model preprocessor. + + :param fixed_length_left: Integer, maximize length of :attr:'left' in + the data_pack. + :param fixed_length_right: Integer, maximize length of :attr:'right' in + the data_pack. + :param fixed_length_word: Integer, maximize length of each word. + + Example: + >>> import matchzoo as mz + >>> train_data = mz.datasets.snli.load_data('train') + >>> test_data = mz.datasets.snli.load_data('test') + >>> diin_preprocessor = mz.preprocessors.DIINPreprocessor( + ... fixed_length_left=32, + ... fixed_length_right=32, + ... fixed_length_word=16, + ... ) + >>> diin_preprocessor = diin_preprocessor.fit( + ... train_data, verbose=0) + >>> diin_preprocessor.context['input_shapes'] + [(32,), (32,), (32,16,), (32,16,), (32,), (32,)] + >>> diin_preprocessor.context['vocab_size'] + 33061 + >>> train_data_processed = diin_preprocessor.transform( + ... train_data, verbose=0) + >>> type(train_data_processed) + + >>> test_data_processed = diin_preprocessor.transform( + ... test_data, verbose=0) + >>> type(test_data_transformed) + + """ + super().__init__() + self._fixed_length_left = fixed_length_left + self._fixed_length_right = fixed_length_right + self._fixed_length_word = fixed_length_word + self._left_fixedlength_unit = units.FixedLength( + self._fixed_length_left, + pad_value='0', + pad_mode='post' + ) + self._right_fixedlength_unit = units.FixedLength( + self._fixed_length_right, + pad_value='0', + pad_mode='post' + ) + self._units = self._default_units() + + def fit(self, data_pack: DataPack, verbose: int = 1): + """ + Fit pre-processing context for transformation. + + :param data_pack: data_pack to be preprocessed. + :param verbose: Verbosity. + :return: class:'DIINPreprocessor' instance. + """ + func = chain_transform(self._units) + data_pack = data_pack.apply_on_text(func, mode='both', verbose=verbose) + + vocab_unit = build_vocab_unit(data_pack, verbose=verbose) + vocab_size = len(vocab_unit.state['term_index']) + self._context['vocab_unit'] = vocab_unit + self._context['vocab_size'] = vocab_size + self._context['embedding_input_dim'] = vocab_size + + data_pack = data_pack.apply_on_text( + units.NgramLetter(ngram=1, reduce_dim=True).transform, + mode='both', verbose=verbose) + char_unit = build_vocab_unit(data_pack, verbose=verbose) + self._context['char_unit'] = char_unit + + self._context['input_shapes'] = [ + (self._fixed_length_left,), + (self._fixed_length_right,), + (self._fixed_length_left, self._fixed_length_word,), + (self._fixed_length_right, self._fixed_length_word,), + (self._fixed_length_left,), + (self._fixed_length_right,) + ] + return self + + def transform(self, data_pack: DataPack, verbose: int = 1) -> DataPack: + """ + Apply transformation on data, create fixed length word representation, + character representation and exact match representation. + + :param data_pack: Inputs to be preprocessed. + :param verbose: Verbosity. + + :return: Transformed data as :class:'DataPack' object. + """ + data_pack = data_pack.copy() + data_pack.apply_on_text( + chain_transform(self._units), + mode='both', inplace=True, verbose=verbose) + + # Process character representation + data_pack.apply_on_text( + units.NgramLetter(ngram=1, reduce_dim=False).transform, + rename=('char_left', 'char_right'), + mode='both', inplace=True, verbose=verbose) + char_index_dict = self._context['char_unit'].state['term_index'] + left_charindex_unit = units.CharacterIndex( + char_index_dict, self._fixed_length_left, self._fixed_length_word) + right_charindex_unit = units.CharacterIndex( + char_index_dict, self._fixed_length_right, self._fixed_length_word) + data_pack.left['char_left'] = data_pack.left['char_left'].apply( + left_charindex_unit.transform) + data_pack.right['char_right'] = data_pack.right['char_right'].apply( + right_charindex_unit.transform) + + # Process word representation + data_pack.apply_on_text( + self._context['vocab_unit'].transform, + mode='both', inplace=True, verbose=verbose) + + # Process exact match representation + frame = data_pack.relation.join( + data_pack.left, on='id_left', how='left' + ).join(data_pack.right, on='id_right', how='left') + left_exactmatch_unit = units.WordExactMatch( + self._fixed_length_left, match='text_left', to_match='text_right') + right_exactmatch_unit = units.WordExactMatch( + self._fixed_length_right, match='text_right', to_match='text_left') + data_pack.relation['match_left'] = frame.apply( + left_exactmatch_unit.transform, axis=1) + data_pack.relation['match_right'] = frame.apply( + right_exactmatch_unit.transform, axis=1) + + data_pack.apply_on_text( + self._left_fixedlength_unit.transform, + mode='left', inplace=True, verbose=verbose) + data_pack.apply_on_text( + self._right_fixedlength_unit.transform, + mode='right', inplace=True, verbose=verbose) + + return data_pack diff --git a/matchzoo/preprocessors/units/__init__.py b/matchzoo/preprocessors/units/__init__.py index d9e88953..96844953 100644 --- a/matchzoo/preprocessors/units/__init__.py +++ b/matchzoo/preprocessors/units/__init__.py @@ -13,6 +13,8 @@ from .tokenize import Tokenize from .vocabulary import Vocabulary from .word_hashing import WordHashing +from .character_index import CharacterIndex +from .word_exact_match import WordExactMatch def list_available() -> list: diff --git a/matchzoo/preprocessors/units/character_index.py b/matchzoo/preprocessors/units/character_index.py new file mode 100644 index 00000000..ae2a46cd --- /dev/null +++ b/matchzoo/preprocessors/units/character_index.py @@ -0,0 +1,61 @@ +import numpy as np + +from .unit import Unit + + +class CharacterIndex(Unit): + """ + CharacterIndexUnit for DIIN model. + + The input of :class:'CharacterIndexUnit' should be a list of word + character list extracted from a text. The output is the character + index representation of this text. + + :class:`NgramLetterUnit` and :class:`VocabularyUnit` are two + essential prerequisite of :class:`CharacterIndexUnit`. + + Examples: + >>> input_ = [['#', 'a', '#'],['#', 'o', 'n', 'e', '#']] + >>> character_index = CharacterIndex( + ... char_index={ + '': 0, '': 1, 'a': 2, 'n': 3, 'e':4, '#':5}, + ... fixed_length_text=3, + ... fixed_length_word=5) + >>> index = character_index.transform(input_) + >>> index + [[5, 2, 5, 0, 0], [5, 1, 3, 4, 5], [0, 0, 0, 0, 0]] + """ + + def __init__( + self, + char_index: dict, + fixed_length_text: int, + fixed_length_word: int + ): + """ + Class initialization. + + :param char_index: character-index mapping generated by + :class:'VocabularyUnit'. + :param fixed_length_text: maximize length of a text. + :param fixed_length_word: maximize length of a word. + """ + self._char_index = char_index + self._fixed_length_text = fixed_length_text + self._fixed_length_word = fixed_length_word + + def transform(self, input_: list) -> list: + """ + Transform list of characters to corresponding indices. + + :param input_: list of characters generated by + :class:'NgramLetterUnit'. + + :return: character index representation of a text. + """ + idx = np.zeros((self._fixed_length_text, self._fixed_length_word)) + for i in range(min(len(input_), self._fixed_length_text)): + for j in range(min(len(input_[i]), self._fixed_length_word)): + idx[i, j] = self._char_index.get(input_[i][j], 1) + + return idx.tolist() diff --git a/matchzoo/preprocessors/units/word_exact_match.py b/matchzoo/preprocessors/units/word_exact_match.py new file mode 100644 index 00000000..68a7834b --- /dev/null +++ b/matchzoo/preprocessors/units/word_exact_match.py @@ -0,0 +1,66 @@ +import numpy as np + +from .unit import Unit + + +class WordExactMatch(Unit): + """ + WordExactUnit Class. + + Process unit to get a binary match list of two word index lists. The + word index list is the word representation of a text. + + Examples: + >>> input_ = pandas.DataFrame({ + ... 'text_left':[[1, 2, 3],[4, 5, 7, 9]], + ... 'text_right':[[5, 3, 2, 7],[2, 3, 5]]} + ... ) + >>> left_word_exact_match = WordExactMatch( + ... fixed_length_text=5, + ... match='text_left', to_match='text_right' + ... ) + >>> left_out = input_.apply(left_word_exact_match.transform, axis=1) + >>> left_out + [[0, 1, 1, 0, 0],[0, 1, 0, 0, 0]] + >>> right_word_exact_match = WordExactMatch( + ... fixed_length_text=5, + ... match='text_right', to_match='text_left' + ... ) + >>> right_out = input_.apply(right_word_exact_match.transform, axis=1) + >>> right_out + [[0, 1, 1, 0, 0], [0, 0, 1, 0, 0]] + """ + + def __init__( + self, + fixed_length_text: int, + match: str, + to_match: str + ): + """ + Class initialization. + + :param fixed_length_text: fixed length of the text. + :param match: the 'match' column name. + :param to_match: the 'to_match' column name. + """ + self._fixed_length_text = fixed_length_text + self._match = match + self._to_match = to_match + + def transform(self, input_) -> list: + """ + Transform two word index lists into a binary match list. + + :param input_: a dataframe include 'match' column and + 'to_match' column. + + :return: a binary match result list of two word index lists. + """ + match_length = len(input_[self._match]) + match_binary = np.zeros((self._fixed_length_text)) + for i in range(min(self._fixed_length_text, match_length)): + if input_[self._match][i] in set(input_[self._to_match]): + match_binary[i] = 1 + + return match_binary.tolist() From e11fb8c94a63232127f3cba77792e40413989c7e Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Sun, 28 Apr 2019 00:09:04 +0800 Subject: [PATCH 059/100] fix contrib/layers/__init__.py --- matchzoo/contrib/layers/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/contrib/layers/__init__.py b/matchzoo/contrib/layers/__init__.py index ea5c99b7..34623887 100644 --- a/matchzoo/contrib/layers/__init__.py +++ b/matchzoo/contrib/layers/__init__.py @@ -8,6 +8,6 @@ layer_dict = { "MatchingTensorLayer": MatchingTensorLayer, "SpatialGRU": SpatialGRU, - "DecayingDropoutLayer": DecayingDropoutLayer, + "DecayingDropoutLayer": DecayingDropoutLayer, "EncodingLayer": EncodingLayer } From d459a97a4f2284697649a2bed2d31da801ffd7b6 Mon Sep 17 00:00:00 2001 From: uduse Date: Sun, 5 May 2019 17:05:10 +0800 Subject: [PATCH 060/100] Add make_keras_optimizer_picklable.py and its test. --- matchzoo/__init__.py | 2 +- matchzoo/utils/__init__.py | 1 + .../utils/make_keras_optimizer_picklable.py | 19 +++++++++++++++++++ tests/unit_test/test_utils.py | 17 +++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 matchzoo/utils/make_keras_optimizer_picklable.py create mode 100644 tests/unit_test/test_utils.py diff --git a/matchzoo/__init__.py b/matchzoo/__init__.py index 36484a2e..6205cb23 100644 --- a/matchzoo/__init__.py +++ b/matchzoo/__init__.py @@ -43,7 +43,7 @@ from .embedding.embedding import Embedding -from .utils import one_hot +from .utils import one_hot, make_keras_optimizer_picklable from .preprocessors.build_unit_from_data_pack import build_unit_from_data_pack from .preprocessors.build_vocab_unit import build_vocab_unit diff --git a/matchzoo/utils/__init__.py b/matchzoo/utils/__init__.py index 8c76f5fa..63a840db 100644 --- a/matchzoo/utils/__init__.py +++ b/matchzoo/utils/__init__.py @@ -1,3 +1,4 @@ from .one_hot import one_hot from .tensor_type import TensorType from .list_recursive_subclasses import list_recursive_concrete_subclasses +from .make_keras_optimizer_picklable import make_keras_optimizer_picklable diff --git a/matchzoo/utils/make_keras_optimizer_picklable.py b/matchzoo/utils/make_keras_optimizer_picklable.py new file mode 100644 index 00000000..c45edba4 --- /dev/null +++ b/matchzoo/utils/make_keras_optimizer_picklable.py @@ -0,0 +1,19 @@ +import keras + + +def make_keras_optimizer_picklable(): + """ + Fix https://github.com/NTMC-Community/MatchZoo/issues/726. + + This function changes how keras behaves, use with caution. + """ + def __getstate__(self): + return keras.optimizers.serialize(self) + + def __setstate__(self, state): + optimizer = keras.optimizers.deserialize(state) + self.__dict__ = optimizer.__dict__ + + cls = keras.optimizers.Optimizer + cls.__getstate__ = __getstate__ + cls.__setstate__ = __setstate__ diff --git a/tests/unit_test/test_utils.py b/tests/unit_test/test_utils.py new file mode 100644 index 00000000..d293ef66 --- /dev/null +++ b/tests/unit_test/test_utils.py @@ -0,0 +1,17 @@ +import dill +import pytest +import keras + +import matchzoo + + +def test_make_keras_optimizer_picklable(): + adam = keras.optimizers.Adam(lr=0.1) + with pytest.raises(Exception): + s = dill.dumps(adam) + assert dill.loads(s) + + matchzoo.utils.make_keras_optimizer_picklable() + + s = dill.dumps(adam) + assert dill.loads(s) From a33d93a07acaba77e63f6c69779bd14ba3217224 Mon Sep 17 00:00:00 2001 From: bo Date: Fri, 10 May 2019 11:59:53 +0200 Subject: [PATCH 061/100] take out gitter --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ad5c345c..97ef5ad0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ > MatchZoo 是一个通用的文本匹配工具包,它旨在方便大家快速的实现、比较、以及分享最新的深度文本匹配模型。 [![Python 3.6](https://img.shields.io/badge/python-3.6%20%7C%203.7-blue.svg)](https://www.python.org/downloads/release/python-360/) -[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/NTMC-Community/community) [![Pypi Downloads](https://img.shields.io/pypi/dm/matchzoo.svg?label=pypi)](https://pypi.org/project/MatchZoo/) [![Documentation Status](https://readthedocs.org/projects/matchzoo/badge/?version=master)](https://matchzoo.readthedocs.io/en/master/?badge=master) [![Build Status](https://travis-ci.org/NTMC-Community/MatchZoo.svg?branch=master)](https://travis-ci.org/NTMC-Community/MatchZoo/) From ac8d91ee2d29c6ef8d1724bfe70618b7cacec173 Mon Sep 17 00:00:00 2001 From: Crystina Date: Sat, 11 May 2019 06:28:56 -0400 Subject: [PATCH 062/100] recommit esim tutorial --- tutorials/wikiqa/esim.ipynb | 524 ++++++++++++++++++++++++++++++++++++ 1 file changed, 524 insertions(+) create mode 100644 tutorials/wikiqa/esim.ipynb diff --git a/tutorials/wikiqa/esim.ipynb b/tutorials/wikiqa/esim.ipynb new file mode 100644 index 00000000..042910bc --- /dev/null +++ b/tutorials/wikiqa/esim.ipynb @@ -0,0 +1,524 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "matchzoo version 2.1.0\n", + "\n", + "data loading ...\n", + "data loaded as `train_pack_raw` `dev_pack_raw` `test_pack_raw`\n", + "`ranking_task` initialized with metrics [normalized_discounted_cumulative_gain@3(0.0), normalized_discounted_cumulative_gain@5(0.0), mean_average_precision(0.0)]\n", + "loading embedding ...\n", + "embedding loaded as `glove_embedding`\n" + ] + } + ], + "source": [ + "%run ./tutorials/wikiqa/init.ipynb" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "from keras.backend.tensorflow_backend import set_session\n", + "config = tf.ConfigProto()\n", + "config.gpu_options.visible_device_list=\"1\"\n", + "config.gpu_options.allow_growth = True # dynamically grow the memory used on the GPU\n", + "sess = tf.Session(config=config)\n", + "set_session(sess) # set this TensorFlow session as the default session for Keras" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def load_filtered_data(preprocessor, data_type):\n", + " assert ( data_type in ['train', 'dev', 'test'])\n", + " data_pack = mz.datasets.wiki_qa.load_data(data_type, task='ranking')\n", + "\n", + " if data_type == 'train':\n", + " X, Y = preprocessor.fit_transform(data_pack).unpack()\n", + " else:\n", + " X, Y = preprocessor.transform(data_pack).unpack()\n", + "\n", + " new_idx = []\n", + " for i in range(Y.shape[0]):\n", + " if X[\"length_left\"][i] == 0 or X[\"length_right\"][i] == 0:\n", + " continue\n", + " new_idx.append(i)\n", + " new_idx = np.array(new_idx)\n", + " print(\"Removed empty data. Found \", (Y.shape[0] - new_idx.shape[0]))\n", + "\n", + " for k in X.keys():\n", + " X[k] = X[k][new_idx]\n", + " Y = Y[new_idx]\n", + "\n", + " pos_idx = (Y == 1)[:, 0]\n", + " pos_qid = X[\"id_left\"][pos_idx]\n", + " keep_idx_bool = np.array([ qid in pos_qid for qid in X[\"id_left\"]])\n", + " keep_idx = np.arange(keep_idx_bool.shape[0])\n", + " keep_idx = keep_idx[keep_idx_bool]\n", + " print(\"Removed questions with no pos label. Found \", (keep_idx_bool == 0).sum())\n", + "\n", + " print(\"shuffling...\")\n", + " np.random.shuffle(keep_idx)\n", + " for k in X.keys():\n", + " X[k] = X[k][keep_idx]\n", + " Y = Y[keep_idx]\n", + "\n", + " return X, Y, preprocessor" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 12754.26it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 18841/18841 [00:02<00:00, 6500.31it/s]\n", + "Processing text_right with append: 100%|██████████| 18841/18841 [00:00<00:00, 1215206.55it/s]\n", + "Building FrequencyFilter from a datapack.: 100%|██████████| 18841/18841 [00:00<00:00, 185258.28it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 184455.70it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 922581.36it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 1082236.12it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 404432/404432 [00:00<00:00, 3795031.47it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 13650.60it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 18841/18841 [00:02<00:00, 6764.51it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 171037.31it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 288623.28it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 90725.37it/s]\n", + "Processing length_left with len: 100%|██████████| 2118/2118 [00:00<00:00, 583636.81it/s]\n", + "Processing length_right with len: 100%|██████████| 18841/18841 [00:00<00:00, 1203693.44it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 193145.54it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 134549.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed empty data. Found 38\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 296/296 [00:00<00:00, 14135.26it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 0%| | 0/2708 [00:00 Lowercase => PuncRemoval: 100%|██████████| 2708/2708 [00:00<00:00, 6731.87it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 168473.93it/s]\n", + "Processing text_left with transform: 100%|██████████| 296/296 [00:00<00:00, 204701.40it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 159066.95it/s]\n", + "Processing length_left with len: 100%|██████████| 296/296 [00:00<00:00, 442607.48it/s]\n", + "Processing length_right with len: 100%|██████████| 2708/2708 [00:00<00:00, 1038699.15it/s]\n", + "Processing text_left with transform: 100%|██████████| 296/296 [00:00<00:00, 149130.81it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 140864.36it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 633/633 [00:00<00:00, 12189.39it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed empty data. Found 2\n", + "Removed questions with no pos label. Found 1601\n", + "shuffling...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 5961/5961 [00:00<00:00, 7064.16it/s]\n", + "Processing text_right with transform: 100%|██████████| 5961/5961 [00:00<00:00, 187399.25it/s]\n", + "Processing text_left with transform: 100%|██████████| 633/633 [00:00<00:00, 259733.36it/s]\n", + "Processing text_right with transform: 100%|██████████| 5961/5961 [00:00<00:00, 160878.23it/s]\n", + "Processing length_left with len: 100%|██████████| 633/633 [00:00<00:00, 688714.51it/s]\n", + "Processing length_right with len: 100%|██████████| 5961/5961 [00:00<00:00, 1166965.98it/s]\n", + "Processing text_left with transform: 100%|██████████| 633/633 [00:00<00:00, 158526.06it/s]\n", + "Processing text_right with transform: 100%|██████████| 5961/5961 [00:00<00:00, 137558.64it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed empty data. Found 18\n", + "Removed questions with no pos label. Found 3805\n", + "shuffling...\n" + ] + } + ], + "source": [ + "preprocessor = mz.preprocessors.BasicPreprocessor(fixed_length_left=20,\n", + " fixed_length_right=40,\n", + " remove_stop_words=False)\n", + "train_X, train_Y, preprocessor = load_filtered_data(preprocessor, 'train')\n", + "val_X, val_Y, _ = load_filtered_data(preprocessor, 'dev')\n", + "pred_X, pred_Y, _ = load_filtered_data(preprocessor, 'test')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "text_left (InputLayer) (None, 20) 0 \n", + "__________________________________________________________________________________________________\n", + "text_right (InputLayer) (None, 40) 0 \n", + "__________________________________________________________________________________________________\n", + "embedding (Embedding) multiple 5002500 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "dropout_1 (Dropout) multiple 0 embedding[0][0] \n", + " embedding[1][0] \n", + " dense_1[0][0] \n", + " dense_1[1][0] \n", + " dense_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_1 (Lambda) multiple 0 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_1 (Bidirectional) multiple 1442400 dropout_1[0][0] \n", + " dropout_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_2 (Lambda) (None, 20, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_3 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_1 (Multiply) (None, 20, 600) 0 bidirectional_1[0][0] \n", + " lambda_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_2 (Multiply) (None, 40, 600) 0 bidirectional_1[1][0] \n", + " lambda_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_4 (Lambda) (None, 20, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_5 (Lambda) (None, 1, 40) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_1 (Dot) (None, 20, 40) 0 multiply_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_3 (Multiply) (None, 20, 40) 0 lambda_4[0][0] \n", + " lambda_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "permute_1 (Permute) (None, 40, 20) 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "atten_mask (Lambda) multiple 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + " permute_1[0][0] \n", + " permute_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "softmax_1 (Softmax) multiple 0 atten_mask[0][0] \n", + " atten_mask[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_2 (Dot) (None, 20, 600) 0 softmax_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "dot_3 (Dot) (None, 40, 600) 0 softmax_1[1][0] \n", + " multiply_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_1 (Subtract) (None, 20, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_4 (Multiply) (None, 20, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_2 (Subtract) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_5 (Multiply) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 20, 2400) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + " subtract_1[0][0] \n", + " multiply_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_2 (Concatenate) (None, 40, 2400) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + " subtract_2[0][0] \n", + " multiply_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_1 (Dense) multiple 720300 concatenate_1[0][0] \n", + " concatenate_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_2 (Bidirectional) multiple 1442400 dropout_1[2][0] \n", + " dropout_1[3][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_6 (Lambda) (None, 20, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_8 (Lambda) (None, 20, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_10 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_12 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_6 (Multiply) (None, 20, 600) 0 bidirectional_2[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_7 (Multiply) (None, 20, 600) 0 bidirectional_2[0][0] \n", + " lambda_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_8 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_9 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_7 (Lambda) (None, 600) 0 multiply_6[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_9 (Lambda) (None, 600) 0 multiply_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_11 (Lambda) (None, 600) 0 multiply_8[0][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_13 (Lambda) (None, 600) 0 multiply_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_3 (Concatenate) (None, 1200) 0 lambda_7[0][0] \n", + " lambda_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_4 (Concatenate) (None, 1200) 0 lambda_11[0][0] \n", + " lambda_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_5 (Concatenate) (None, 2400) 0 concatenate_3[0][0] \n", + " concatenate_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_2 (Dense) (None, 300) 720300 concatenate_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_3 (Dense) (None, 2) 602 dropout_1[4][0] \n", + "==================================================================================================\n", + "Total params: 9,328,502\n", + "Trainable params: 4,326,002\n", + "Non-trainable params: 5,002,500\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "from keras.optimizers import Adam\n", + "import matchzoo\n", + "\n", + "model = matchzoo.contrib.models.ESIM()\n", + "\n", + "# update `input_shapes` and `embedding_input_dim`\n", + "# model.params['task'] = mz.tasks.Ranking() \n", + "# or \n", + "model.params['task'] = mz.tasks.Classification(num_classes=2)\n", + "model.params.update(preprocessor.context)\n", + "\n", + "model.params['mask_value'] = 0\n", + "model.params['lstm_dim'] = 300\n", + "model.params['embedding_output_dim'] = 300\n", + "model.params['embedding_trainable'] = False\n", + "model.params['dropout_rate'] = 0.5\n", + "\n", + "model.params['mlp_num_units'] = 300\n", + "model.params['mlp_num_layers'] = 0\n", + "model.params['mlp_num_fan_out'] = 300\n", + "model.params['mlp_activation_func'] = 'tanh'\n", + "model.params['optimizer'] = Adam(lr=1e-4)\n", + "model.guess_and_fill_missing_params()\n", + "model.build()\n", + "model.compile()\n", + "model.backend.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "embedding_matrix = glove_embedding.build_matrix(preprocessor.context['vocab_unit'].state['term_index'], initializer=lambda: 0)\n", + "model.load_embedding_matrix(embedding_matrix)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 8650 samples, validate on 1130 samples\n", + "Epoch 1/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0985 - val_loss: 0.0977\n", + "Validation: mean_average_precision(0.0): 0.6377925262180991\n", + "Epoch 2/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0947 - val_loss: 0.0939\n", + "Validation: mean_average_precision(0.0): 0.6323746460063332\n", + "Epoch 3/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0923 - val_loss: 0.0896\n", + "Validation: mean_average_precision(0.0): 0.6447892278707743\n", + "Epoch 4/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0895 - val_loss: 0.0904\n", + "Validation: mean_average_precision(0.0): 0.6645210508066117\n", + "Epoch 5/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0883 - val_loss: 0.0900\n", + "Validation: mean_average_precision(0.0): 0.6622282952529867\n", + "Epoch 6/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0839 - val_loss: 0.0900\n", + "Validation: mean_average_precision(0.0): 0.6654279587941297\n", + "Epoch 7/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0821 - val_loss: 0.0896\n", + "Validation: mean_average_precision(0.0): 0.6668269018575894\n", + "Epoch 8/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0792 - val_loss: 0.0885\n", + "Validation: mean_average_precision(0.0): 0.6723704781393599\n", + "Epoch 9/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0754 - val_loss: 0.0895\n", + "Validation: mean_average_precision(0.0): 0.6552521148587158\n", + "Epoch 10/10\n", + "8650/8650 [==============================] - 52s 6ms/step - loss: 0.0731 - val_loss: 0.0910\n", + "Validation: mean_average_precision(0.0): 0.6695447388956829\n" + ] + } + ], + "source": [ + "# train as ranking task\n", + "model.params['task'] = mz.tasks.Ranking()\n", + "evaluate = mz.callbacks.EvaluateAllMetrics(model,\n", + " x=pred_X,\n", + " y=pred_Y,\n", + " once_every=1,\n", + " batch_size=len(pred_Y))\n", + "history = model.fit(x = [train_X['text_left'],\n", + " train_X['text_right']], # (20360, 1000)\n", + " y = train_Y, # (20360, 2)\n", + " validation_data = (val_X, val_Y),\n", + " callbacks=[evaluate],\n", + " batch_size = 32,\n", + " epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 8650 samples, validate on 1130 samples\n", + "Epoch 1/10\n", + "8650/8650 [==============================] - 68s 8ms/step - loss: 0.3628 - val_loss: 0.3552\n", + "Epoch 2/10\n", + "8650/8650 [==============================] - 63s 7ms/step - loss: 0.3285 - val_loss: 0.3591\n", + "Epoch 3/10\n", + "8650/8650 [==============================] - 63s 7ms/step - loss: 0.3105 - val_loss: 0.3681\n", + "Epoch 4/10\n", + "8650/8650 [==============================] - 64s 7ms/step - loss: 0.3012 - val_loss: 0.3166\n", + "Epoch 5/10\n", + "8650/8650 [==============================] - 64s 7ms/step - loss: 0.2888 - val_loss: 0.2961\n", + "Epoch 6/10\n", + "8650/8650 [==============================] - 64s 7ms/step - loss: 0.2801 - val_loss: 0.3362\n", + "Epoch 7/10\n", + "8650/8650 [==============================] - 64s 7ms/step - loss: 0.2692 - val_loss: 0.3324\n", + "Epoch 8/10\n", + "8650/8650 [==============================] - 64s 7ms/step - loss: 0.2609 - val_loss: 0.3172\n", + "Epoch 9/10\n", + "8650/8650 [==============================] - 58s 7ms/step - loss: 0.2542 - val_loss: 0.3296\n", + "Epoch 10/10\n", + "8650/8650 [==============================] - 53s 6ms/step - loss: 0.2365 - val_loss: 0.3058\n" + ] + } + ], + "source": [ + "# train as classification task \n", + "\n", + "from keras.utils import to_categorical\n", + "train_Y = to_categorical(train_Y)\n", + "val_Y = to_categorical(val_Y)\n", + "\n", + "model.params['task'] = mz.tasks.Classification(num_classes=2)\n", + "\n", + "history = model.fit(x = [train_X['text_left'],\n", + " train_X['text_right']], # (20360, 1000)\n", + " y = train_Y, # (20360, 2)\n", + " validation_data = (val_X, val_Y),\n", + " batch_size = 32,\n", + " epochs = 10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mz_play", + "language": "python", + "name": "mz_play" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From cea292769af4ac688649573a11b20f4d69024e3d Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Wed, 15 May 2019 19:13:35 +0800 Subject: [PATCH 063/100] add bert_preprocessor with some new units --- matchzoo/preprocessors/__init__.py | 1 + matchzoo/preprocessors/bert_preprocessor.py | 145 +++++++ matchzoo/preprocessors/build_vocab_unit.py | 14 +- matchzoo/preprocessors/units/__init__.py | 7 +- matchzoo/preprocessors/units/bert_clean.py | 41 ++ .../preprocessors/units/bert_tokenization.py | 399 ------------------ matchzoo/preprocessors/units/bert_tokenize.py | 23 - matchzoo/preprocessors/units/tokenize.py | 101 +++++ matchzoo/preprocessors/units/vocabulary.py | 42 ++ matchzoo/utils/bert_utils.py | 106 +++++ .../processor_units/test_processor_units.py | 30 +- 11 files changed, 472 insertions(+), 437 deletions(-) create mode 100644 matchzoo/preprocessors/bert_preprocessor.py create mode 100644 matchzoo/preprocessors/units/bert_clean.py delete mode 100644 matchzoo/preprocessors/units/bert_tokenization.py delete mode 100644 matchzoo/preprocessors/units/bert_tokenize.py create mode 100644 matchzoo/utils/bert_utils.py diff --git a/matchzoo/preprocessors/__init__.py b/matchzoo/preprocessors/__init__.py index 3042e574..3e941f23 100644 --- a/matchzoo/preprocessors/__init__.py +++ b/matchzoo/preprocessors/__init__.py @@ -3,6 +3,7 @@ from .naive_preprocessor import NaivePreprocessor from .basic_preprocessor import BasicPreprocessor from .cdssm_preprocessor import CDSSMPreprocessor +from .bert_preprocessor import BertPreprocessor def list_available() -> list: diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py new file mode 100644 index 00000000..2e2e132b --- /dev/null +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -0,0 +1,145 @@ +"""Bert Preprocessor.""" + +from tqdm import tqdm + +from . import units +from .chain_transform import chain_transform +from matchzoo import DataPack +from matchzoo.engine.base_preprocessor import BasePreprocessor +from .build_vocab_unit import built_bert_vocab_unit +from .build_unit_from_data_pack import build_unit_from_data_pack + +tqdm.pandas() + + +class BertPreprocessor(BasePreprocessor): + """Bert-base Model preprocessor.""" + + def __init__(self, fixed_length_left: int = 30, + fixed_length_right: int = 30, + filter_mode: str = 'df', + filter_low_freq: float = 2, + filter_high_freq: float = float('inf'), + remove_stop_words: bool = False, + lower_case: bool=True, + chinese_version: bool=True, + bert_vocab_path: str="bert_dir/vocab.txt"): + """ + Bert-base Model preprocessor. + + TODO: doc here. + + + Example: + >>> import matchzoo as mz + >>> train_data = mz.datasets.toy.load_data() + >>> test_data = mz.datasets.toy.load_data(stage='test') + >>> bert_preprocessor = mz.preprocessors.BertPreprocessor() + >>> train_data_processed = bert_preprocessor.fit_transform( + ... train_data + ... ) + >>> type(train_data_processed) + + >>> test_data_transformed = bert_preprocessor.transform(test_data) + >>> type(test_data_transformed) + + + """ + super().__init__() + self._fixed_length_left = fixed_length_left + self._fixed_length_right = fixed_length_right + self._bert_vocab_path = bert_vocab_path + self._left_fixedlength_unit = units.FixedLength( + self._fixed_length_left, + pad_mode='post' + ) + self._right_fixedlength_unit = units.FixedLength( + self._fixed_length_right, + pad_mode='post' + ) + self._filter_unit = units.FrequencyFilter( + low=filter_low_freq, + high=filter_high_freq, + mode=filter_mode + ) + self._units = self._default_units() + self._vocab_unit = built_bert_vocab_unit(self._bert_vocab_path) + + if chinese_version: + self._units.insert(1, units.ChineseTokenize()) + if lower_case: + self._units.append(units.Lowercase()) + self._units.append(units.StripAccent()) + self._units.append(units.WordPieceTokenize(self._vocab_unit.state['term_index'])) + if remove_stop_words: + self._units.append(units.StopRemoval()) + + def fit(self, data_pack: DataPack, verbose: int = 1): + """ + Fit pre-processing context for transformation. + + :param verbose: Verbosity. + :param data_pack: Data_pack to be preprocessed. + :return: class:`BertPreprocessor` instance. + """ + data_pack = data_pack.apply_on_text(chain_transform(self._units), + verbose=verbose) + fitted_filter_unit = build_unit_from_data_pack(self._filter_unit, + data_pack, + flatten=False, + mode='right', + verbose=verbose) + self._context['filter_unit'] = fitted_filter_unit + self._context['vocab_unit'] = self._vocab_unit + vocab_size = len(self._vocab_unit.state['term_index']) + self._context['vocab_size'] = vocab_size + self._context['embedding_input_dim'] = vocab_size + self._context['input_shapes'] = [(self._fixed_length_left,), + (self._fixed_length_right,)] + return self + + def transform(self, data_pack: DataPack, verbose: int = 1) -> DataPack: + """ + Apply transformation on data, create fixed length representation. + + :param data_pack: Inputs to be preprocessed. + :param verbose: Verbosity. + + :return: Transformed data as :class:`DataPack` object. + """ + data_pack = data_pack.copy() + data_pack.apply_on_text(chain_transform(self._units), inplace=True, + verbose=verbose) + + data_pack.apply_on_text(self._context['filter_unit'].transform, + mode='right', inplace=True, verbose=verbose) + data_pack.apply_on_text(self._context['vocab_unit'].transform, + mode='both', inplace=True, verbose=verbose) + data_pack.append_text_length(inplace=True, verbose=verbose) + data_pack.apply_on_text(self._left_fixedlength_unit.transform, + mode='left', inplace=True, verbose=verbose) + data_pack.apply_on_text(self._right_fixedlength_unit.transform, + mode='right', inplace=True, verbose=verbose) + + max_len_left = self._fixed_length_left + max_len_right = self._fixed_length_right + + data_pack.left['length_left'] = \ + data_pack.left['length_left'].apply( + lambda val: min(val, max_len_left)) + + data_pack.right['length_right'] = \ + data_pack.right['length_right'].apply( + lambda val: min(val, max_len_right)) + return data_pack + + @classmethod + def _default_units(cls) -> list: + """Prepare needed process units.""" + return [ + units.BertClean(), + units.BasicTokenize() + ] + + + diff --git a/matchzoo/preprocessors/build_vocab_unit.py b/matchzoo/preprocessors/build_vocab_unit.py index 3d9442de..ac1af5d6 100644 --- a/matchzoo/preprocessors/build_vocab_unit.py +++ b/matchzoo/preprocessors/build_vocab_unit.py @@ -1,7 +1,7 @@ from matchzoo.data_pack import DataPack from .units import Vocabulary from .build_unit_from_data_pack import build_unit_from_data_pack - +from .units import BertVocabulary def build_vocab_unit( data_pack: DataPack, @@ -28,3 +28,15 @@ def build_vocab_unit( mode=mode, flatten=True, verbose=verbose ) + + +def built_bert_vocab_unit(vocab_path: str) -> BertVocabulary: + """ + Build a :class:`preprocessor.units.BertVocabulary` given `vocab_path`. + :param vocab_path: bert vocabulary path. + :return: A built vocabulary unit. + + """ + vocab_unit = BertVocabulary(pad_value='[PAD]', oov_value='[UNK]') + vocab_unit.fit(vocab_path) + return vocab_unit diff --git a/matchzoo/preprocessors/units/__init__.py b/matchzoo/preprocessors/units/__init__.py index 926b24cc..e6ba360a 100644 --- a/matchzoo/preprocessors/units/__init__.py +++ b/matchzoo/preprocessors/units/__init__.py @@ -13,7 +13,12 @@ from .tokenize import Tokenize from .vocabulary import Vocabulary from .word_hashing import WordHashing -from .bert_tokenize import BertTokenize +from .bert_clean import BertClean +from .bert_clean import StripAccent +from.tokenize import ChineseTokenize +from .tokenize import BasicTokenize +from .tokenize import WordPieceTokenize +from .vocabulary import BertVocabulary def list_available() -> list: diff --git a/matchzoo/preprocessors/units/bert_clean.py b/matchzoo/preprocessors/units/bert_clean.py new file mode 100644 index 00000000..74f7b5fc --- /dev/null +++ b/matchzoo/preprocessors/units/bert_clean.py @@ -0,0 +1,41 @@ +from .unit import Unit +from matchzoo.utils.bert_utils import is_whitespace, is_control, run_strip_accents + + +class BertClean(Unit): + """Clean unit for raw text.""" + + def transform(self, input_: str) -> str: + """ + Process input data from raw terms to cleaned text. + + :param input_: raw textual input. + + :return cleaned_text: cleaned text. + """ + output = [] + for char in input_: + cp = ord(char) + if cp == 0 or cp == 0xfffd or is_control(char): + continue + if is_whitespace(char): + output.append(" ") + else: + output.append(char) + cleaned_text = "".join(output) + return cleaned_text + + +class StripAccent(Unit): + """Process unit for text lower case.""" + + def transform(self, input_: list) -> list: + """ + Strips accents from each token. + + :param input_: list of tokens. + + :return tokens: Accent-stripped list of tokens. + """ + + return [run_strip_accents(token) for token in input_] diff --git a/matchzoo/preprocessors/units/bert_tokenization.py b/matchzoo/preprocessors/units/bert_tokenization.py deleted file mode 100644 index 0ee13595..00000000 --- a/matchzoo/preprocessors/units/bert_tokenization.py +++ /dev/null @@ -1,399 +0,0 @@ -# coding=utf-8 -# Copyright 2018 The Google AI Language Team Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tokenization classes.""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import collections -import re -import unicodedata -import six -import tensorflow as tf - - -def validate_case_matches_checkpoint(do_lower_case, init_checkpoint): - """Checks whether the casing config is consistent with the checkpoint name.""" - - # The casing has to be passed in by the user and there is no explicit check - # as to whether it matches the checkpoint. The casing information probably - # should have been stored in the bert_config.json file, but it's not, so - # we have to heuristically detect it to validate. - - if not init_checkpoint: - return - - m = re.match("^.*?([A-Za-z0-9_-]+)/bert_model.ckpt", init_checkpoint) - if m is None: - return - - model_name = m.group(1) - - lower_models = [ - "uncased_L-24_H-1024_A-16", "uncased_L-12_H-768_A-12", - "multilingual_L-12_H-768_A-12", "chinese_L-12_H-768_A-12" - ] - - cased_models = [ - "cased_L-12_H-768_A-12", "cased_L-24_H-1024_A-16", - "multi_cased_L-12_H-768_A-12" - ] - - is_bad_config = False - if model_name in lower_models and not do_lower_case: - is_bad_config = True - actual_flag = "False" - case_name = "lowercased" - opposite_flag = "True" - - if model_name in cased_models and do_lower_case: - is_bad_config = True - actual_flag = "True" - case_name = "cased" - opposite_flag = "False" - - if is_bad_config: - raise ValueError( - "You passed in `--do_lower_case=%s` with `--init_checkpoint=%s`. " - "However, `%s` seems to be a %s model, so you " - "should pass in `--do_lower_case=%s` so that the fine-tuning matches " - "how the model was pre-training. If this error is wrong, please " - "just comment out this check." % (actual_flag, init_checkpoint, - model_name, case_name, opposite_flag)) - - -def convert_to_unicode(text): - """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" - if six.PY3: - if isinstance(text, str): - return text - elif isinstance(text, bytes): - return text.decode("utf-8", "ignore") - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - elif six.PY2: - if isinstance(text, str): - return text.decode("utf-8", "ignore") - elif isinstance(text, unicode): - return text - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - else: - raise ValueError("Not running on Python2 or Python 3?") - - -def printable_text(text): - """Returns text encoded in a way suitable for print or `tf.logging`.""" - - # These functions want `str` for both Python2 and Python3, but in one case - # it's a Unicode string and in the other it's a byte string. - if six.PY3: - if isinstance(text, str): - return text - elif isinstance(text, bytes): - return text.decode("utf-8", "ignore") - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - elif six.PY2: - if isinstance(text, str): - return text - elif isinstance(text, unicode): - return text.encode("utf-8") - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - else: - raise ValueError("Not running on Python2 or Python 3?") - - -def load_vocab(vocab_file): - """Loads a vocabulary file into a dictionary.""" - vocab = collections.OrderedDict() - index = 0 - with tf.gfile.GFile(vocab_file, "r") as reader: - while True: - token = convert_to_unicode(reader.readline()) - if not token: - break - token = token.strip() - vocab[token] = index - index += 1 - return vocab - - -def convert_by_vocab(vocab, items): - """Converts a sequence of [tokens|ids] using the vocab.""" - output = [] - for item in items: - output.append(vocab[item]) - return output - - -def convert_tokens_to_ids(vocab, tokens): - return convert_by_vocab(vocab, tokens) - - -def convert_ids_to_tokens(inv_vocab, ids): - return convert_by_vocab(inv_vocab, ids) - - -def whitespace_tokenize(text): - """Runs basic whitespace cleaning and splitting on a piece of text.""" - text = text.strip() - if not text: - return [] - tokens = text.split() - return tokens - - -class FullTokenizer(object): - """Runs end-to-end tokenziation.""" - - def __init__(self, vocab_file, do_lower_case=True): - self.vocab = load_vocab(vocab_file) - self.inv_vocab = {v: k for k, v in self.vocab.items()} - self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case) - self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) - - def tokenize(self, text): - split_tokens = [] - for token in self.basic_tokenizer.tokenize(text): - for sub_token in self.wordpiece_tokenizer.tokenize(token): - split_tokens.append(sub_token) - - return split_tokens - - def convert_tokens_to_ids(self, tokens): - return convert_by_vocab(self.vocab, tokens) - - def convert_ids_to_tokens(self, ids): - return convert_by_vocab(self.inv_vocab, ids) - - -class BasicTokenizer(object): - """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" - - def __init__(self, do_lower_case=True): - """Constructs a BasicTokenizer. - - Args: - do_lower_case: Whether to lower case the input. - """ - self.do_lower_case = do_lower_case - - def tokenize(self, text): - """Tokenizes a piece of text.""" - text = convert_to_unicode(text) - text = self._clean_text(text) - - # This was added on November 1st, 2018 for the multilingual and Chinese - # models. This is also applied to the English models now, but it doesn't - # matter since the English models were not trained on any Chinese data - # and generally don't have any Chinese data in them (there are Chinese - # characters in the vocabulary because Wikipedia does have some Chinese - # words in the English Wikipedia.). - text = self._tokenize_chinese_chars(text) - - orig_tokens = whitespace_tokenize(text) - split_tokens = [] - for token in orig_tokens: - if self.do_lower_case: - token = token.lower() - token = self._run_strip_accents(token) - split_tokens.extend(self._run_split_on_punc(token)) - - output_tokens = whitespace_tokenize(" ".join(split_tokens)) - return output_tokens - - def _run_strip_accents(self, text): - """Strips accents from a piece of text.""" - text = unicodedata.normalize("NFD", text) - output = [] - for char in text: - cat = unicodedata.category(char) - if cat == "Mn": - continue - output.append(char) - return "".join(output) - - def _run_split_on_punc(self, text): - """Splits punctuation on a piece of text.""" - chars = list(text) - i = 0 - start_new_word = True - output = [] - while i < len(chars): - char = chars[i] - if _is_punctuation(char): - output.append([char]) - start_new_word = True - else: - if start_new_word: - output.append([]) - start_new_word = False - output[-1].append(char) - i += 1 - - return ["".join(x) for x in output] - - def _tokenize_chinese_chars(self, text): - """Adds whitespace around any CJK character.""" - output = [] - for char in text: - cp = ord(char) - if self._is_chinese_char(cp): - output.append(" ") - output.append(char) - output.append(" ") - else: - output.append(char) - return "".join(output) - - def _is_chinese_char(self, cp): - """Checks whether CP is the codepoint of a CJK character.""" - # This defines a "chinese character" as anything in the CJK Unicode block: - # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) - # - # Note that the CJK Unicode block is NOT all Japanese and Korean characters, - # despite its name. The modern Korean Hangul alphabet is a different block, - # as is Japanese Hiragana and Katakana. Those alphabets are used to write - # space-separated words, so they are not treated specially and handled - # like the all of the other languages. - if ((cp >= 0x4E00 and cp <= 0x9FFF) or # - (cp >= 0x3400 and cp <= 0x4DBF) or # - (cp >= 0x20000 and cp <= 0x2A6DF) or # - (cp >= 0x2A700 and cp <= 0x2B73F) or # - (cp >= 0x2B740 and cp <= 0x2B81F) or # - (cp >= 0x2B820 and cp <= 0x2CEAF) or - (cp >= 0xF900 and cp <= 0xFAFF) or # - (cp >= 0x2F800 and cp <= 0x2FA1F)): # - return True - - return False - - def _clean_text(self, text): - """Performs invalid character removal and whitespace cleanup on text.""" - output = [] - for char in text: - cp = ord(char) - if cp == 0 or cp == 0xfffd or _is_control(char): - continue - if _is_whitespace(char): - output.append(" ") - else: - output.append(char) - return "".join(output) - - -class WordpieceTokenizer(object): - """Runs WordPiece tokenziation.""" - - def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=200): - self.vocab = vocab - self.unk_token = unk_token - self.max_input_chars_per_word = max_input_chars_per_word - - def tokenize(self, text): - """Tokenizes a piece of text into its word pieces. - - This uses a greedy longest-match-first algorithm to perform tokenization - using the given vocabulary. - - For example: - input = "unaffable" - output = ["un", "##aff", "##able"] - - Args: - text: A single token or whitespace separated tokens. This should have - already been passed through `BasicTokenizer. - - Returns: - A list of wordpiece tokens. - """ - - text = convert_to_unicode(text) - - output_tokens = [] - for token in whitespace_tokenize(text): - chars = list(token) - if len(chars) > self.max_input_chars_per_word: - output_tokens.append(self.unk_token) - continue - - is_bad = False - start = 0 - sub_tokens = [] - while start < len(chars): - end = len(chars) - cur_substr = None - while start < end: - substr = "".join(chars[start:end]) - if start > 0: - substr = "##" + substr - if substr in self.vocab: - cur_substr = substr - break - end -= 1 - if cur_substr is None: - is_bad = True - break - sub_tokens.append(cur_substr) - start = end - - if is_bad: - output_tokens.append(self.unk_token) - else: - output_tokens.extend(sub_tokens) - return output_tokens - - -def _is_whitespace(char): - """Checks whether `chars` is a whitespace character.""" - # \t, \n, and \r are technically contorl characters but we treat them - # as whitespace since they are generally considered as such. - if char == " " or char == "\t" or char == "\n" or char == "\r": - return True - cat = unicodedata.category(char) - if cat == "Zs": - return True - return False - - -def _is_control(char): - """Checks whether `chars` is a control character.""" - # These are technically control characters but we count them as whitespace - # characters. - if char == "\t" or char == "\n" or char == "\r": - return False - cat = unicodedata.category(char) - if cat in ("Cc", "Cf"): - return True - return False - - -def _is_punctuation(char): - """Checks whether `chars` is a punctuation character.""" - cp = ord(char) - # We treat all non-letter/number ASCII as punctuation. - # Characters such as "^", "$", and "`" are not in the Unicode - # Punctuation class but we treat them as punctuation anyways, for - # consistency. - if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or - (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): - return True - cat = unicodedata.category(char) - if cat.startswith("P"): - return True - return False diff --git a/matchzoo/preprocessors/units/bert_tokenize.py b/matchzoo/preprocessors/units/bert_tokenize.py deleted file mode 100644 index de4e546c..00000000 --- a/matchzoo/preprocessors/units/bert_tokenize.py +++ /dev/null @@ -1,23 +0,0 @@ - -from .unit import Unit -from .bert_tokenization import FullTokenizer - -class BertTokenize(Unit): - """Process unit for text tokenization by bert tokenizer. - - :param vocab_path: vocab file path in bert pretrained model. - """ - - def __init__(self, vocab_path, do_lower_case=False): - """Initialization.""" - self.tokenizer = FullTokenizer(vocab_path, do_lower_case=do_lower_case) - - def transform(self, input_: str) -> list: - """ - Process input data from raw terms to list of tokens. - - :param input_: raw textual input. - - :return tokens: tokenized tokens as a list. - """ - return self.tokenizer.tokenize(input_) diff --git a/matchzoo/preprocessors/units/tokenize.py b/matchzoo/preprocessors/units/tokenize.py index 1aeb2e62..a7747f8a 100644 --- a/matchzoo/preprocessors/units/tokenize.py +++ b/matchzoo/preprocessors/units/tokenize.py @@ -1,4 +1,5 @@ import nltk +from matchzoo.utils.bert_utils import is_chinese_char, whitespace_tokenize, run_split_on_punc from .unit import Unit @@ -15,3 +16,103 @@ def transform(self, input_: str) -> list: :return tokens: tokenized tokens as a list. """ return nltk.word_tokenize(input_) + + +class ChineseTokenize(Unit): + """Process unit for text containing Chinese tokens.""" + + def transform(self, input_: str) -> str: + """ + Process input data from raw terms to processed text. + + :param input_: raw textual input. + + :return output: text with a blank between adjacent Chinese tokens. + """ + output = [] + for char in input_: + cp = ord(char) + if is_chinese_char(cp): + output.append(" ") + output.append(char) + output.append(" ") + else: + output.append(char) + return "".join(output) + + +class BasicTokenize(Unit): + """Process unit for text tokenization.""" + + def transform(self, input_: str) -> list: + """ + Process input data from raw terms to list of tokens. + + :param input_: raw textual input. + + :return tokens: tokenized tokens as a list. + """ + orig_tokens = whitespace_tokenize(input_) + split_tokens = [] + for token in orig_tokens: + split_tokens.extend(run_split_on_punc(token)) + + output_tokens = whitespace_tokenize(" ".join(split_tokens)) + return output_tokens + + +class WordPieceTokenize(Unit): + """Process unit for text tokenization.""" + + def __init__(self, vocab: dict, max_input_chars_per_word: int=200): + """Initialization. """ + self.vocab = vocab + self.unk_token = '[UNK]' + self.max_input_chars_per_word = max_input_chars_per_word + + def transform(self, input_: list) -> list: + """ + Tokenizes a piece of text into its word pieces. + This uses a greedy longest-match-first algorithm to perform tokenization + using the given vocabulary. + + For example: + input = "unaffable" + output = ["un", "##aff", "##able"] + + :param input_: token list. + + :return tokens: A list of wordpiece tokens. + """ + output_tokens = [] + for token in input_: + chars = list(token) + if len(chars) > self.max_input_chars_per_word: + output_tokens.append(self.unk_token) + continue + + is_bad = False + start = 0 + sub_tokens = [] + while start < len(chars): + end = len(chars) + cur_substr = None + while start < end: + substr = "".join(chars[start:end]) + if start > 0: + substr = "##" + substr + if substr in self.vocab: + cur_substr = substr + break + end -= 1 + if cur_substr is None: + is_bad = True + break + sub_tokens.append(cur_substr) + start = end + + if is_bad: + output_tokens.append(self.unk_token) + else: + output_tokens.extend(sub_tokens) + return output_tokens diff --git a/matchzoo/preprocessors/units/vocabulary.py b/matchzoo/preprocessors/units/vocabulary.py index 783df94f..7504b4cc 100644 --- a/matchzoo/preprocessors/units/vocabulary.py +++ b/matchzoo/preprocessors/units/vocabulary.py @@ -67,3 +67,45 @@ def fit(self, tokens: list): def transform(self, input_: list) -> list: """Transform a list of tokens to corresponding indices.""" return [self._context['term_index'][token] for token in input_] + + +class BertVocabulary(StatefulUnit): + """ + Vocabulary class. + + :param pad_value: The string value for the padding position. + :param oov_value: The string value for the out-of-vocabulary terms. + + Examples: + >>> vocab = BertVocabulary(pad_value='[PAD]', oov_value='[UNK]') + >>> indices = vocab.transform(list('ABCDDZZZ')) + + """ + + def __init__(self, pad_value: str = '[PAD]', oov_value: str = '[UNK]'): + """Vocabulary unit initializer.""" + super().__init__() + self._pad = pad_value + self._oov = oov_value + self._context['term_index'] = self.TermIndex() + self._context['index_term'] = dict() + + class TermIndex(dict): + """Map term to index.""" + + def __missing__(self, key): + """Map out-of-vocabulary terms to index 100 .""" + return 100 + + def fit(self, vocab_path: str): + """Build a :class:`TermIndex` and a :class:`IndexTerm`.""" + with open(vocab_path, 'r', encoding='utf-8') as vocab_file: + for idx, line in enumerate(vocab_file): + term = line.strip() + self._context['term_index'][term] = idx + self._context['index_term'][idx] = term + + def transform(self, input_: list) -> list: + """Transform a list of tokens to corresponding indices.""" + return [self._context['term_index'][token] for token in input_] + diff --git a/matchzoo/utils/bert_utils.py b/matchzoo/utils/bert_utils.py new file mode 100644 index 00000000..9ed234f3 --- /dev/null +++ b/matchzoo/utils/bert_utils.py @@ -0,0 +1,106 @@ +import unicodedata + + +def is_whitespace(char): + """Checks whether `chars` is a whitespace character.""" + # \t, \n, and \r are technically contorl characters but we treat them + # as whitespace since they are generally considered as such. + if char == " " or char == "\t" or char == "\n" or char == "\r": + return True + cat = unicodedata.category(char) + if cat == "Zs": + return True + return False + + +def is_control(char): + """Checks whether `chars` is a control character.""" + # These are technically control characters but we count them as whitespace + # characters. + if char == "\t" or char == "\n" or char == "\r": + return False + cat = unicodedata.category(char) + if cat in ("Cc", "Cf"): + return True + return False + + +def is_punctuation(char): + """Checks whether `chars` is a punctuation character.""" + cp = ord(char) + # We treat all non-letter/number ASCII as punctuation. + # Characters such as "^", "$", and "`" are not in the Unicode + # Punctuation class but we treat them as punctuation anyways, for + # consistency. + if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or + (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + return True + cat = unicodedata.category(char) + if cat.startswith("P"): + return True + return False + + +def is_chinese_char(cp): + """Checks whether CP is the codepoint of a CJK character.""" + # This defines a "chinese character" as anything in the CJK Unicode block: + # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) + # + # Note that the CJK Unicode block is NOT all Japanese and Korean characters, + # despite its name. The modern Korean Hangul alphabet is a different block, + # as is Japanese Hiragana and Katakana. Those alphabets are used to write + # space-separated words, so they are not treated specially and handled + # like the all of the other languages. + if ((cp >= 0x4E00 and cp <= 0x9FFF) or # + (cp >= 0x3400 and cp <= 0x4DBF) or # + (cp >= 0x20000 and cp <= 0x2A6DF) or # + (cp >= 0x2A700 and cp <= 0x2B73F) or # + (cp >= 0x2B740 and cp <= 0x2B81F) or # + (cp >= 0x2B820 and cp <= 0x2CEAF) or + (cp >= 0xF900 and cp <= 0xFAFF) or # + (cp >= 0x2F800 and cp <= 0x2FA1F)): # + return True + + return False + + +def run_strip_accents(text): + """Strips accents from a piece of text.""" + text = unicodedata.normalize("NFD", text) + output = [] + for char in text: + cat = unicodedata.category(char) + if cat == "Mn": + continue + output.append(char) + return "".join(output) + + +def run_split_on_punc(text): + """Splits punctuation on a piece of text.""" + chars = list(text) + i = 0 + start_new_word = True + output = [] + while i < len(chars): + char = chars[i] + if is_punctuation(char): + output.append([char]) + start_new_word = True + else: + if start_new_word: + output.append([]) + start_new_word = False + output[-1].append(char) + i += 1 + + return ["".join(x) for x in output] + + +def whitespace_tokenize(text): + """Runs basic whitespace cleaning and splitting on a piece of text.""" + text = text.strip() + if not text: + return [] + tokens = text.split() + return tokens diff --git a/tests/unit_test/processor_units/test_processor_units.py b/tests/unit_test/processor_units/test_processor_units.py index 4812bece..fccd87e0 100644 --- a/tests/unit_test/processor_units/test_processor_units.py +++ b/tests/unit_test/processor_units/test_processor_units.py @@ -144,21 +144,25 @@ def test_this(): def test_bert_tokenizer_unit(): vocab_tokens = [ - "[UNK]", "[CLS]", "[SEP]", "want", "##want", "##ed", "wa", "un", "runn", - "##ing", "," + "[PAD]", "further", "##more", ",", "under", "the", "micro", "##scope", "neither", + "entity", "contains", "glands", ".", "此", "外", "在", "显", "微", "镜", "下" ] - with tempfile.NamedTemporaryFile(delete=False) as vocab_writer: - vocab_writer.write("".join( - [x + "\n" for x in vocab_tokens]).encode("utf-8")) + raw_text = "furthermore, \r under the microscope \t neither entity \n contains sebaceous glands. 此外, 在显微镜下" - vocab_file = vocab_writer.name + golden_tokens = ['further', '##more', ',', 'under', 'the', 'micro', '##scope', 'neither', 'entity', 'contains', + '[UNK]', 'glands', '.', '此', '外', ',', '在', '显', '微', '镜', '下'] - tokenizer_unit = units.BertTokenize(vocab_file, do_lower_case=True) - os.unlink(vocab_file) + vocab_dict = {} + for idx, token in enumerate(vocab_tokens): + vocab_dict[token] = idx - tokens = tokenizer_unit.transform(u"UNwant\u00E9d,running") - assert tokens == ["un", "##want", "##ed", ",", "runn", "##ing"] + clean_unit = units.BertClean() + cleaned_text = clean_unit.transform(raw_text) + chinese_tokenize_unit = units.ChineseTokenize() + chinese_tokenized_text = chinese_tokenize_unit.transform(cleaned_text) + basic_tokenize_unit = units.BasicTokenize() + basic_tokens = basic_tokenize_unit.transform(chinese_tokenized_text) + wordpiece_unit = units.WordPieceTokenize(vocab_dict) + wordpiece_tokens = wordpiece_unit.transform(basic_tokens) - assert tokenizer_unit.tokenizer.convert_tokens_to_ids(tokens) == [7, 4, 5, 10, 8, 9] - - assert tokenizer_unit.tokenizer.basic_tokenizer.tokenize(u"ah\u535A\u63A8zz") == [u"ah", u"\u535A", u"\u63A8", u"zz"] + assert wordpiece_tokens == golden_tokens From 768ea0e85810e5189c0b26650b9f2aeb5fe052e4 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Wed, 15 May 2019 21:20:56 +0800 Subject: [PATCH 064/100] comment the bert_preprocessor examples to pass test --- matchzoo/preprocessors/bert_preprocessor.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index 2e2e132b..a7ee4493 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -23,7 +23,7 @@ def __init__(self, fixed_length_left: int = 30, remove_stop_words: bool = False, lower_case: bool=True, chinese_version: bool=True, - bert_vocab_path: str="bert_dir/vocab.txt"): + bert_vocab_path: str="bert_resources/vocab.txt"): """ Bert-base Model preprocessor. @@ -31,18 +31,13 @@ def __init__(self, fixed_length_left: int = 30, Example: - >>> import matchzoo as mz - >>> train_data = mz.datasets.toy.load_data() - >>> test_data = mz.datasets.toy.load_data(stage='test') - >>> bert_preprocessor = mz.preprocessors.BertPreprocessor() - >>> train_data_processed = bert_preprocessor.fit_transform( - ... train_data - ... ) - >>> type(train_data_processed) - - >>> test_data_transformed = bert_preprocessor.transform(test_data) - >>> type(test_data_transformed) - + import matchzoo as mz + train_data = mz.datasets.toy.load_data() + test_data = mz.datasets.toy.load_data(stage='test') + # the argument 'bert_vocab_path' must feed the bert vocab path + bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='vocab.txt') + train_data_processed = bert_preprocessor.fit_transform(train_data) + test_data_processed = bert_preprocessor.transform(test_data) """ super().__init__() From 675d4b321f64cc43d7108be2393d587e7c96cfbc Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Thu, 16 May 2019 16:57:47 +0800 Subject: [PATCH 065/100] rename encoding_layer, fix diin.py --- matchzoo/contrib/layers/__init__.py | 2 +- ...g_layer.py => semantic_composite_layer.py} | 0 matchzoo/contrib/models/diin.py | 30 ++++++++++--------- matchzoo/preprocessors/diin_preprocessor.py | 6 ++-- 4 files changed, 20 insertions(+), 18 deletions(-) rename matchzoo/contrib/layers/{encoding_layer.py => semantic_composite_layer.py} (100%) diff --git a/matchzoo/contrib/layers/__init__.py b/matchzoo/contrib/layers/__init__.py index 34623887..09ef7e7c 100644 --- a/matchzoo/contrib/layers/__init__.py +++ b/matchzoo/contrib/layers/__init__.py @@ -3,7 +3,7 @@ from .matching_tensor_layer import MatchingTensorLayer from .spatial_gru import SpatialGRU from .decaying_dropout_layer import DecayingDropoutLayer -from .encoding_layer import EncodingLayer +from .semantic_composite_layer import EncodingLayer layer_dict = { "MatchingTensorLayer": MatchingTensorLayer, diff --git a/matchzoo/contrib/layers/encoding_layer.py b/matchzoo/contrib/layers/semantic_composite_layer.py similarity index 100% rename from matchzoo/contrib/layers/encoding_layer.py rename to matchzoo/contrib/layers/semantic_composite_layer.py diff --git a/matchzoo/contrib/models/diin.py b/matchzoo/contrib/models/diin.py index d7f8fcd1..52045b59 100644 --- a/matchzoo/contrib/models/diin.py +++ b/matchzoo/contrib/models/diin.py @@ -44,12 +44,8 @@ def get_default_params(cls) -> ParamTable: """:return: model default parameters.""" params = super().get_default_params(with_embedding=True) params['optimizer'] = 'adam' - params.add(Param(name='dropout_initial_keep_rate', value=1.0, - desc="The initial keep rate of decaying_dropout.")) params.add(Param(name='dropout_decay_interval', value=10000, desc="The decay interval of decaying_dropout.")) - params.add(Param(name='dropout_decay_rate', value=0.977, - desc="The decay rate of decaying_dropout.")) params.add(Param(name='char_embedding_input_dim', value=100, desc="The input dimension of character embedding " "layer.")) @@ -76,6 +72,18 @@ def get_default_params(cls) -> ParamTable: params.add(Param(name='transition_scale_down_ratio', value=0.5, desc="The channel scale down ratio of the " "convolution layer in transition block.")) + params.add(Param( + name='dropout_initial_keep_rate', value=1.0, + hyper_space=hyper_spaces.quniform( + low=0.8, high=1.0, q=0.02), + desc="The initial keep rate of decaying_dropout." + )) + params.add(Param( + name='dropout_decay_rate', value=0.97, + hyper_space=hyper_spaces.quniform( + low=0.90, high=0.99, q=0.01), + desc="The decay rate of decaying_dropout." + )) return params @classmethod @@ -143,21 +151,21 @@ def build(self): # R = 'input_right' sequence length # C = fixed word length + inputs = self._make_inputs() # Left text and right text. # shape = [B, L] # shape = [B, R] - text_left, text_right = self._make_inputs()[0:2] + text_left, text_right = inputs[0:2] # Left character and right character. # shape = [B, L, C] # shape = [B, R, C] - char_left, char_right = self._make_inputs()[2:4] + char_left, char_right = inputs[2:4] # Left exact match and right exact match. # shape = [B, L] # shape = [B, R] - match_left, match_right = self._make_inputs()[4:6] + match_left, match_right = inputs[4:6] # Embedding module - inputs = [] left_embeddings = [] right_embeddings = [] @@ -179,8 +187,6 @@ def build(self): )(right_word_embedding) left_embeddings.append(left_word_embedding) right_embeddings.append(right_word_embedding) - inputs.append(text_left) - inputs.append(text_right) # Exact match feature # shape = [B, L, 1] @@ -193,8 +199,6 @@ def build(self): )(match_right) left_embeddings.append(left_exact_match) right_embeddings.append(right_exact_match) - inputs.append(match_left) - inputs.append(match_right) # Char embedding feature char_embedding = self._make_char_embedding_layer() @@ -204,8 +208,6 @@ def build(self): right_char_embedding = char_embedding(char_right) left_embeddings.append(left_char_embedding) right_embeddings.append(right_char_embedding) - inputs.append(char_left) - inputs.append(char_right) # Concatenate left_embedding = keras.layers.Concatenate()(left_embeddings) diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py index 14b0a78e..b8c5a4af 100644 --- a/matchzoo/preprocessors/diin_preprocessor.py +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -16,9 +16,9 @@ class DIINPreprocessor(BasePreprocessor): """DIIN Model preprocessor.""" def __init__(self, - fixed_length_left: int = 32, - fixed_length_right: int = 32, - fixed_length_word: int = 16): + fixed_length_left: int = 10, + fixed_length_right: int = 10, + fixed_length_word: int = 5): """ DIIN Model preprocessor. From e0ccda6edb19a9a0616cf96d1455163ea56d9d51 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Fri, 17 May 2019 14:58:23 +0800 Subject: [PATCH 066/100] add bert uncased_vocab for examples --- .../datasets/bert_resources/uncased_vocab.txt | 30522 ++++++++++++++++ matchzoo/preprocessors/bert_preprocessor.py | 14 +- 2 files changed, 30529 insertions(+), 7 deletions(-) create mode 100644 matchzoo/datasets/bert_resources/uncased_vocab.txt diff --git a/matchzoo/datasets/bert_resources/uncased_vocab.txt b/matchzoo/datasets/bert_resources/uncased_vocab.txt new file mode 100644 index 00000000..fb140275 --- /dev/null +++ b/matchzoo/datasets/bert_resources/uncased_vocab.txt @@ -0,0 +1,30522 @@ +[PAD] +[unused0] +[unused1] +[unused2] +[unused3] +[unused4] +[unused5] +[unused6] +[unused7] +[unused8] +[unused9] +[unused10] +[unused11] +[unused12] +[unused13] +[unused14] +[unused15] +[unused16] +[unused17] +[unused18] +[unused19] +[unused20] +[unused21] +[unused22] +[unused23] +[unused24] +[unused25] +[unused26] +[unused27] +[unused28] +[unused29] +[unused30] +[unused31] +[unused32] +[unused33] +[unused34] +[unused35] +[unused36] +[unused37] +[unused38] +[unused39] +[unused40] +[unused41] +[unused42] +[unused43] +[unused44] +[unused45] +[unused46] +[unused47] +[unused48] +[unused49] +[unused50] +[unused51] +[unused52] +[unused53] +[unused54] +[unused55] +[unused56] +[unused57] +[unused58] +[unused59] +[unused60] +[unused61] +[unused62] +[unused63] +[unused64] +[unused65] +[unused66] +[unused67] +[unused68] +[unused69] +[unused70] +[unused71] +[unused72] +[unused73] +[unused74] +[unused75] +[unused76] +[unused77] +[unused78] +[unused79] +[unused80] +[unused81] +[unused82] +[unused83] +[unused84] +[unused85] +[unused86] +[unused87] +[unused88] +[unused89] +[unused90] +[unused91] +[unused92] +[unused93] +[unused94] +[unused95] +[unused96] +[unused97] +[unused98] +[UNK] +[CLS] +[SEP] +[MASK] +[unused99] +[unused100] +[unused101] +[unused102] +[unused103] +[unused104] +[unused105] +[unused106] +[unused107] +[unused108] +[unused109] +[unused110] +[unused111] +[unused112] +[unused113] +[unused114] +[unused115] +[unused116] +[unused117] +[unused118] +[unused119] +[unused120] +[unused121] +[unused122] +[unused123] +[unused124] +[unused125] +[unused126] +[unused127] +[unused128] +[unused129] +[unused130] +[unused131] +[unused132] +[unused133] +[unused134] +[unused135] +[unused136] +[unused137] +[unused138] +[unused139] +[unused140] +[unused141] +[unused142] +[unused143] +[unused144] +[unused145] +[unused146] +[unused147] +[unused148] +[unused149] +[unused150] +[unused151] +[unused152] +[unused153] +[unused154] +[unused155] +[unused156] +[unused157] +[unused158] +[unused159] +[unused160] +[unused161] +[unused162] +[unused163] +[unused164] +[unused165] +[unused166] +[unused167] +[unused168] +[unused169] +[unused170] +[unused171] +[unused172] +[unused173] +[unused174] +[unused175] +[unused176] +[unused177] +[unused178] +[unused179] +[unused180] +[unused181] +[unused182] +[unused183] +[unused184] +[unused185] +[unused186] +[unused187] +[unused188] +[unused189] +[unused190] +[unused191] +[unused192] +[unused193] +[unused194] +[unused195] +[unused196] +[unused197] +[unused198] +[unused199] +[unused200] +[unused201] +[unused202] +[unused203] +[unused204] +[unused205] +[unused206] +[unused207] +[unused208] +[unused209] +[unused210] +[unused211] +[unused212] +[unused213] +[unused214] +[unused215] +[unused216] +[unused217] +[unused218] +[unused219] +[unused220] +[unused221] +[unused222] +[unused223] +[unused224] +[unused225] +[unused226] +[unused227] +[unused228] +[unused229] +[unused230] +[unused231] +[unused232] +[unused233] +[unused234] +[unused235] +[unused236] +[unused237] +[unused238] +[unused239] +[unused240] +[unused241] +[unused242] +[unused243] +[unused244] +[unused245] +[unused246] +[unused247] +[unused248] +[unused249] +[unused250] +[unused251] +[unused252] +[unused253] +[unused254] +[unused255] +[unused256] +[unused257] +[unused258] +[unused259] +[unused260] +[unused261] +[unused262] +[unused263] +[unused264] +[unused265] +[unused266] +[unused267] +[unused268] +[unused269] +[unused270] +[unused271] +[unused272] +[unused273] +[unused274] +[unused275] +[unused276] +[unused277] +[unused278] +[unused279] +[unused280] +[unused281] +[unused282] +[unused283] +[unused284] +[unused285] +[unused286] +[unused287] +[unused288] +[unused289] +[unused290] +[unused291] +[unused292] +[unused293] +[unused294] +[unused295] +[unused296] +[unused297] +[unused298] +[unused299] +[unused300] +[unused301] +[unused302] +[unused303] +[unused304] +[unused305] +[unused306] +[unused307] +[unused308] +[unused309] +[unused310] +[unused311] +[unused312] +[unused313] +[unused314] +[unused315] +[unused316] +[unused317] +[unused318] +[unused319] +[unused320] +[unused321] +[unused322] +[unused323] +[unused324] +[unused325] +[unused326] +[unused327] +[unused328] +[unused329] +[unused330] +[unused331] +[unused332] +[unused333] +[unused334] +[unused335] +[unused336] +[unused337] +[unused338] +[unused339] +[unused340] +[unused341] +[unused342] +[unused343] +[unused344] +[unused345] +[unused346] +[unused347] +[unused348] +[unused349] +[unused350] +[unused351] +[unused352] +[unused353] +[unused354] +[unused355] +[unused356] +[unused357] +[unused358] +[unused359] +[unused360] +[unused361] +[unused362] +[unused363] +[unused364] +[unused365] +[unused366] +[unused367] +[unused368] +[unused369] +[unused370] +[unused371] +[unused372] +[unused373] +[unused374] +[unused375] +[unused376] +[unused377] +[unused378] +[unused379] +[unused380] +[unused381] +[unused382] +[unused383] +[unused384] +[unused385] +[unused386] +[unused387] +[unused388] +[unused389] +[unused390] +[unused391] +[unused392] +[unused393] +[unused394] +[unused395] +[unused396] +[unused397] +[unused398] +[unused399] +[unused400] +[unused401] +[unused402] +[unused403] +[unused404] +[unused405] +[unused406] +[unused407] +[unused408] +[unused409] +[unused410] +[unused411] +[unused412] +[unused413] +[unused414] +[unused415] +[unused416] +[unused417] +[unused418] +[unused419] +[unused420] +[unused421] +[unused422] +[unused423] +[unused424] +[unused425] +[unused426] +[unused427] +[unused428] +[unused429] +[unused430] +[unused431] +[unused432] +[unused433] +[unused434] +[unused435] +[unused436] +[unused437] +[unused438] +[unused439] +[unused440] +[unused441] +[unused442] +[unused443] +[unused444] +[unused445] +[unused446] +[unused447] +[unused448] +[unused449] +[unused450] +[unused451] +[unused452] +[unused453] +[unused454] +[unused455] +[unused456] +[unused457] +[unused458] +[unused459] +[unused460] +[unused461] +[unused462] +[unused463] +[unused464] +[unused465] +[unused466] +[unused467] +[unused468] +[unused469] +[unused470] +[unused471] +[unused472] +[unused473] +[unused474] +[unused475] +[unused476] +[unused477] +[unused478] +[unused479] +[unused480] +[unused481] +[unused482] +[unused483] +[unused484] +[unused485] +[unused486] +[unused487] +[unused488] +[unused489] +[unused490] +[unused491] +[unused492] +[unused493] +[unused494] +[unused495] +[unused496] +[unused497] +[unused498] +[unused499] +[unused500] +[unused501] +[unused502] +[unused503] +[unused504] +[unused505] +[unused506] +[unused507] +[unused508] +[unused509] +[unused510] +[unused511] +[unused512] +[unused513] +[unused514] +[unused515] +[unused516] +[unused517] +[unused518] +[unused519] +[unused520] +[unused521] +[unused522] +[unused523] +[unused524] +[unused525] +[unused526] +[unused527] +[unused528] +[unused529] +[unused530] +[unused531] +[unused532] +[unused533] +[unused534] +[unused535] +[unused536] +[unused537] +[unused538] +[unused539] +[unused540] +[unused541] +[unused542] +[unused543] +[unused544] +[unused545] +[unused546] +[unused547] +[unused548] +[unused549] +[unused550] +[unused551] +[unused552] +[unused553] +[unused554] +[unused555] +[unused556] +[unused557] +[unused558] +[unused559] +[unused560] +[unused561] +[unused562] +[unused563] +[unused564] +[unused565] +[unused566] +[unused567] +[unused568] +[unused569] +[unused570] +[unused571] +[unused572] +[unused573] +[unused574] +[unused575] +[unused576] +[unused577] +[unused578] +[unused579] +[unused580] +[unused581] +[unused582] +[unused583] +[unused584] +[unused585] +[unused586] +[unused587] +[unused588] +[unused589] +[unused590] +[unused591] +[unused592] +[unused593] +[unused594] +[unused595] +[unused596] +[unused597] +[unused598] +[unused599] +[unused600] +[unused601] +[unused602] +[unused603] +[unused604] +[unused605] +[unused606] +[unused607] +[unused608] +[unused609] +[unused610] +[unused611] +[unused612] +[unused613] +[unused614] +[unused615] +[unused616] +[unused617] +[unused618] +[unused619] +[unused620] +[unused621] +[unused622] +[unused623] +[unused624] +[unused625] +[unused626] +[unused627] +[unused628] +[unused629] +[unused630] +[unused631] +[unused632] +[unused633] +[unused634] +[unused635] +[unused636] +[unused637] +[unused638] +[unused639] +[unused640] +[unused641] +[unused642] +[unused643] +[unused644] +[unused645] +[unused646] +[unused647] +[unused648] +[unused649] +[unused650] +[unused651] +[unused652] +[unused653] +[unused654] +[unused655] +[unused656] +[unused657] +[unused658] +[unused659] +[unused660] +[unused661] +[unused662] +[unused663] +[unused664] +[unused665] +[unused666] +[unused667] +[unused668] +[unused669] +[unused670] +[unused671] +[unused672] +[unused673] +[unused674] +[unused675] +[unused676] +[unused677] +[unused678] +[unused679] +[unused680] +[unused681] +[unused682] +[unused683] +[unused684] +[unused685] +[unused686] +[unused687] +[unused688] +[unused689] +[unused690] +[unused691] +[unused692] +[unused693] +[unused694] +[unused695] +[unused696] +[unused697] +[unused698] +[unused699] +[unused700] +[unused701] +[unused702] +[unused703] +[unused704] +[unused705] +[unused706] +[unused707] +[unused708] +[unused709] +[unused710] +[unused711] +[unused712] +[unused713] +[unused714] +[unused715] +[unused716] +[unused717] +[unused718] +[unused719] +[unused720] +[unused721] +[unused722] +[unused723] +[unused724] +[unused725] +[unused726] +[unused727] +[unused728] +[unused729] +[unused730] +[unused731] +[unused732] +[unused733] +[unused734] +[unused735] +[unused736] +[unused737] +[unused738] +[unused739] +[unused740] +[unused741] +[unused742] +[unused743] +[unused744] +[unused745] +[unused746] +[unused747] +[unused748] +[unused749] +[unused750] +[unused751] +[unused752] +[unused753] +[unused754] +[unused755] +[unused756] +[unused757] +[unused758] +[unused759] +[unused760] +[unused761] +[unused762] +[unused763] +[unused764] +[unused765] +[unused766] +[unused767] +[unused768] +[unused769] +[unused770] +[unused771] +[unused772] +[unused773] +[unused774] +[unused775] +[unused776] +[unused777] +[unused778] +[unused779] +[unused780] +[unused781] +[unused782] +[unused783] +[unused784] +[unused785] +[unused786] +[unused787] +[unused788] +[unused789] +[unused790] +[unused791] +[unused792] +[unused793] +[unused794] +[unused795] +[unused796] +[unused797] +[unused798] +[unused799] +[unused800] +[unused801] +[unused802] +[unused803] +[unused804] +[unused805] +[unused806] +[unused807] +[unused808] +[unused809] +[unused810] +[unused811] +[unused812] +[unused813] +[unused814] +[unused815] +[unused816] +[unused817] +[unused818] +[unused819] +[unused820] +[unused821] +[unused822] +[unused823] +[unused824] +[unused825] +[unused826] +[unused827] +[unused828] +[unused829] +[unused830] +[unused831] +[unused832] +[unused833] +[unused834] +[unused835] +[unused836] +[unused837] +[unused838] +[unused839] +[unused840] +[unused841] +[unused842] +[unused843] +[unused844] +[unused845] +[unused846] +[unused847] +[unused848] +[unused849] +[unused850] +[unused851] +[unused852] +[unused853] +[unused854] +[unused855] +[unused856] +[unused857] +[unused858] +[unused859] +[unused860] +[unused861] +[unused862] +[unused863] +[unused864] +[unused865] +[unused866] +[unused867] +[unused868] +[unused869] +[unused870] +[unused871] +[unused872] +[unused873] +[unused874] +[unused875] +[unused876] +[unused877] +[unused878] +[unused879] +[unused880] +[unused881] +[unused882] +[unused883] +[unused884] +[unused885] +[unused886] +[unused887] +[unused888] +[unused889] +[unused890] +[unused891] +[unused892] +[unused893] +[unused894] +[unused895] +[unused896] +[unused897] +[unused898] +[unused899] +[unused900] +[unused901] +[unused902] +[unused903] +[unused904] +[unused905] +[unused906] +[unused907] +[unused908] +[unused909] +[unused910] +[unused911] +[unused912] +[unused913] +[unused914] +[unused915] +[unused916] +[unused917] +[unused918] +[unused919] +[unused920] +[unused921] +[unused922] +[unused923] +[unused924] +[unused925] +[unused926] +[unused927] +[unused928] +[unused929] +[unused930] +[unused931] +[unused932] +[unused933] +[unused934] +[unused935] +[unused936] +[unused937] +[unused938] +[unused939] +[unused940] +[unused941] +[unused942] +[unused943] +[unused944] +[unused945] +[unused946] +[unused947] +[unused948] +[unused949] +[unused950] +[unused951] +[unused952] +[unused953] +[unused954] +[unused955] +[unused956] +[unused957] +[unused958] +[unused959] +[unused960] +[unused961] +[unused962] +[unused963] +[unused964] +[unused965] +[unused966] +[unused967] +[unused968] +[unused969] +[unused970] +[unused971] +[unused972] +[unused973] +[unused974] +[unused975] +[unused976] +[unused977] +[unused978] +[unused979] +[unused980] +[unused981] +[unused982] +[unused983] +[unused984] +[unused985] +[unused986] +[unused987] +[unused988] +[unused989] +[unused990] +[unused991] +[unused992] +[unused993] +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +¡ +¢ +£ +¤ +¥ +¦ +§ +¨ +© +ª +« +¬ +® +° +± +² +³ +´ +µ +¶ +· +¹ +º +» +¼ +½ +¾ +¿ +× +ß +æ +ð +÷ +ø +þ +đ +ħ +ı +ł +ŋ +œ +ƒ +ɐ +ɑ +ɒ +ɔ +ɕ +ə +ɛ +ɡ +ɣ +ɨ +ɪ +ɫ +ɬ +ɯ +ɲ +ɴ +ɹ +ɾ +ʀ +ʁ +ʂ +ʃ +ʉ +ʊ +ʋ +ʌ +ʎ +ʐ +ʑ +ʒ +ʔ +ʰ +ʲ +ʳ +ʷ +ʸ +ʻ +ʼ +ʾ +ʿ +ˈ +ː +ˡ +ˢ +ˣ +ˤ +α +β +γ +δ +ε +ζ +η +θ +ι +κ +λ +μ +ν +ξ +ο +π +ρ +ς +σ +τ +υ +φ +χ +ψ +ω +а +б +в +г +д +е +ж +з +и +к +л +м +н +о +п +р +с +т +у +ф +х +ц +ч +ш +щ +ъ +ы +ь +э +ю +я +ђ +є +і +ј +љ +њ +ћ +ӏ +ա +բ +գ +դ +ե +թ +ի +լ +կ +հ +մ +յ +ն +ո +պ +ս +վ +տ +ր +ւ +ք +־ +א +ב +ג +ד +ה +ו +ז +ח +ט +י +ך +כ +ל +ם +מ +ן +נ +ס +ע +ף +פ +ץ +צ +ק +ר +ש +ת +، +ء +ا +ب +ة +ت +ث +ج +ح +خ +د +ذ +ر +ز +س +ش +ص +ض +ط +ظ +ع +غ +ـ +ف +ق +ك +ل +م +ن +ه +و +ى +ي +ٹ +پ +چ +ک +گ +ں +ھ +ہ +ی +ے +अ +आ +उ +ए +क +ख +ग +च +ज +ट +ड +ण +त +थ +द +ध +न +प +ब +भ +म +य +र +ल +व +श +ष +स +ह +ा +ि +ी +ो +। +॥ +ং +অ +আ +ই +উ +এ +ও +ক +খ +গ +চ +ছ +জ +ট +ড +ণ +ত +থ +দ +ধ +ন +প +ব +ভ +ম +য +র +ল +শ +ষ +স +হ +া +ি +ী +ে +க +ச +ட +த +ந +ன +ப +ம +ய +ர +ல +ள +வ +ா +ி +ு +ே +ை +ನ +ರ +ಾ +ක +ය +ර +ල +ව +ා +ก +ง +ต +ท +น +พ +ม +ย +ร +ล +ว +ส +อ +า +เ +་ +། +ག +ང +ད +ན +པ +བ +མ +འ +ར +ལ +ས +မ +ა +ბ +გ +დ +ე +ვ +თ +ი +კ +ლ +მ +ნ +ო +რ +ს +ტ +უ +ᄀ +ᄂ +ᄃ +ᄅ +ᄆ +ᄇ +ᄉ +ᄊ +ᄋ +ᄌ +ᄎ +ᄏ +ᄐ +ᄑ +ᄒ +ᅡ +ᅢ +ᅥ +ᅦ +ᅧ +ᅩ +ᅪ +ᅭ +ᅮ +ᅯ +ᅲ +ᅳ +ᅴ +ᅵ +ᆨ +ᆫ +ᆯ +ᆷ +ᆸ +ᆼ +ᴬ +ᴮ +ᴰ +ᴵ +ᴺ +ᵀ +ᵃ +ᵇ +ᵈ +ᵉ +ᵍ +ᵏ +ᵐ +ᵒ +ᵖ +ᵗ +ᵘ +ᵢ +ᵣ +ᵤ +ᵥ +ᶜ +ᶠ +‐ +‑ +‒ +– +— +― +‖ +‘ +’ +‚ +“ +” +„ +† +‡ +• +… +‰ +′ +″ +› +‿ +⁄ +⁰ +ⁱ +⁴ +⁵ +⁶ +⁷ +⁸ +⁹ +⁺ +⁻ +ⁿ +₀ +₁ +₂ +₃ +₄ +₅ +₆ +₇ +₈ +₉ +₊ +₍ +₎ +ₐ +ₑ +ₒ +ₓ +ₕ +ₖ +ₗ +ₘ +ₙ +ₚ +ₛ +ₜ +₤ +₩ +€ +₱ +₹ +ℓ +№ +ℝ +™ +⅓ +⅔ +← +↑ +→ +↓ +↔ +↦ +⇄ +⇌ +⇒ +∂ +∅ +∆ +∇ +∈ +− +∗ +∘ +√ +∞ +∧ +∨ +∩ +∪ +≈ +≡ +≤ +≥ +⊂ +⊆ +⊕ +⊗ +⋅ +─ +│ +■ +▪ +● +★ +☆ +☉ +♠ +♣ +♥ +♦ +♭ +♯ +⟨ +⟩ +ⱼ +⺩ +⺼ +⽥ +、 +。 +〈 +〉 +《 +》 +「 +」 +『 +』 +〜 +あ +い +う +え +お +か +き +く +け +こ +さ +し +す +せ +そ +た +ち +っ +つ +て +と +な +に +ぬ +ね +の +は +ひ +ふ +へ +ほ +ま +み +む +め +も +や +ゆ +よ +ら +り +る +れ +ろ +を +ん +ァ +ア +ィ +イ +ウ +ェ +エ +オ +カ +キ +ク +ケ +コ +サ +シ +ス +セ +タ +チ +ッ +ツ +テ +ト +ナ +ニ +ノ +ハ +ヒ +フ +ヘ +ホ +マ +ミ +ム +メ +モ +ャ +ュ +ョ +ラ +リ +ル +レ +ロ +ワ +ン +・ +ー +一 +三 +上 +下 +不 +世 +中 +主 +久 +之 +也 +事 +二 +五 +井 +京 +人 +亻 +仁 +介 +代 +仮 +伊 +会 +佐 +侍 +保 +信 +健 +元 +光 +八 +公 +内 +出 +分 +前 +劉 +力 +加 +勝 +北 +区 +十 +千 +南 +博 +原 +口 +古 +史 +司 +合 +吉 +同 +名 +和 +囗 +四 +国 +國 +土 +地 +坂 +城 +堂 +場 +士 +夏 +外 +大 +天 +太 +夫 +奈 +女 +子 +学 +宀 +宇 +安 +宗 +定 +宣 +宮 +家 +宿 +寺 +將 +小 +尚 +山 +岡 +島 +崎 +川 +州 +巿 +帝 +平 +年 +幸 +广 +弘 +張 +彳 +後 +御 +德 +心 +忄 +志 +忠 +愛 +成 +我 +戦 +戸 +手 +扌 +政 +文 +新 +方 +日 +明 +星 +春 +昭 +智 +曲 +書 +月 +有 +朝 +木 +本 +李 +村 +東 +松 +林 +森 +楊 +樹 +橋 +歌 +止 +正 +武 +比 +氏 +民 +水 +氵 +氷 +永 +江 +沢 +河 +治 +法 +海 +清 +漢 +瀬 +火 +版 +犬 +王 +生 +田 +男 +疒 +発 +白 +的 +皇 +目 +相 +省 +真 +石 +示 +社 +神 +福 +禾 +秀 +秋 +空 +立 +章 +竹 +糹 +美 +義 +耳 +良 +艹 +花 +英 +華 +葉 +藤 +行 +街 +西 +見 +訁 +語 +谷 +貝 +貴 +車 +軍 +辶 +道 +郎 +郡 +部 +都 +里 +野 +金 +鈴 +镇 +長 +門 +間 +阝 +阿 +陳 +陽 +雄 +青 +面 +風 +食 +香 +馬 +高 +龍 +龸 +fi +fl +! +( +) +, +- +. +/ +: +? +~ +the +of +and +in +to +was +he +is +as +for +on +with +that +it +his +by +at +from +her +##s +she +you +had +an +were +but +be +this +are +not +my +they +one +which +or +have +him +me +first +all +also +their +has +up +who +out +been +when +after +there +into +new +two +its +##a +time +would +no +what +about +said +we +over +then +other +so +more +##e +can +if +like +back +them +only +some +could +##i +where +just +##ing +during +before +##n +do +##o +made +school +through +than +now +years +most +world +may +between +down +well +three +##d +year +while +will +##ed +##r +##y +later +##t +city +under +around +did +such +being +used +state +people +part +know +against +your +many +second +university +both +national +##er +these +don +known +off +way +until +re +how +even +get +head +... +didn +##ly +team +american +because +de +##l +born +united +film +since +still +long +work +south +us +became +any +high +again +day +family +see +right +man +eyes +house +season +war +states +including +took +life +north +same +each +called +name +much +place +however +go +four +group +another +found +won +area +here +going +10 +away +series +left +home +music +best +make +hand +number +company +several +never +last +john +000 +very +album +take +end +good +too +following +released +game +played +little +began +district +##m +old +want +those +side +held +own +early +county +ll +league +use +west +##u +face +think +##es +2010 +government +##h +march +came +small +general +town +june +##on +line +based +something +##k +september +thought +looked +along +international +2011 +air +july +club +went +january +october +our +august +april +york +12 +few +2012 +2008 +east +show +member +college +2009 +father +public +##us +come +men +five +set +station +church +##c +next +former +november +room +party +located +december +2013 +age +got +2007 +##g +system +let +love +2006 +though +every +2014 +look +song +water +century +without +body +black +night +within +great +women +single +ve +building +large +population +river +named +band +white +started +##an +once +15 +20 +should +18 +2015 +service +top +built +british +open +death +king +moved +local +times +children +february +book +why +11 +door +need +president +order +final +road +wasn +although +due +major +died +village +third +knew +2016 +asked +turned +st +wanted +say +##p +together +received +main +son +served +different +##en +behind +himself +felt +members +power +football +law +voice +play +##in +near +park +history +30 +having +2005 +16 +##man +saw +mother +##al +army +point +front +help +english +street +art +late +hands +games +award +##ia +young +14 +put +published +country +division +across +told +13 +often +ever +french +london +center +six +red +2017 +led +days +include +light +25 +find +tell +among +species +really +according +central +half +2004 +form +original +gave +office +making +enough +lost +full +opened +must +included +live +given +german +player +run +business +woman +community +cup +might +million +land +2000 +court +development +17 +short +round +ii +km +seen +class +story +always +become +sure +research +almost +director +council +la +##2 +career +things +using +island +##z +couldn +car +##is +24 +close +force +##1 +better +free +support +control +field +students +2003 +education +married +##b +nothing +worked +others +record +big +inside +level +anything +continued +give +james +##3 +military +established +non +returned +feel +does +title +written +thing +feet +william +far +co +association +hard +already +2002 +##ra +championship +human +western +100 +##na +department +hall +role +various +production +21 +19 +heart +2001 +living +fire +version +##ers +##f +television +royal +##4 +produced +working +act +case +society +region +present +radio +period +looking +least +total +keep +england +wife +program +per +brother +mind +special +22 +##le +am +works +soon +##6 +political +george +services +taken +created +##7 +further +able +reached +david +union +joined +upon +done +important +social +information +either +##ic +##x +appeared +position +ground +lead +rock +dark +election +23 +board +france +hair +course +arms +site +police +girl +instead +real +sound +##v +words +moment +##te +someone +##8 +summer +project +announced +san +less +wrote +past +followed +##5 +blue +founded +al +finally +india +taking +records +america +##ne +1999 +design +considered +northern +god +stop +battle +toward +european +outside +described +track +today +playing +language +28 +call +26 +heard +professional +low +australia +miles +california +win +yet +green +##ie +trying +blood +##ton +southern +science +maybe +everything +match +square +27 +mouth +video +race +recorded +leave +above +##9 +daughter +points +space +1998 +museum +change +middle +common +##0 +move +tv +post +##ta +lake +seven +tried +elected +closed +ten +paul +minister +##th +months +start +chief +return +canada +person +sea +release +similar +modern +brought +rest +hit +formed +mr +##la +1997 +floor +event +doing +thomas +1996 +robert +care +killed +training +star +week +needed +turn +finished +railway +rather +news +health +sent +example +ran +term +michael +coming +currently +yes +forces +despite +gold +areas +50 +stage +fact +29 +dead +says +popular +2018 +originally +germany +probably +developed +result +pulled +friend +stood +money +running +mi +signed +word +songs +child +eventually +met +tour +average +teams +minutes +festival +current +deep +kind +1995 +decided +usually +eastern +seemed +##ness +episode +bed +added +table +indian +private +charles +route +available +idea +throughout +centre +addition +appointed +style +1994 +books +eight +construction +press +mean +wall +friends +remained +schools +study +##ch +##um +institute +oh +chinese +sometimes +events +possible +1992 +australian +type +brown +forward +talk +process +food +debut +seat +performance +committee +features +character +arts +herself +else +lot +strong +russian +range +hours +peter +arm +##da +morning +dr +sold +##ry +quickly +directed +1993 +guitar +china +##w +31 +list +##ma +performed +media +uk +players +smile +##rs +myself +40 +placed +coach +province +towards +wouldn +leading +whole +boy +official +designed +grand +census +##el +europe +attack +japanese +henry +1991 +##re +##os +cross +getting +alone +action +lower +network +wide +washington +japan +1990 +hospital +believe +changed +sister +##ar +hold +gone +sir +hadn +ship +##ka +studies +academy +shot +rights +below +base +bad +involved +kept +largest +##ist +bank +future +especially +beginning +mark +movement +section +female +magazine +plan +professor +lord +longer +##ian +sat +walked +hill +actually +civil +energy +model +families +size +thus +aircraft +completed +includes +data +captain +##or +fight +vocals +featured +richard +bridge +fourth +1989 +officer +stone +hear +##ism +means +medical +groups +management +self +lips +competition +entire +lived +technology +leaving +federal +tournament +bit +passed +hot +independent +awards +kingdom +mary +spent +fine +doesn +reported +##ling +jack +fall +raised +itself +stay +true +studio +1988 +sports +replaced +paris +systems +saint +leader +theatre +whose +market +capital +parents +spanish +canadian +earth +##ity +cut +degree +writing +bay +christian +awarded +natural +higher +bill +##as +coast +provided +previous +senior +ft +valley +organization +stopped +onto +countries +parts +conference +queen +security +interest +saying +allowed +master +earlier +phone +matter +smith +winning +try +happened +moving +campaign +los +##ley +breath +nearly +mid +1987 +certain +girls +date +italian +african +standing +fell +artist +##ted +shows +deal +mine +industry +1986 +##ng +everyone +republic +provide +collection +library +student +##ville +primary +owned +older +via +heavy +1st +makes +##able +attention +anyone +africa +##ri +stated +length +ended +fingers +command +staff +skin +foreign +opening +governor +okay +medal +kill +sun +cover +job +1985 +introduced +chest +hell +feeling +##ies +success +meet +reason +standard +meeting +novel +1984 +trade +source +buildings +##land +rose +guy +goal +##ur +chapter +native +husband +previously +unit +limited +entered +weeks +producer +operations +mountain +takes +covered +forced +related +roman +complete +successful +key +texas +cold +##ya +channel +1980 +traditional +films +dance +clear +approximately +500 +nine +van +prince +question +active +tracks +ireland +regional +silver +author +personal +sense +operation +##ine +economic +1983 +holding +twenty +isbn +additional +speed +hour +edition +regular +historic +places +whom +shook +movie +km² +secretary +prior +report +chicago +read +foundation +view +engine +scored +1982 +units +ask +airport +property +ready +immediately +lady +month +listed +contract +##de +manager +themselves +lines +##ki +navy +writer +meant +##ts +runs +##ro +practice +championships +singer +glass +commission +required +forest +starting +culture +generally +giving +access +attended +test +couple +stand +catholic +martin +caught +executive +##less +eye +##ey +thinking +chair +quite +shoulder +1979 +hope +decision +plays +defeated +municipality +whether +structure +offered +slowly +pain +ice +direction +##ion +paper +mission +1981 +mostly +200 +noted +individual +managed +nature +lives +plant +##ha +helped +except +studied +computer +figure +relationship +issue +significant +loss +die +smiled +gun +ago +highest +1972 +##am +male +bring +goals +mexico +problem +distance +commercial +completely +location +annual +famous +drive +1976 +neck +1978 +surface +caused +italy +understand +greek +highway +wrong +hotel +comes +appearance +joseph +double +issues +musical +companies +castle +income +review +assembly +bass +initially +parliament +artists +experience +1974 +particular +walk +foot +engineering +talking +window +dropped +##ter +miss +baby +boys +break +1975 +stars +edge +remember +policy +carried +train +stadium +bar +sex +angeles +evidence +##ge +becoming +assistant +soviet +1977 +upper +step +wing +1970 +youth +financial +reach +##ll +actor +numerous +##se +##st +nodded +arrived +##ation +minute +##nt +believed +sorry +complex +beautiful +victory +associated +temple +1968 +1973 +chance +perhaps +metal +##son +1945 +bishop +##et +lee +launched +particularly +tree +le +retired +subject +prize +contains +yeah +theory +empire +##ce +suddenly +waiting +trust +recording +##to +happy +terms +camp +champion +1971 +religious +pass +zealand +names +2nd +port +ancient +tom +corner +represented +watch +legal +anti +justice +cause +watched +brothers +45 +material +changes +simply +response +louis +fast +##ting +answer +60 +historical +1969 +stories +straight +create +feature +increased +rate +administration +virginia +el +activities +cultural +overall +winner +programs +basketball +legs +guard +beyond +cast +doctor +mm +flight +results +remains +cost +effect +winter +##ble +larger +islands +problems +chairman +grew +commander +isn +1967 +pay +failed +selected +hurt +fort +box +regiment +majority +journal +35 +edward +plans +##ke +##ni +shown +pretty +irish +characters +directly +scene +likely +operated +allow +spring +##j +junior +matches +looks +mike +houses +fellow +##tion +beach +marriage +##ham +##ive +rules +oil +65 +florida +expected +nearby +congress +sam +peace +recent +iii +wait +subsequently +cell +##do +variety +serving +agreed +please +poor +joe +pacific +attempt +wood +democratic +piece +prime +##ca +rural +mile +touch +appears +township +1964 +1966 +soldiers +##men +##ized +1965 +pennsylvania +closer +fighting +claimed +score +jones +physical +editor +##ous +filled +genus +specific +sitting +super +mom +##va +therefore +supported +status +fear +cases +store +meaning +wales +minor +spain +tower +focus +vice +frank +follow +parish +separate +golden +horse +fifth +remaining +branch +32 +presented +stared +##id +uses +secret +forms +##co +baseball +exactly +##ck +choice +note +discovered +travel +composed +truth +russia +ball +color +kiss +dad +wind +continue +ring +referred +numbers +digital +greater +##ns +metres +slightly +direct +increase +1960 +responsible +crew +rule +trees +troops +##no +broke +goes +individuals +hundred +weight +creek +sleep +memory +defense +provides +ordered +code +value +jewish +windows +1944 +safe +judge +whatever +corps +realized +growing +pre +##ga +cities +alexander +gaze +lies +spread +scott +letter +showed +situation +mayor +transport +watching +workers +extended +##li +expression +normal +##ment +chart +multiple +border +##ba +host +##ner +daily +mrs +walls +piano +##ko +heat +cannot +##ate +earned +products +drama +era +authority +seasons +join +grade +##io +sign +difficult +machine +1963 +territory +mainly +##wood +stations +squadron +1962 +stepped +iron +19th +##led +serve +appear +sky +speak +broken +charge +knowledge +kilometres +removed +ships +article +campus +simple +##ty +pushed +britain +##ve +leaves +recently +cd +soft +boston +latter +easy +acquired +poland +##sa +quality +officers +presence +planned +nations +mass +broadcast +jean +share +image +influence +wild +offer +emperor +electric +reading +headed +ability +promoted +yellow +ministry +1942 +throat +smaller +politician +##by +latin +spoke +cars +williams +males +lack +pop +80 +##ier +acting +seeing +consists +##ti +estate +1961 +pressure +johnson +newspaper +jr +chris +olympics +online +conditions +beat +elements +walking +vote +##field +needs +carolina +text +featuring +global +block +shirt +levels +francisco +purpose +females +et +dutch +duke +ahead +gas +twice +safety +serious +turning +highly +lieutenant +firm +maria +amount +mixed +daniel +proposed +perfect +agreement +affairs +3rd +seconds +contemporary +paid +1943 +prison +save +kitchen +label +administrative +intended +constructed +academic +nice +teacher +races +1956 +formerly +corporation +ben +nation +issued +shut +1958 +drums +housing +victoria +seems +opera +1959 +graduated +function +von +mentioned +picked +build +recognized +shortly +protection +picture +notable +exchange +elections +1980s +loved +percent +racing +fish +elizabeth +garden +volume +hockey +1941 +beside +settled +##ford +1940 +competed +replied +drew +1948 +actress +marine +scotland +steel +glanced +farm +steve +1957 +risk +tonight +positive +magic +singles +effects +gray +screen +dog +##ja +residents +bus +sides +none +secondary +literature +polish +destroyed +flying +founder +households +1939 +lay +reserve +usa +gallery +##ler +1946 +industrial +younger +approach +appearances +urban +ones +1950 +finish +avenue +powerful +fully +growth +page +honor +jersey +projects +advanced +revealed +basic +90 +infantry +pair +equipment +visit +33 +evening +search +grant +effort +solo +treatment +buried +republican +primarily +bottom +owner +1970s +israel +gives +jim +dream +bob +remain +spot +70 +notes +produce +champions +contact +ed +soul +accepted +ways +del +##ally +losing +split +price +capacity +basis +trial +questions +##ina +1955 +20th +guess +officially +memorial +naval +initial +##ization +whispered +median +engineer +##ful +sydney +##go +columbia +strength +300 +1952 +tears +senate +00 +card +asian +agent +1947 +software +44 +draw +warm +supposed +com +pro +##il +transferred +leaned +##at +candidate +escape +mountains +asia +potential +activity +entertainment +seem +traffic +jackson +murder +36 +slow +product +orchestra +haven +agency +bbc +taught +website +comedy +unable +storm +planning +albums +rugby +environment +scientific +grabbed +protect +##hi +boat +typically +1954 +1953 +damage +principal +divided +dedicated +mount +ohio +##berg +pick +fought +driver +##der +empty +shoulders +sort +thank +berlin +prominent +account +freedom +necessary +efforts +alex +headquarters +follows +alongside +des +simon +andrew +suggested +operating +learning +steps +1949 +sweet +technical +begin +easily +34 +teeth +speaking +settlement +scale +##sh +renamed +ray +max +enemy +semi +joint +compared +##rd +scottish +leadership +analysis +offers +georgia +pieces +captured +animal +deputy +guest +organized +##lin +tony +combined +method +challenge +1960s +huge +wants +battalion +sons +rise +crime +types +facilities +telling +path +1951 +platform +sit +1990s +##lo +tells +assigned +rich +pull +##ot +commonly +alive +##za +letters +concept +conducted +wearing +happen +bought +becomes +holy +gets +ocean +defeat +languages +purchased +coffee +occurred +titled +##q +declared +applied +sciences +concert +sounds +jazz +brain +##me +painting +fleet +tax +nick +##ius +michigan +count +animals +leaders +episodes +##line +content +##den +birth +##it +clubs +64 +palace +critical +refused +fair +leg +laughed +returning +surrounding +participated +formation +lifted +pointed +connected +rome +medicine +laid +taylor +santa +powers +adam +tall +shared +focused +knowing +yards +entrance +falls +##wa +calling +##ad +sources +chosen +beneath +resources +yard +##ite +nominated +silence +zone +defined +##que +gained +thirty +38 +bodies +moon +##ard +adopted +christmas +widely +register +apart +iran +premier +serves +du +unknown +parties +##les +generation +##ff +continues +quick +fields +brigade +quiet +teaching +clothes +impact +weapons +partner +flat +theater +supreme +1938 +37 +relations +##tor +plants +suffered +1936 +wilson +kids +begins +##age +1918 +seats +armed +internet +models +worth +laws +400 +communities +classes +background +knows +thanks +quarter +reaching +humans +carry +killing +format +kong +hong +setting +75 +architecture +disease +railroad +inc +possibly +wish +arthur +thoughts +harry +doors +density +##di +crowd +illinois +stomach +tone +unique +reports +anyway +##ir +liberal +der +vehicle +thick +dry +drug +faced +largely +facility +theme +holds +creation +strange +colonel +##mi +revolution +bell +politics +turns +silent +rail +relief +independence +combat +shape +write +determined +sales +learned +4th +finger +oxford +providing +1937 +heritage +fiction +situated +designated +allowing +distribution +hosted +##est +sight +interview +estimated +reduced +##ria +toronto +footballer +keeping +guys +damn +claim +motion +sport +sixth +stayed +##ze +en +rear +receive +handed +twelve +dress +audience +granted +brazil +##well +spirit +##ated +noticed +etc +olympic +representative +eric +tight +trouble +reviews +drink +vampire +missing +roles +ranked +newly +household +finals +wave +critics +##ee +phase +massachusetts +pilot +unlike +philadelphia +bright +guns +crown +organizations +roof +42 +respectively +clearly +tongue +marked +circle +fox +korea +bronze +brian +expanded +sexual +supply +yourself +inspired +labour +fc +##ah +reference +vision +draft +connection +brand +reasons +1935 +classic +driving +trip +jesus +cells +entry +1920 +neither +trail +claims +atlantic +orders +labor +nose +afraid +identified +intelligence +calls +cancer +attacked +passing +stephen +positions +imperial +grey +jason +39 +sunday +48 +swedish +avoid +extra +uncle +message +covers +allows +surprise +materials +fame +hunter +##ji +1930 +citizens +figures +davis +environmental +confirmed +shit +titles +di +performing +difference +acts +attacks +##ov +existing +votes +opportunity +nor +shop +entirely +trains +opposite +pakistan +##pa +develop +resulted +representatives +actions +reality +pressed +##ish +barely +wine +conversation +faculty +northwest +ends +documentary +nuclear +stock +grace +sets +eat +alternative +##ps +bag +resulting +creating +surprised +cemetery +1919 +drop +finding +sarah +cricket +streets +tradition +ride +1933 +exhibition +target +ear +explained +rain +composer +injury +apartment +municipal +educational +occupied +netherlands +clean +billion +constitution +learn +1914 +maximum +classical +francis +lose +opposition +jose +ontario +bear +core +hills +rolled +ending +drawn +permanent +fun +##tes +##lla +lewis +sites +chamber +ryan +##way +scoring +height +1934 +##house +lyrics +staring +55 +officials +1917 +snow +oldest +##tic +orange +##ger +qualified +interior +apparently +succeeded +thousand +dinner +lights +existence +fans +heavily +41 +greatest +conservative +send +bowl +plus +enter +catch +##un +economy +duty +1929 +speech +authorities +princess +performances +versions +shall +graduate +pictures +effective +remembered +poetry +desk +crossed +starring +starts +passenger +sharp +##ant +acres +ass +weather +falling +rank +fund +supporting +check +adult +publishing +heads +cm +southeast +lane +##burg +application +bc +##ura +les +condition +transfer +prevent +display +ex +regions +earl +federation +cool +relatively +answered +besides +1928 +obtained +portion +##town +mix +##ding +reaction +liked +dean +express +peak +1932 +##tte +counter +religion +chain +rare +miller +convention +aid +lie +vehicles +mobile +perform +squad +wonder +lying +crazy +sword +##ping +attempted +centuries +weren +philosophy +category +##ize +anna +interested +47 +sweden +wolf +frequently +abandoned +kg +literary +alliance +task +entitled +##ay +threw +promotion +factory +tiny +soccer +visited +matt +fm +achieved +52 +defence +internal +persian +43 +methods +##ging +arrested +otherwise +cambridge +programming +villages +elementary +districts +rooms +criminal +conflict +worry +trained +1931 +attempts +waited +signal +bird +truck +subsequent +programme +##ol +ad +49 +communist +details +faith +sector +patrick +carrying +laugh +##ss +controlled +korean +showing +origin +fuel +evil +1927 +##ent +brief +identity +darkness +address +pool +missed +publication +web +planet +ian +anne +wings +invited +##tt +briefly +standards +kissed +##be +ideas +climate +causing +walter +worse +albert +articles +winners +desire +aged +northeast +dangerous +gate +doubt +1922 +wooden +multi +##ky +poet +rising +funding +46 +communications +communication +violence +copies +prepared +ford +investigation +skills +1924 +pulling +electronic +##ak +##ial +##han +containing +ultimately +offices +singing +understanding +restaurant +tomorrow +fashion +christ +ward +da +pope +stands +5th +flow +studios +aired +commissioned +contained +exist +fresh +americans +##per +wrestling +approved +kid +employed +respect +suit +1925 +angel +asking +increasing +frame +angry +selling +1950s +thin +finds +##nd +temperature +statement +ali +explain +inhabitants +towns +extensive +narrow +51 +jane +flowers +images +promise +somewhere +object +fly +closely +##ls +1912 +bureau +cape +1926 +weekly +presidential +legislative +1921 +##ai +##au +launch +founding +##ny +978 +##ring +artillery +strike +un +institutions +roll +writers +landing +chose +kevin +anymore +pp +##ut +attorney +fit +dan +billboard +receiving +agricultural +breaking +sought +dave +admitted +lands +mexican +##bury +charlie +specifically +hole +iv +howard +credit +moscow +roads +accident +1923 +proved +wear +struck +hey +guards +stuff +slid +expansion +1915 +cat +anthony +##kin +melbourne +opposed +sub +southwest +architect +failure +plane +1916 +##ron +map +camera +tank +listen +regarding +wet +introduction +metropolitan +link +ep +fighter +inch +grown +gene +anger +fixed +buy +dvd +khan +domestic +worldwide +chapel +mill +functions +examples +##head +developing +1910 +turkey +hits +pocket +antonio +papers +grow +unless +circuit +18th +concerned +attached +journalist +selection +journey +converted +provincial +painted +hearing +aren +bands +negative +aside +wondered +knight +lap +survey +ma +##ow +noise +billy +##ium +shooting +guide +bedroom +priest +resistance +motor +homes +sounded +giant +##mer +150 +scenes +equal +comic +patients +hidden +solid +actual +bringing +afternoon +touched +funds +wedding +consisted +marie +canal +sr +kim +treaty +turkish +recognition +residence +cathedral +broad +knees +incident +shaped +fired +norwegian +handle +cheek +contest +represent +##pe +representing +beauty +##sen +birds +advantage +emergency +wrapped +drawing +notice +pink +broadcasting +##ong +somehow +bachelor +seventh +collected +registered +establishment +alan +assumed +chemical +personnel +roger +retirement +jeff +portuguese +wore +tied +device +threat +progress +advance +##ised +banks +hired +manchester +nfl +teachers +structures +forever +##bo +tennis +helping +saturday +sale +applications +junction +hip +incorporated +neighborhood +dressed +ceremony +##ds +influenced +hers +visual +stairs +decades +inner +kansas +hung +hoped +gain +scheduled +downtown +engaged +austria +clock +norway +certainly +pale +protected +1913 +victor +employees +plate +putting +surrounded +##ists +finishing +blues +tropical +##ries +minnesota +consider +philippines +accept +54 +retrieved +1900 +concern +anderson +properties +institution +gordon +successfully +vietnam +##dy +backing +outstanding +muslim +crossing +folk +producing +usual +demand +occurs +observed +lawyer +educated +##ana +kelly +string +pleasure +budget +items +quietly +colorado +philip +typical +##worth +derived +600 +survived +asks +mental +##ide +56 +jake +jews +distinguished +ltd +1911 +sri +extremely +53 +athletic +loud +thousands +worried +shadow +transportation +horses +weapon +arena +importance +users +tim +objects +contributed +dragon +douglas +aware +senator +johnny +jordan +sisters +engines +flag +investment +samuel +shock +capable +clark +row +wheel +refers +session +familiar +biggest +wins +hate +maintained +drove +hamilton +request +expressed +injured +underground +churches +walker +wars +tunnel +passes +stupid +agriculture +softly +cabinet +regarded +joining +indiana +##ea +##ms +push +dates +spend +behavior +woods +protein +gently +chase +morgan +mention +burning +wake +combination +occur +mirror +leads +jimmy +indeed +impossible +singapore +paintings +covering +##nes +soldier +locations +attendance +sell +historian +wisconsin +invasion +argued +painter +diego +changing +egypt +##don +experienced +inches +##ku +missouri +vol +grounds +spoken +switzerland +##gan +reform +rolling +ha +forget +massive +resigned +burned +allen +tennessee +locked +values +improved +##mo +wounded +universe +sick +dating +facing +pack +purchase +user +##pur +moments +##ul +merged +anniversary +1908 +coal +brick +understood +causes +dynasty +queensland +establish +stores +crisis +promote +hoping +views +cards +referee +extension +##si +raise +arizona +improve +colonial +formal +charged +##rt +palm +lucky +hide +rescue +faces +95 +feelings +candidates +juan +##ell +goods +6th +courses +weekend +59 +luke +cash +fallen +##om +delivered +affected +installed +carefully +tries +swiss +hollywood +costs +lincoln +responsibility +##he +shore +file +proper +normally +maryland +assistance +jump +constant +offering +friendly +waters +persons +realize +contain +trophy +800 +partnership +factor +58 +musicians +cry +bound +oregon +indicated +hero +houston +medium +##ure +consisting +somewhat +##ara +57 +cycle +##che +beer +moore +frederick +gotten +eleven +worst +weak +approached +arranged +chin +loan +universal +bond +fifteen +pattern +disappeared +##ney +translated +##zed +lip +arab +capture +interests +insurance +##chi +shifted +cave +prix +warning +sections +courts +coat +plot +smell +feed +golf +favorite +maintain +knife +vs +voted +degrees +finance +quebec +opinion +translation +manner +ruled +operate +productions +choose +musician +discovery +confused +tired +separated +stream +techniques +committed +attend +ranking +kings +throw +passengers +measure +horror +fan +mining +sand +danger +salt +calm +decade +dam +require +runner +##ik +rush +associate +greece +##ker +rivers +consecutive +matthew +##ski +sighed +sq +documents +steam +edited +closing +tie +accused +1905 +##ini +islamic +distributed +directors +organisation +bruce +7th +breathing +mad +lit +arrival +concrete +taste +08 +composition +shaking +faster +amateur +adjacent +stating +1906 +twin +flew +##ran +tokyo +publications +##tone +obviously +ridge +storage +1907 +carl +pages +concluded +desert +driven +universities +ages +terminal +sequence +borough +250 +constituency +creative +cousin +economics +dreams +margaret +notably +reduce +montreal +mode +17th +ears +saved +jan +vocal +##ica +1909 +andy +##jo +riding +roughly +threatened +##ise +meters +meanwhile +landed +compete +repeated +grass +czech +regularly +charges +tea +sudden +appeal +##ung +solution +describes +pierre +classification +glad +parking +##ning +belt +physics +99 +rachel +add +hungarian +participate +expedition +damaged +gift +childhood +85 +fifty +##red +mathematics +jumped +letting +defensive +mph +##ux +##gh +testing +##hip +hundreds +shoot +owners +matters +smoke +israeli +kentucky +dancing +mounted +grandfather +emma +designs +profit +argentina +##gs +truly +li +lawrence +cole +begun +detroit +willing +branches +smiling +decide +miami +enjoyed +recordings +##dale +poverty +ethnic +gay +##bi +gary +arabic +09 +accompanied +##one +##ons +fishing +determine +residential +acid +##ary +alice +returns +starred +mail +##ang +jonathan +strategy +##ue +net +forty +cook +businesses +equivalent +commonwealth +distinct +ill +##cy +seriously +##ors +##ped +shift +harris +replace +rio +imagine +formula +ensure +##ber +additionally +scheme +conservation +occasionally +purposes +feels +favor +##and +##ore +1930s +contrast +hanging +hunt +movies +1904 +instruments +victims +danish +christopher +busy +demon +sugar +earliest +colony +studying +balance +duties +##ks +belgium +slipped +carter +05 +visible +stages +iraq +fifa +##im +commune +forming +zero +07 +continuing +talked +counties +legend +bathroom +option +tail +clay +daughters +afterwards +severe +jaw +visitors +##ded +devices +aviation +russell +kate +##vi +entering +subjects +##ino +temporary +swimming +forth +smooth +ghost +audio +bush +operates +rocks +movements +signs +eddie +##tz +ann +voices +honorary +06 +memories +dallas +pure +measures +racial +promised +66 +harvard +ceo +16th +parliamentary +indicate +benefit +flesh +dublin +louisiana +1902 +1901 +patient +sleeping +1903 +membership +coastal +medieval +wanting +element +scholars +rice +62 +limit +survive +makeup +rating +definitely +collaboration +obvious +##tan +boss +ms +baron +birthday +linked +soil +diocese +##lan +ncaa +##mann +offensive +shell +shouldn +waist +##tus +plain +ross +organ +resolution +manufacturing +adding +relative +kennedy +98 +whilst +moth +marketing +gardens +crash +72 +heading +partners +credited +carlos +moves +cable +##zi +marshall +##out +depending +bottle +represents +rejected +responded +existed +04 +jobs +denmark +lock +##ating +treated +graham +routes +talent +commissioner +drugs +secure +tests +reign +restored +photography +##gi +contributions +oklahoma +designer +disc +grin +seattle +robin +paused +atlanta +unusual +##gate +praised +las +laughing +satellite +hungary +visiting +##sky +interesting +factors +deck +poems +norman +##water +stuck +speaker +rifle +domain +premiered +##her +dc +comics +actors +01 +reputation +eliminated +8th +ceiling +prisoners +script +##nce +leather +austin +mississippi +rapidly +admiral +parallel +charlotte +guilty +tools +gender +divisions +fruit +##bs +laboratory +nelson +fantasy +marry +rapid +aunt +tribe +requirements +aspects +suicide +amongst +adams +bone +ukraine +abc +kick +sees +edinburgh +clothing +column +rough +gods +hunting +broadway +gathered +concerns +##ek +spending +ty +12th +snapped +requires +solar +bones +cavalry +##tta +iowa +drinking +waste +index +franklin +charity +thompson +stewart +tip +flash +landscape +friday +enjoy +singh +poem +listening +##back +eighth +fred +differences +adapted +bomb +ukrainian +surgery +corporate +masters +anywhere +##more +waves +odd +sean +portugal +orleans +dick +debate +kent +eating +puerto +cleared +96 +expect +cinema +97 +guitarist +blocks +electrical +agree +involving +depth +dying +panel +struggle +##ged +peninsula +adults +novels +emerged +vienna +metro +debuted +shoes +tamil +songwriter +meets +prove +beating +instance +heaven +scared +sending +marks +artistic +passage +superior +03 +significantly +shopping +##tive +retained +##izing +malaysia +technique +cheeks +##ola +warren +maintenance +destroy +extreme +allied +120 +appearing +##yn +fill +advice +alabama +qualifying +policies +cleveland +hat +battery +smart +authors +10th +soundtrack +acted +dated +lb +glance +equipped +coalition +funny +outer +ambassador +roy +possibility +couples +campbell +dna +loose +ethan +supplies +1898 +gonna +88 +monster +##res +shake +agents +frequency +springs +dogs +practices +61 +gang +plastic +easier +suggests +gulf +blade +exposed +colors +industries +markets +pan +nervous +electoral +charts +legislation +ownership +##idae +mac +appointment +shield +copy +assault +socialist +abbey +monument +license +throne +employment +jay +93 +replacement +charter +cloud +powered +suffering +accounts +oak +connecticut +strongly +wright +colour +crystal +13th +context +welsh +networks +voiced +gabriel +jerry +##cing +forehead +mp +##ens +manage +schedule +totally +remix +##ii +forests +occupation +print +nicholas +brazilian +strategic +vampires +engineers +76 +roots +seek +correct +instrumental +und +alfred +backed +hop +##des +stanley +robinson +traveled +wayne +welcome +austrian +achieve +67 +exit +rates +1899 +strip +whereas +##cs +sing +deeply +adventure +bobby +rick +jamie +careful +components +cap +useful +personality +knee +##shi +pushing +hosts +02 +protest +ca +ottoman +symphony +##sis +63 +boundary +1890 +processes +considering +considerable +tons +##work +##ft +##nia +cooper +trading +dear +conduct +91 +illegal +apple +revolutionary +holiday +definition +harder +##van +jacob +circumstances +destruction +##lle +popularity +grip +classified +liverpool +donald +baltimore +flows +seeking +honour +approval +92 +mechanical +till +happening +statue +critic +increasingly +immediate +describe +commerce +stare +##ster +indonesia +meat +rounds +boats +baker +orthodox +depression +formally +worn +naked +claire +muttered +sentence +11th +emily +document +77 +criticism +wished +vessel +spiritual +bent +virgin +parker +minimum +murray +lunch +danny +printed +compilation +keyboards +false +blow +belonged +68 +raising +78 +cutting +##board +pittsburgh +##up +9th +shadows +81 +hated +indigenous +jon +15th +barry +scholar +ah +##zer +oliver +##gy +stick +susan +meetings +attracted +spell +romantic +##ver +ye +1895 +photo +demanded +customers +##ac +1896 +logan +revival +keys +modified +commanded +jeans +##ious +upset +raw +phil +detective +hiding +resident +vincent +##bly +experiences +diamond +defeating +coverage +lucas +external +parks +franchise +helen +bible +successor +percussion +celebrated +il +lift +profile +clan +romania +##ied +mills +##su +nobody +achievement +shrugged +fault +1897 +rhythm +initiative +breakfast +carbon +700 +69 +lasted +violent +74 +wound +ken +killer +gradually +filmed +°c +dollars +processing +94 +remove +criticized +guests +sang +chemistry +##vin +legislature +disney +##bridge +uniform +escaped +integrated +proposal +purple +denied +liquid +karl +influential +morris +nights +stones +intense +experimental +twisted +71 +84 +##ld +pace +nazi +mitchell +ny +blind +reporter +newspapers +14th +centers +burn +basin +forgotten +surviving +filed +collections +monastery +losses +manual +couch +description +appropriate +merely +tag +missions +sebastian +restoration +replacing +triple +73 +elder +julia +warriors +benjamin +julian +convinced +stronger +amazing +declined +versus +merchant +happens +output +finland +bare +barbara +absence +ignored +dawn +injuries +##port +producers +##ram +82 +luis +##ities +kw +admit +expensive +electricity +nba +exception +symbol +##ving +ladies +shower +sheriff +characteristics +##je +aimed +button +ratio +effectively +summit +angle +jury +bears +foster +vessels +pants +executed +evans +dozen +advertising +kicked +patrol +1889 +competitions +lifetime +principles +athletics +##logy +birmingham +sponsored +89 +rob +nomination +1893 +acoustic +##sm +creature +longest +##tra +credits +harbor +dust +josh +##so +territories +milk +infrastructure +completion +thailand +indians +leon +archbishop +##sy +assist +pitch +blake +arrangement +girlfriend +serbian +operational +hence +sad +scent +fur +dj +sessions +hp +refer +rarely +##ora +exists +1892 +##ten +scientists +dirty +penalty +burst +portrait +seed +79 +pole +limits +rival +1894 +stable +alpha +grave +constitutional +alcohol +arrest +flower +mystery +devil +architectural +relationships +greatly +habitat +##istic +larry +progressive +remote +cotton +##ics +##ok +preserved +reaches +##ming +cited +86 +vast +scholarship +decisions +cbs +joy +teach +1885 +editions +knocked +eve +searching +partly +participation +gap +animated +fate +excellent +##ett +na +87 +alternate +saints +youngest +##ily +climbed +##ita +##tors +suggest +##ct +discussion +staying +choir +lakes +jacket +revenue +nevertheless +peaked +instrument +wondering +annually +managing +neil +1891 +signing +terry +##ice +apply +clinical +brooklyn +aim +catherine +fuck +farmers +figured +ninth +pride +hugh +evolution +ordinary +involvement +comfortable +shouted +tech +encouraged +taiwan +representation +sharing +##lia +##em +panic +exact +cargo +competing +fat +cried +83 +1920s +occasions +pa +cabin +borders +utah +marcus +##isation +badly +muscles +##ance +victorian +transition +warner +bet +permission +##rin +slave +terrible +similarly +shares +seth +uefa +possession +medals +benefits +colleges +lowered +perfectly +mall +transit +##ye +##kar +publisher +##ened +harrison +deaths +elevation +##ae +asleep +machines +sigh +ash +hardly +argument +occasion +parent +leo +decline +1888 +contribution +##ua +concentration +1000 +opportunities +hispanic +guardian +extent +emotions +hips +mason +volumes +bloody +controversy +diameter +steady +mistake +phoenix +identify +violin +##sk +departure +richmond +spin +funeral +enemies +1864 +gear +literally +connor +random +sergeant +grab +confusion +1865 +transmission +informed +op +leaning +sacred +suspended +thinks +gates +portland +luck +agencies +yours +hull +expert +muscle +layer +practical +sculpture +jerusalem +latest +lloyd +statistics +deeper +recommended +warrior +arkansas +mess +supports +greg +eagle +1880 +recovered +rated +concerts +rushed +##ano +stops +eggs +files +premiere +keith +##vo +delhi +turner +pit +affair +belief +paint +##zing +mate +##ach +##ev +victim +##ology +withdrew +bonus +styles +fled +##ud +glasgow +technologies +funded +nbc +adaptation +##ata +portrayed +cooperation +supporters +judges +bernard +justin +hallway +ralph +##ick +graduating +controversial +distant +continental +spider +bite +##ho +recognize +intention +mixing +##ese +egyptian +bow +tourism +suppose +claiming +tiger +dominated +participants +vi +##ru +nurse +partially +tape +##rum +psychology +##rn +essential +touring +duo +voting +civilian +emotional +channels +##king +apparent +hebrew +1887 +tommy +carrier +intersection +beast +hudson +##gar +##zo +lab +nova +bench +discuss +costa +##ered +detailed +behalf +drivers +unfortunately +obtain +##lis +rocky +##dae +siege +friendship +honey +##rian +1861 +amy +hang +posted +governments +collins +respond +wildlife +preferred +operator +##po +laura +pregnant +videos +dennis +suspected +boots +instantly +weird +automatic +businessman +alleged +placing +throwing +ph +mood +1862 +perry +venue +jet +remainder +##lli +##ci +passion +biological +boyfriend +1863 +dirt +buffalo +ron +segment +fa +abuse +##era +genre +thrown +stroke +colored +stress +exercise +displayed +##gen +struggled +##tti +abroad +dramatic +wonderful +thereafter +madrid +component +widespread +##sed +tale +citizen +todd +monday +1886 +vancouver +overseas +forcing +crying +descent +##ris +discussed +substantial +ranks +regime +1870 +provinces +switch +drum +zane +ted +tribes +proof +lp +cream +researchers +volunteer +manor +silk +milan +donated +allies +venture +principle +delivery +enterprise +##ves +##ans +bars +traditionally +witch +reminded +copper +##uk +pete +inter +links +colin +grinned +elsewhere +competitive +frequent +##oy +scream +##hu +tension +texts +submarine +finnish +defending +defend +pat +detail +1884 +affiliated +stuart +themes +villa +periods +tool +belgian +ruling +crimes +answers +folded +licensed +resort +demolished +hans +lucy +1881 +lion +traded +photographs +writes +craig +##fa +trials +generated +beth +noble +debt +percentage +yorkshire +erected +ss +viewed +grades +confidence +ceased +islam +telephone +retail +##ible +chile +m² +roberts +sixteen +##ich +commented +hampshire +innocent +dual +pounds +checked +regulations +afghanistan +sung +rico +liberty +assets +bigger +options +angels +relegated +tribute +wells +attending +leaf +##yan +butler +romanian +forum +monthly +lisa +patterns +gmina +##tory +madison +hurricane +rev +##ians +bristol +##ula +elite +valuable +disaster +democracy +awareness +germans +freyja +##ins +loop +absolutely +paying +populations +maine +sole +prayer +spencer +releases +doorway +bull +##ani +lover +midnight +conclusion +##sson +thirteen +lily +mediterranean +##lt +nhl +proud +sample +##hill +drummer +guinea +##ova +murphy +climb +##ston +instant +attributed +horn +ain +railways +steven +##ao +autumn +ferry +opponent +root +traveling +secured +corridor +stretched +tales +sheet +trinity +cattle +helps +indicates +manhattan +murdered +fitted +1882 +gentle +grandmother +mines +shocked +vegas +produces +##light +caribbean +##ou +belong +continuous +desperate +drunk +historically +trio +waved +raf +dealing +nathan +bat +murmured +interrupted +residing +scientist +pioneer +harold +aaron +##net +delta +attempting +minority +mini +believes +chorus +tend +lots +eyed +indoor +load +shots +updated +jail +##llo +concerning +connecting +wealth +##ved +slaves +arrive +rangers +sufficient +rebuilt +##wick +cardinal +flood +muhammad +whenever +relation +runners +moral +repair +viewers +arriving +revenge +punk +assisted +bath +fairly +breathe +lists +innings +illustrated +whisper +nearest +voters +clinton +ties +ultimate +screamed +beijing +lions +andre +fictional +gathering +comfort +radar +suitable +dismissed +hms +ban +pine +wrist +atmosphere +voivodeship +bid +timber +##ned +##nan +giants +##ane +cameron +recovery +uss +identical +categories +switched +serbia +laughter +noah +ensemble +therapy +peoples +touching +##off +locally +pearl +platforms +everywhere +ballet +tables +lanka +herbert +outdoor +toured +derek +1883 +spaces +contested +swept +1878 +exclusive +slight +connections +##dra +winds +prisoner +collective +bangladesh +tube +publicly +wealthy +thai +##ys +isolated +select +##ric +insisted +pen +fortune +ticket +spotted +reportedly +animation +enforcement +tanks +110 +decides +wider +lowest +owen +##time +nod +hitting +##hn +gregory +furthermore +magazines +fighters +solutions +##ery +pointing +requested +peru +reed +chancellor +knights +mask +worker +eldest +flames +reduction +1860 +volunteers +##tis +reporting +##hl +wire +advisory +endemic +origins +settlers +pursue +knock +consumer +1876 +eu +compound +creatures +mansion +sentenced +ivan +deployed +guitars +frowned +involves +mechanism +kilometers +perspective +shops +maps +terminus +duncan +alien +fist +bridges +##pers +heroes +fed +derby +swallowed +##ros +patent +sara +illness +characterized +adventures +slide +hawaii +jurisdiction +##op +organised +##side +adelaide +walks +biology +se +##ties +rogers +swing +tightly +boundaries +##rie +prepare +implementation +stolen +##sha +certified +colombia +edwards +garage +##mm +recalled +##ball +rage +harm +nigeria +breast +##ren +furniture +pupils +settle +##lus +cuba +balls +client +alaska +21st +linear +thrust +celebration +latino +genetic +terror +##cia +##ening +lightning +fee +witness +lodge +establishing +skull +##ique +earning +hood +##ei +rebellion +wang +sporting +warned +missile +devoted +activist +porch +worship +fourteen +package +1871 +decorated +##shire +housed +##ock +chess +sailed +doctors +oscar +joan +treat +garcia +harbour +jeremy +##ire +traditions +dominant +jacques +##gon +##wan +relocated +1879 +amendment +sized +companion +simultaneously +volleyball +spun +acre +increases +stopping +loves +belongs +affect +drafted +tossed +scout +battles +1875 +filming +shoved +munich +tenure +vertical +romance +pc +##cher +argue +##ical +craft +ranging +www +opens +honest +tyler +yesterday +virtual +##let +muslims +reveal +snake +immigrants +radical +screaming +speakers +firing +saving +belonging +ease +lighting +prefecture +blame +farmer +hungry +grows +rubbed +beam +sur +subsidiary +##cha +armenian +sao +dropping +conventional +##fer +microsoft +reply +qualify +spots +1867 +sweat +festivals +##ken +immigration +physician +discover +exposure +sandy +explanation +isaac +implemented +##fish +hart +initiated +connect +stakes +presents +heights +householder +pleased +tourist +regardless +slip +closest +##ction +surely +sultan +brings +riley +preparation +aboard +slammed +baptist +experiment +ongoing +interstate +organic +playoffs +##ika +1877 +130 +##tar +hindu +error +tours +tier +plenty +arrangements +talks +trapped +excited +sank +ho +athens +1872 +denver +welfare +suburb +athletes +trick +diverse +belly +exclusively +yelled +1868 +##med +conversion +##ette +1874 +internationally +computers +conductor +abilities +sensitive +hello +dispute +measured +globe +rocket +prices +amsterdam +flights +tigers +inn +municipalities +emotion +references +3d +##mus +explains +airlines +manufactured +pm +archaeological +1873 +interpretation +devon +comment +##ites +settlements +kissing +absolute +improvement +suite +impressed +barcelona +sullivan +jefferson +towers +jesse +julie +##tin +##lu +grandson +hi +gauge +regard +rings +interviews +trace +raymond +thumb +departments +burns +serial +bulgarian +scores +demonstrated +##ix +1866 +kyle +alberta +underneath +romanized +##ward +relieved +acquisition +phrase +cliff +reveals +han +cuts +merger +custom +##dar +nee +gilbert +graduation +##nts +assessment +cafe +difficulty +demands +swung +democrat +jennifer +commons +1940s +grove +##yo +completing +focuses +sum +substitute +bearing +stretch +reception +##py +reflected +essentially +destination +pairs +##ched +survival +resource +##bach +promoting +doubles +messages +tear +##down +##fully +parade +florence +harvey +incumbent +partial +framework +900 +pedro +frozen +procedure +olivia +controls +##mic +shelter +personally +temperatures +##od +brisbane +tested +sits +marble +comprehensive +oxygen +leonard +##kov +inaugural +iranian +referring +quarters +attitude +##ivity +mainstream +lined +mars +dakota +norfolk +unsuccessful +##° +explosion +helicopter +congressional +##sing +inspector +bitch +seal +departed +divine +##ters +coaching +examination +punishment +manufacturer +sink +columns +unincorporated +signals +nevada +squeezed +dylan +dining +photos +martial +manuel +eighteen +elevator +brushed +plates +ministers +ivy +congregation +##len +slept +specialized +taxes +curve +restricted +negotiations +likes +statistical +arnold +inspiration +execution +bold +intermediate +significance +margin +ruler +wheels +gothic +intellectual +dependent +listened +eligible +buses +widow +syria +earn +cincinnati +collapsed +recipient +secrets +accessible +philippine +maritime +goddess +clerk +surrender +breaks +playoff +database +##ified +##lon +ideal +beetle +aspect +soap +regulation +strings +expand +anglo +shorter +crosses +retreat +tough +coins +wallace +directions +pressing +##oon +shipping +locomotives +comparison +topics +nephew +##mes +distinction +honors +travelled +sierra +ibn +##over +fortress +sa +recognised +carved +1869 +clients +##dan +intent +##mar +coaches +describing +bread +##ington +beaten +northwestern +##ona +merit +youtube +collapse +challenges +em +historians +objective +submitted +virus +attacking +drake +assume +##ere +diseases +marc +stem +leeds +##cus +##ab +farming +glasses +##lock +visits +nowhere +fellowship +relevant +carries +restaurants +experiments +101 +constantly +bases +targets +shah +tenth +opponents +verse +territorial +##ira +writings +corruption +##hs +instruction +inherited +reverse +emphasis +##vic +employee +arch +keeps +rabbi +watson +payment +uh +##ala +nancy +##tre +venice +fastest +sexy +banned +adrian +properly +ruth +touchdown +dollar +boards +metre +circles +edges +favour +comments +ok +travels +liberation +scattered +firmly +##ular +holland +permitted +diesel +kenya +den +originated +##ral +demons +resumed +dragged +rider +##rus +servant +blinked +extend +torn +##ias +##sey +input +meal +everybody +cylinder +kinds +camps +##fe +bullet +logic +##wn +croatian +evolved +healthy +fool +chocolate +wise +preserve +pradesh +##ess +respective +1850 +##ew +chicken +artificial +gross +corresponding +convicted +cage +caroline +dialogue +##dor +narrative +stranger +mario +br +christianity +failing +trent +commanding +buddhist +1848 +maurice +focusing +yale +bike +altitude +##ering +mouse +revised +##sley +veteran +##ig +pulls +theology +crashed +campaigns +legion +##ability +drag +excellence +customer +cancelled +intensity +excuse +##lar +liga +participating +contributing +printing +##burn +variable +##rk +curious +bin +legacy +renaissance +##my +symptoms +binding +vocalist +dancer +##nie +grammar +gospel +democrats +ya +enters +sc +diplomatic +hitler +##ser +clouds +mathematical +quit +defended +oriented +##heim +fundamental +hardware +impressive +equally +convince +confederate +guilt +chuck +sliding +##ware +magnetic +narrowed +petersburg +bulgaria +otto +phd +skill +##ama +reader +hopes +pitcher +reservoir +hearts +automatically +expecting +mysterious +bennett +extensively +imagined +seeds +monitor +fix +##ative +journalism +struggling +signature +ranch +encounter +photographer +observation +protests +##pin +influences +##hr +calendar +##all +cruz +croatia +locomotive +hughes +naturally +shakespeare +basement +hook +uncredited +faded +theories +approaches +dare +phillips +filling +fury +obama +##ain +efficient +arc +deliver +min +raid +breeding +inducted +leagues +efficiency +axis +montana +eagles +##ked +supplied +instructions +karen +picking +indicating +trap +anchor +practically +christians +tomb +vary +occasional +electronics +lords +readers +newcastle +faint +innovation +collect +situations +engagement +160 +claude +mixture +##feld +peer +tissue +logo +lean +##ration +°f +floors +##ven +architects +reducing +##our +##ments +rope +1859 +ottawa +##har +samples +banking +declaration +proteins +resignation +francois +saudi +advocate +exhibited +armor +twins +divorce +##ras +abraham +reviewed +jo +temporarily +matrix +physically +pulse +curled +##ena +difficulties +bengal +usage +##ban +annie +riders +certificate +##pi +holes +warsaw +distinctive +jessica +##mon +mutual +1857 +customs +circular +eugene +removal +loaded +mere +vulnerable +depicted +generations +dame +heir +enormous +lightly +climbing +pitched +lessons +pilots +nepal +ram +google +preparing +brad +louise +renowned +##₂ +liam +##ably +plaza +shaw +sophie +brilliant +bills +##bar +##nik +fucking +mainland +server +pleasant +seized +veterans +jerked +fail +beta +brush +radiation +stored +warmth +southeastern +nate +sin +raced +berkeley +joke +athlete +designation +trunk +##low +roland +qualification +archives +heels +artwork +receives +judicial +reserves +##bed +woke +installation +abu +floating +fake +lesser +excitement +interface +concentrated +addressed +characteristic +amanda +saxophone +monk +auto +##bus +releasing +egg +dies +interaction +defender +ce +outbreak +glory +loving +##bert +sequel +consciousness +http +awake +ski +enrolled +##ress +handling +rookie +brow +somebody +biography +warfare +amounts +contracts +presentation +fabric +dissolved +challenged +meter +psychological +lt +elevated +rally +accurate +##tha +hospitals +undergraduate +specialist +venezuela +exhibit +shed +nursing +protestant +fluid +structural +footage +jared +consistent +prey +##ska +succession +reflect +exile +lebanon +wiped +suspect +shanghai +resting +integration +preservation +marvel +variant +pirates +sheep +rounded +capita +sailing +colonies +manuscript +deemed +variations +clarke +functional +emerging +boxing +relaxed +curse +azerbaijan +heavyweight +nickname +editorial +rang +grid +tightened +earthquake +flashed +miguel +rushing +##ches +improvements +boxes +brooks +180 +consumption +molecular +felix +societies +repeatedly +variation +aids +civic +graphics +professionals +realm +autonomous +receiver +delayed +workshop +militia +chairs +trump +canyon +##point +harsh +extending +lovely +happiness +##jan +stake +eyebrows +embassy +wellington +hannah +##ella +sony +corners +bishops +swear +cloth +contents +xi +namely +commenced +1854 +stanford +nashville +courage +graphic +commitment +garrison +##bin +hamlet +clearing +rebels +attraction +literacy +cooking +ruins +temples +jenny +humanity +celebrate +hasn +freight +sixty +rebel +bastard +##art +newton +##ada +deer +##ges +##ching +smiles +delaware +singers +##ets +approaching +assists +flame +##ph +boulevard +barrel +planted +##ome +pursuit +##sia +consequences +posts +shallow +invitation +rode +depot +ernest +kane +rod +concepts +preston +topic +chambers +striking +blast +arrives +descendants +montgomery +ranges +worlds +##lay +##ari +span +chaos +praise +##ag +fewer +1855 +sanctuary +mud +fbi +##ions +programmes +maintaining +unity +harper +bore +handsome +closure +tournaments +thunder +nebraska +linda +facade +puts +satisfied +argentine +dale +cork +dome +panama +##yl +1858 +tasks +experts +##ates +feeding +equation +##las +##ida +##tu +engage +bryan +##ax +um +quartet +melody +disbanded +sheffield +blocked +gasped +delay +kisses +maggie +connects +##non +sts +poured +creator +publishers +##we +guided +ellis +extinct +hug +gaining +##ord +complicated +##bility +poll +clenched +investigate +##use +thereby +quantum +spine +cdp +humor +kills +administered +semifinals +##du +encountered +ignore +##bu +commentary +##maker +bother +roosevelt +140 +plains +halfway +flowing +cultures +crack +imprisoned +neighboring +airline +##ses +##view +##mate +##ec +gather +wolves +marathon +transformed +##ill +cruise +organisations +carol +punch +exhibitions +numbered +alarm +ratings +daddy +silently +##stein +queens +colours +impression +guidance +liu +tactical +##rat +marshal +della +arrow +##ings +rested +feared +tender +owns +bitter +advisor +escort +##ides +spare +farms +grants +##ene +dragons +encourage +colleagues +cameras +##und +sucked +pile +spirits +prague +statements +suspension +landmark +fence +torture +recreation +bags +permanently +survivors +pond +spy +predecessor +bombing +coup +##og +protecting +transformation +glow +##lands +##book +dug +priests +andrea +feat +barn +jumping +##chen +##ologist +##con +casualties +stern +auckland +pipe +serie +revealing +ba +##bel +trevor +mercy +spectrum +yang +consist +governing +collaborated +possessed +epic +comprises +blew +shane +##ack +lopez +honored +magical +sacrifice +judgment +perceived +hammer +mtv +baronet +tune +das +missionary +sheets +350 +neutral +oral +threatening +attractive +shade +aims +seminary +##master +estates +1856 +michel +wounds +refugees +manufacturers +##nic +mercury +syndrome +porter +##iya +##din +hamburg +identification +upstairs +purse +widened +pause +cared +breathed +affiliate +santiago +prevented +celtic +fisher +125 +recruited +byzantine +reconstruction +farther +##mp +diet +sake +au +spite +sensation +##ert +blank +separation +105 +##hon +vladimir +armies +anime +##lie +accommodate +orbit +cult +sofia +archive +##ify +##box +founders +sustained +disorder +honours +northeastern +mia +crops +violet +threats +blanket +fires +canton +followers +southwestern +prototype +voyage +assignment +altered +moderate +protocol +pistol +##eo +questioned +brass +lifting +1852 +math +authored +##ual +doug +dimensional +dynamic +##san +1851 +pronounced +grateful +quest +uncomfortable +boom +presidency +stevens +relating +politicians +chen +barrier +quinn +diana +mosque +tribal +cheese +palmer +portions +sometime +chester +treasure +wu +bend +download +millions +reforms +registration +##osa +consequently +monitoring +ate +preliminary +brandon +invented +ps +eaten +exterior +intervention +ports +documented +log +displays +lecture +sally +favourite +##itz +vermont +lo +invisible +isle +breed +##ator +journalists +relay +speaks +backward +explore +midfielder +actively +stefan +procedures +cannon +blond +kenneth +centered +servants +chains +libraries +malcolm +essex +henri +slavery +##hal +facts +fairy +coached +cassie +cats +washed +cop +##fi +announcement +item +2000s +vinyl +activated +marco +frontier +growled +curriculum +##das +loyal +accomplished +leslie +ritual +kenny +##00 +vii +napoleon +hollow +hybrid +jungle +stationed +friedrich +counted +##ulated +platinum +theatrical +seated +col +rubber +glen +1840 +diversity +healing +extends +id +provisions +administrator +columbus +##oe +tributary +te +assured +org +##uous +prestigious +examined +lectures +grammy +ronald +associations +bailey +allan +essays +flute +believing +consultant +proceedings +travelling +1853 +kit +kerala +yugoslavia +buddy +methodist +##ith +burial +centres +batman +##nda +discontinued +bo +dock +stockholm +lungs +severely +##nk +citing +manga +##ugh +steal +mumbai +iraqi +robot +celebrity +bride +broadcasts +abolished +pot +joel +overhead +franz +packed +reconnaissance +johann +acknowledged +introduce +handled +doctorate +developments +drinks +alley +palestine +##nis +##aki +proceeded +recover +bradley +grain +patch +afford +infection +nationalist +legendary +##ath +interchange +virtually +gen +gravity +exploration +amber +vital +wishes +powell +doctrine +elbow +screenplay +##bird +contribute +indonesian +pet +creates +##com +enzyme +kylie +discipline +drops +manila +hunger +##ien +layers +suffer +fever +bits +monica +keyboard +manages +##hood +searched +appeals +##bad +testament +grande +reid +##war +beliefs +congo +##ification +##dia +si +requiring +##via +casey +1849 +regret +streak +rape +depends +syrian +sprint +pound +tourists +upcoming +pub +##xi +tense +##els +practiced +echo +nationwide +guild +motorcycle +liz +##zar +chiefs +desired +elena +bye +precious +absorbed +relatives +booth +pianist +##mal +citizenship +exhausted +wilhelm +##ceae +##hed +noting +quarterback +urge +hectares +##gue +ace +holly +##tal +blonde +davies +parked +sustainable +stepping +twentieth +airfield +galaxy +nest +chip +##nell +tan +shaft +paulo +requirement +##zy +paradise +tobacco +trans +renewed +vietnamese +##cker +##ju +suggesting +catching +holmes +enjoying +md +trips +colt +holder +butterfly +nerve +reformed +cherry +bowling +trailer +carriage +goodbye +appreciate +toy +joshua +interactive +enabled +involve +##kan +collar +determination +bunch +facebook +recall +shorts +superintendent +episcopal +frustration +giovanni +nineteenth +laser +privately +array +circulation +##ovic +armstrong +deals +painful +permit +discrimination +##wi +aires +retiring +cottage +ni +##sta +horizon +ellen +jamaica +ripped +fernando +chapters +playstation +patron +lecturer +navigation +behaviour +genes +georgian +export +solomon +rivals +swift +seventeen +rodriguez +princeton +independently +sox +1847 +arguing +entity +casting +hank +criteria +oakland +geographic +milwaukee +reflection +expanding +conquest +dubbed +##tv +halt +brave +brunswick +doi +arched +curtis +divorced +predominantly +somerset +streams +ugly +zoo +horrible +curved +buenos +fierce +dictionary +vector +theological +unions +handful +stability +chan +punjab +segments +##lly +altar +ignoring +gesture +monsters +pastor +##stone +thighs +unexpected +operators +abruptly +coin +compiled +associates +improving +migration +pin +##ose +compact +collegiate +reserved +##urs +quarterfinals +roster +restore +assembled +hurry +oval +##cies +1846 +flags +martha +##del +victories +sharply +##rated +argues +deadly +neo +drawings +symbols +performer +##iel +griffin +restrictions +editing +andrews +java +journals +arabia +compositions +dee +pierce +removing +hindi +casino +runway +civilians +minds +nasa +hotels +##zation +refuge +rent +retain +potentially +conferences +suburban +conducting +##tto +##tions +##tle +descended +massacre +##cal +ammunition +terrain +fork +souls +counts +chelsea +durham +drives +cab +##bank +perth +realizing +palestinian +finn +simpson +##dal +betty +##ule +moreover +particles +cardinals +tent +evaluation +extraordinary +##oid +inscription +##works +wednesday +chloe +maintains +panels +ashley +trucks +##nation +cluster +sunlight +strikes +zhang +##wing +dialect +canon +##ap +tucked +##ws +collecting +##mas +##can +##sville +maker +quoted +evan +franco +aria +buying +cleaning +eva +closet +provision +apollo +clinic +rat +##ez +necessarily +ac +##gle +##ising +venues +flipped +cent +spreading +trustees +checking +authorized +##sco +disappointed +##ado +notion +duration +trumpet +hesitated +topped +brussels +rolls +theoretical +hint +define +aggressive +repeat +wash +peaceful +optical +width +allegedly +mcdonald +strict +copyright +##illa +investors +mar +jam +witnesses +sounding +miranda +michelle +privacy +hugo +harmony +##pp +valid +lynn +glared +nina +102 +headquartered +diving +boarding +gibson +##ncy +albanian +marsh +routine +dealt +enhanced +er +intelligent +substance +targeted +enlisted +discovers +spinning +observations +pissed +smoking +rebecca +capitol +visa +varied +costume +seemingly +indies +compensation +surgeon +thursday +arsenal +westminster +suburbs +rid +anglican +##ridge +knots +foods +alumni +lighter +fraser +whoever +portal +scandal +##ray +gavin +advised +instructor +flooding +terrorist +##ale +teenage +interim +senses +duck +teen +thesis +abby +eager +overcome +##ile +newport +glenn +rises +shame +##cc +prompted +priority +forgot +bomber +nicolas +protective +360 +cartoon +katherine +breeze +lonely +trusted +henderson +richardson +relax +banner +candy +palms +remarkable +##rio +legends +cricketer +essay +ordained +edmund +rifles +trigger +##uri +##away +sail +alert +1830 +audiences +penn +sussex +siblings +pursued +indianapolis +resist +rosa +consequence +succeed +avoided +1845 +##ulation +inland +##tie +##nna +counsel +profession +chronicle +hurried +##una +eyebrow +eventual +bleeding +innovative +cure +##dom +committees +accounting +con +scope +hardy +heather +tenor +gut +herald +codes +tore +scales +wagon +##oo +luxury +tin +prefer +fountain +triangle +bonds +darling +convoy +dried +traced +beings +troy +accidentally +slam +findings +smelled +joey +lawyers +outcome +steep +bosnia +configuration +shifting +toll +brook +performers +lobby +philosophical +construct +shrine +aggregate +boot +cox +phenomenon +savage +insane +solely +reynolds +lifestyle +##ima +nationally +holdings +consideration +enable +edgar +mo +mama +##tein +fights +relegation +chances +atomic +hub +conjunction +awkward +reactions +currency +finale +kumar +underwent +steering +elaborate +gifts +comprising +melissa +veins +reasonable +sunshine +chi +solve +trails +inhabited +elimination +ethics +huh +ana +molly +consent +apartments +layout +marines +##ces +hunters +bulk +##oma +hometown +##wall +##mont +cracked +reads +neighbouring +withdrawn +admission +wingspan +damned +anthology +lancashire +brands +batting +forgive +cuban +awful +##lyn +104 +dimensions +imagination +##ade +dante +##ship +tracking +desperately +goalkeeper +##yne +groaned +workshops +confident +burton +gerald +milton +circus +uncertain +slope +copenhagen +sophia +fog +philosopher +portraits +accent +cycling +varying +gripped +larvae +garrett +specified +scotia +mature +luther +kurt +rap +##kes +aerial +750 +ferdinand +heated +es +transported +##shan +safely +nonetheless +##orn +##gal +motors +demanding +##sburg +startled +##brook +ally +generate +caps +ghana +stained +demo +mentions +beds +ap +afterward +diary +##bling +utility +##iro +richards +1837 +conspiracy +conscious +shining +footsteps +observer +cyprus +urged +loyalty +developer +probability +olive +upgraded +gym +miracle +insects +graves +1844 +ourselves +hydrogen +amazon +katie +tickets +poets +##pm +planes +##pan +prevention +witnessed +dense +jin +randy +tang +warehouse +monroe +bang +archived +elderly +investigations +alec +granite +mineral +conflicts +controlling +aboriginal +carlo +##zu +mechanics +stan +stark +rhode +skirt +est +##berry +bombs +respected +##horn +imposed +limestone +deny +nominee +memphis +grabbing +disabled +##als +amusement +aa +frankfurt +corn +referendum +varies +slowed +disk +firms +unconscious +incredible +clue +sue +##zhou +twist +##cio +joins +idaho +chad +developers +computing +destroyer +103 +mortal +tucker +kingston +choices +yu +carson +1800 +os +whitney +geneva +pretend +dimension +staged +plateau +maya +##une +freestyle +##bc +rovers +hiv +##ids +tristan +classroom +prospect +##hus +honestly +diploma +lied +thermal +auxiliary +feast +unlikely +iata +##tel +morocco +pounding +treasury +lithuania +considerably +1841 +dish +1812 +geological +matching +stumbled +destroying +marched +brien +advances +cake +nicole +belle +settling +measuring +directing +##mie +tuesday +bassist +capabilities +stunned +fraud +torpedo +##list +##phone +anton +wisdom +surveillance +ruined +##ulate +lawsuit +healthcare +theorem +halls +trend +aka +horizontal +dozens +acquire +lasting +swim +hawk +gorgeous +fees +vicinity +decrease +adoption +tactics +##ography +pakistani +##ole +draws +##hall +willie +burke +heath +algorithm +integral +powder +elliott +brigadier +jackie +tate +varieties +darker +##cho +lately +cigarette +specimens +adds +##ree +##ensis +##inger +exploded +finalist +cia +murders +wilderness +arguments +nicknamed +acceptance +onwards +manufacture +robertson +jets +tampa +enterprises +blog +loudly +composers +nominations +1838 +ai +malta +inquiry +automobile +hosting +viii +rays +tilted +grief +museums +strategies +furious +euro +equality +cohen +poison +surrey +wireless +governed +ridiculous +moses +##esh +##room +vanished +##ito +barnes +attract +morrison +istanbul +##iness +absent +rotation +petition +janet +##logical +satisfaction +custody +deliberately +observatory +comedian +surfaces +pinyin +novelist +strictly +canterbury +oslo +monks +embrace +ibm +jealous +photograph +continent +dorothy +marina +doc +excess +holden +allegations +explaining +stack +avoiding +lance +storyline +majesty +poorly +spike +dos +bradford +raven +travis +classics +proven +voltage +pillow +fists +butt +1842 +interpreted +##car +1839 +gage +telegraph +lens +promising +expelled +casual +collector +zones +##min +silly +nintendo +##kh +##bra +downstairs +chef +suspicious +afl +flies +vacant +uganda +pregnancy +condemned +lutheran +estimates +cheap +decree +saxon +proximity +stripped +idiot +deposits +contrary +presenter +magnus +glacier +im +offense +edwin +##ori +upright +##long +bolt +##ois +toss +geographical +##izes +environments +delicate +marking +abstract +xavier +nails +windsor +plantation +occurring +equity +saskatchewan +fears +drifted +sequences +vegetation +revolt +##stic +1843 +sooner +fusion +opposing +nato +skating +1836 +secretly +ruin +lease +##oc +edit +##nne +flora +anxiety +ruby +##ological +##mia +tel +bout +taxi +emmy +frost +rainbow +compounds +foundations +rainfall +assassination +nightmare +dominican +##win +achievements +deserve +orlando +intact +armenia +##nte +calgary +valentine +106 +marion +proclaimed +theodore +bells +courtyard +thigh +gonzalez +console +troop +minimal +monte +everyday +##ence +##if +supporter +terrorism +buck +openly +presbyterian +activists +carpet +##iers +rubbing +uprising +##yi +cute +conceived +legally +##cht +millennium +cello +velocity +ji +rescued +cardiff +1835 +rex +concentrate +senators +beard +rendered +glowing +battalions +scouts +competitors +sculptor +catalogue +arctic +ion +raja +bicycle +wow +glancing +lawn +##woman +gentleman +lighthouse +publish +predicted +calculated +##val +variants +##gne +strain +##ui +winston +deceased +##nus +touchdowns +brady +caleb +sinking +echoed +crush +hon +blessed +protagonist +hayes +endangered +magnitude +editors +##tine +estimate +responsibilities +##mel +backup +laying +consumed +sealed +zurich +lovers +frustrated +##eau +ahmed +kicking +mit +treasurer +1832 +biblical +refuse +terrified +pump +agrees +genuine +imprisonment +refuses +plymouth +##hen +lou +##nen +tara +trembling +antarctic +ton +learns +##tas +crap +crucial +faction +atop +##borough +wrap +lancaster +odds +hopkins +erik +lyon +##eon +bros +##ode +snap +locality +tips +empress +crowned +cal +acclaimed +chuckled +##ory +clara +sends +mild +towel +##fl +##day +##а +wishing +assuming +interviewed +##bal +##die +interactions +eden +cups +helena +##lf +indie +beck +##fire +batteries +filipino +wizard +parted +##lam +traces +##born +rows +idol +albany +delegates +##ees +##sar +discussions +##ex +notre +instructed +belgrade +highways +suggestion +lauren +possess +orientation +alexandria +abdul +beats +salary +reunion +ludwig +alright +wagner +intimate +pockets +slovenia +hugged +brighton +merchants +cruel +stole +trek +slopes +repairs +enrollment +politically +underlying +promotional +counting +boeing +##bb +isabella +naming +##и +keen +bacteria +listing +separately +belfast +ussr +450 +lithuanian +anybody +ribs +sphere +martinez +cock +embarrassed +proposals +fragments +nationals +##fs +##wski +premises +fin +1500 +alpine +matched +freely +bounded +jace +sleeve +##af +gaming +pier +populated +evident +##like +frances +flooded +##dle +frightened +pour +trainer +framed +visitor +challenging +pig +wickets +##fold +infected +email +##pes +arose +##aw +reward +ecuador +oblast +vale +ch +shuttle +##usa +bach +rankings +forbidden +cornwall +accordance +salem +consumers +bruno +fantastic +toes +machinery +resolved +julius +remembering +propaganda +iceland +bombardment +tide +contacts +wives +##rah +concerto +macdonald +albania +implement +daisy +tapped +sudan +helmet +angela +mistress +##lic +crop +sunk +finest +##craft +hostile +##ute +##tsu +boxer +fr +paths +adjusted +habit +ballot +supervision +soprano +##zen +bullets +wicked +sunset +regiments +disappear +lamp +performs +app +##gia +##oa +rabbit +digging +incidents +entries +##cion +dishes +##oi +introducing +##ati +##fied +freshman +slot +jill +tackles +baroque +backs +##iest +lone +sponsor +destiny +altogether +convert +##aro +consensus +shapes +demonstration +basically +feminist +auction +artifacts +##bing +strongest +twitter +halifax +2019 +allmusic +mighty +smallest +precise +alexandra +viola +##los +##ille +manuscripts +##illo +dancers +ari +managers +monuments +blades +barracks +springfield +maiden +consolidated +electron +##end +berry +airing +wheat +nobel +inclusion +blair +payments +geography +bee +cc +eleanor +react +##hurst +afc +manitoba +##yu +su +lineup +fitness +recreational +investments +airborne +disappointment +##dis +edmonton +viewing +##row +renovation +##cast +infant +bankruptcy +roses +aftermath +pavilion +##yer +carpenter +withdrawal +ladder +##hy +discussing +popped +reliable +agreements +rochester +##abad +curves +bombers +220 +rao +reverend +decreased +choosing +107 +stiff +consulting +naples +crawford +tracy +ka +ribbon +cops +##lee +crushed +deciding +unified +teenager +accepting +flagship +explorer +poles +sanchez +inspection +revived +skilled +induced +exchanged +flee +locals +tragedy +swallow +loading +hanna +demonstrate +##ela +salvador +flown +contestants +civilization +##ines +wanna +rhodes +fletcher +hector +knocking +considers +##ough +nash +mechanisms +sensed +mentally +walt +unclear +##eus +renovated +madame +##cks +crews +governmental +##hin +undertaken +monkey +##ben +##ato +fatal +armored +copa +caves +governance +grasp +perception +certification +froze +damp +tugged +wyoming +##rg +##ero +newman +##lor +nerves +curiosity +graph +115 +##ami +withdraw +tunnels +dull +meredith +moss +exhibits +neighbors +communicate +accuracy +explored +raiders +republicans +secular +kat +superman +penny +criticised +##tch +freed +update +conviction +wade +ham +likewise +delegation +gotta +doll +promises +technological +myth +nationality +resolve +convent +##mark +sharon +dig +sip +coordinator +entrepreneur +fold +##dine +capability +councillor +synonym +blown +swan +cursed +1815 +jonas +haired +sofa +canvas +keeper +rivalry +##hart +rapper +speedway +swords +postal +maxwell +estonia +potter +recurring +##nn +##ave +errors +##oni +cognitive +1834 +##² +claws +nadu +roberto +bce +wrestler +ellie +##ations +infinite +ink +##tia +presumably +finite +staircase +108 +noel +patricia +nacional +##cation +chill +eternal +tu +preventing +prussia +fossil +limbs +##logist +ernst +frog +perez +rene +##ace +pizza +prussian +##ios +##vy +molecules +regulatory +answering +opinions +sworn +lengths +supposedly +hypothesis +upward +habitats +seating +ancestors +drank +yield +hd +synthesis +researcher +modest +##var +mothers +peered +voluntary +homeland +##the +acclaim +##igan +static +valve +luxembourg +alto +carroll +fe +receptor +norton +ambulance +##tian +johnston +catholics +depicting +jointly +elephant +gloria +mentor +badge +ahmad +distinguish +remarked +councils +precisely +allison +advancing +detection +crowded +##10 +cooperative +ankle +mercedes +dagger +surrendered +pollution +commit +subway +jeffrey +lesson +sculptures +provider +##fication +membrane +timothy +rectangular +fiscal +heating +teammate +basket +particle +anonymous +deployment +##ple +missiles +courthouse +proportion +shoe +sec +##ller +complaints +forbes +blacks +abandon +remind +sizes +overwhelming +autobiography +natalie +##awa +risks +contestant +countryside +babies +scorer +invaded +enclosed +proceed +hurling +disorders +##cu +reflecting +continuously +cruiser +graduates +freeway +investigated +ore +deserved +maid +blocking +phillip +jorge +shakes +dove +mann +variables +lacked +burden +accompanying +que +consistently +organizing +provisional +complained +endless +##rm +tubes +juice +georges +krishna +mick +labels +thriller +##uch +laps +arcade +sage +snail +##table +shannon +fi +laurence +seoul +vacation +presenting +hire +churchill +surprisingly +prohibited +savannah +technically +##oli +170 +##lessly +testimony +suited +speeds +toys +romans +mlb +flowering +measurement +talented +kay +settings +charleston +expectations +shattered +achieving +triumph +ceremonies +portsmouth +lanes +mandatory +loser +stretching +cologne +realizes +seventy +cornell +careers +webb +##ulating +americas +budapest +ava +suspicion +##ison +yo +conrad +##hai +sterling +jessie +rector +##az +1831 +transform +organize +loans +christine +volcanic +warrant +slender +summers +subfamily +newer +danced +dynamics +rhine +proceeds +heinrich +gastropod +commands +sings +facilitate +easter +ra +positioned +responses +expense +fruits +yanked +imported +25th +velvet +vic +primitive +tribune +baldwin +neighbourhood +donna +rip +hay +pr +##uro +1814 +espn +welcomed +##aria +qualifier +glare +highland +timing +##cted +shells +eased +geometry +louder +exciting +slovakia +##sion +##iz +##lot +savings +prairie +##ques +marching +rafael +tonnes +##lled +curtain +preceding +shy +heal +greene +worthy +##pot +detachment +bury +sherman +##eck +reinforced +seeks +bottles +contracted +duchess +outfit +walsh +##sc +mickey +##ase +geoffrey +archer +squeeze +dawson +eliminate +invention +##enberg +neal +##eth +stance +dealer +coral +maple +retire +polo +simplified +##ht +1833 +hid +watts +backwards +jules +##oke +genesis +mt +frames +rebounds +burma +woodland +moist +santos +whispers +drained +subspecies +##aa +streaming +ulster +burnt +correspondence +maternal +gerard +denis +stealing +##load +genius +duchy +##oria +inaugurated +momentum +suits +placement +sovereign +clause +thames +##hara +confederation +reservation +sketch +yankees +lets +rotten +charm +hal +verses +ultra +commercially +dot +salon +citation +adopt +winnipeg +mist +allocated +cairo +##boy +jenkins +interference +objectives +##wind +1820 +portfolio +armoured +sectors +##eh +initiatives +##world +integrity +exercises +robe +tap +ab +gazed +##tones +distracted +rulers +111 +favorable +jerome +tended +cart +factories +##eri +diplomat +valued +gravel +charitable +##try +calvin +exploring +chang +shepherd +terrace +pdf +pupil +##ural +reflects +ups +##rch +governors +shelf +depths +##nberg +trailed +crest +tackle +##nian +##ats +hatred +##kai +clare +makers +ethiopia +longtime +detected +embedded +lacking +slapped +rely +thomson +anticipation +iso +morton +successive +agnes +screenwriter +straightened +philippe +playwright +haunted +licence +iris +intentions +sutton +112 +logical +correctly +##weight +branded +licked +tipped +silva +ricky +narrator +requests +##ents +greeted +supernatural +cow +##wald +lung +refusing +employer +strait +gaelic +liner +##piece +zoe +sabha +##mba +driveway +harvest +prints +bates +reluctantly +threshold +algebra +ira +wherever +coupled +240 +assumption +picks +##air +designers +raids +gentlemen +##ean +roller +blowing +leipzig +locks +screw +dressing +strand +##lings +scar +dwarf +depicts +##nu +nods +##mine +differ +boris +##eur +yuan +flip +##gie +mob +invested +questioning +applying +##ture +shout +##sel +gameplay +blamed +illustrations +bothered +weakness +rehabilitation +##of +##zes +envelope +rumors +miners +leicester +subtle +kerry +##ico +ferguson +##fu +premiership +ne +##cat +bengali +prof +catches +remnants +dana +##rily +shouting +presidents +baltic +ought +ghosts +dances +sailors +shirley +fancy +dominic +##bie +madonna +##rick +bark +buttons +gymnasium +ashes +liver +toby +oath +providence +doyle +evangelical +nixon +cement +carnegie +embarked +hatch +surroundings +guarantee +needing +pirate +essence +##bee +filter +crane +hammond +projected +immune +percy +twelfth +##ult +regent +doctoral +damon +mikhail +##ichi +lu +critically +elect +realised +abortion +acute +screening +mythology +steadily +##fc +frown +nottingham +kirk +wa +minneapolis +##rra +module +algeria +mc +nautical +encounters +surprising +statues +availability +shirts +pie +alma +brows +munster +mack +soup +crater +tornado +sanskrit +cedar +explosive +bordered +dixon +planets +stamp +exam +happily +##bble +carriers +kidnapped +##vis +accommodation +emigrated +##met +knockout +correspondent +violation +profits +peaks +lang +specimen +agenda +ancestry +pottery +spelling +equations +obtaining +ki +linking +1825 +debris +asylum +##20 +buddhism +teddy +##ants +gazette +##nger +##sse +dental +eligibility +utc +fathers +averaged +zimbabwe +francesco +coloured +hissed +translator +lynch +mandate +humanities +mackenzie +uniforms +lin +##iana +##gio +asset +mhz +fitting +samantha +genera +wei +rim +beloved +shark +riot +entities +expressions +indo +carmen +slipping +owing +abbot +neighbor +sidney +##av +rats +recommendations +encouraging +squadrons +anticipated +commanders +conquered +##oto +donations +diagnosed +##mond +divide +##iva +guessed +decoration +vernon +auditorium +revelation +conversations +##kers +##power +herzegovina +dash +alike +protested +lateral +herman +accredited +mg +##gent +freeman +mel +fiji +crow +crimson +##rine +livestock +##pped +humanitarian +bored +oz +whip +##lene +##ali +legitimate +alter +grinning +spelled +anxious +oriental +wesley +##nin +##hole +carnival +controller +detect +##ssa +bowed +educator +kosovo +macedonia +##sin +occupy +mastering +stephanie +janeiro +para +unaware +nurses +noon +135 +cam +hopefully +ranger +combine +sociology +polar +rica +##eer +neill +##sman +holocaust +##ip +doubled +lust +1828 +109 +decent +cooling +unveiled +##card +1829 +nsw +homer +chapman +meyer +##gin +dive +mae +reagan +expertise +##gled +darwin +brooke +sided +prosecution +investigating +comprised +petroleum +genres +reluctant +differently +trilogy +johns +vegetables +corpse +highlighted +lounge +pension +unsuccessfully +elegant +aided +ivory +beatles +amelia +cain +dubai +sunny +immigrant +babe +click +##nder +underwater +pepper +combining +mumbled +atlas +horns +accessed +ballad +physicians +homeless +gestured +rpm +freak +louisville +corporations +patriots +prizes +rational +warn +modes +decorative +overnight +din +troubled +phantom +##ort +monarch +sheer +##dorf +generals +guidelines +organs +addresses +##zon +enhance +curling +parishes +cord +##kie +linux +caesar +deutsche +bavaria +##bia +coleman +cyclone +##eria +bacon +petty +##yama +##old +hampton +diagnosis +1824 +throws +complexity +rita +disputed +##₃ +pablo +##sch +marketed +trafficking +##ulus +examine +plague +formats +##oh +vault +faithful +##bourne +webster +##ox +highlights +##ient +##ann +phones +vacuum +sandwich +modeling +##gated +bolivia +clergy +qualities +isabel +##nas +##ars +wears +screams +reunited +annoyed +bra +##ancy +##rate +differential +transmitter +tattoo +container +poker +##och +excessive +resides +cowboys +##tum +augustus +trash +providers +statute +retreated +balcony +reversed +void +storey +preceded +masses +leap +laughs +neighborhoods +wards +schemes +falcon +santo +battlefield +pad +ronnie +thread +lesbian +venus +##dian +beg +sandstone +daylight +punched +gwen +analog +stroked +wwe +acceptable +measurements +dec +toxic +##kel +adequate +surgical +economist +parameters +varsity +##sberg +quantity +ella +##chy +##rton +countess +generating +precision +diamonds +expressway +ga +##ı +1821 +uruguay +talents +galleries +expenses +scanned +colleague +outlets +ryder +lucien +##ila +paramount +##bon +syracuse +dim +fangs +gown +sweep +##sie +toyota +missionaries +websites +##nsis +sentences +adviser +val +trademark +spells +##plane +patience +starter +slim +##borg +toe +incredibly +shoots +elliot +nobility +##wyn +cowboy +endorsed +gardner +tendency +persuaded +organisms +emissions +kazakhstan +amused +boring +chips +themed +##hand +llc +constantinople +chasing +systematic +guatemala +borrowed +erin +carey +##hard +highlands +struggles +1810 +##ifying +##ced +wong +exceptions +develops +enlarged +kindergarten +castro +##ern +##rina +leigh +zombie +juvenile +##most +consul +##nar +sailor +hyde +clarence +intensive +pinned +nasty +useless +jung +clayton +stuffed +exceptional +ix +apostolic +230 +transactions +##dge +exempt +swinging +cove +religions +##ash +shields +dairy +bypass +190 +pursuing +bug +joyce +bombay +chassis +southampton +chat +interact +redesignated +##pen +nascar +pray +salmon +rigid +regained +malaysian +grim +publicity +constituted +capturing +toilet +delegate +purely +tray +drift +loosely +striker +weakened +trinidad +mitch +itv +defines +transmitted +ming +scarlet +nodding +fitzgerald +fu +narrowly +sp +tooth +standings +virtue +##₁ +##wara +##cting +chateau +gloves +lid +##nel +hurting +conservatory +##pel +sinclair +reopened +sympathy +nigerian +strode +advocated +optional +chronic +discharge +##rc +suck +compatible +laurel +stella +shi +fails +wage +dodge +128 +informal +sorts +levi +buddha +villagers +##aka +chronicles +heavier +summoned +gateway +3000 +eleventh +jewelry +translations +accordingly +seas +##ency +fiber +pyramid +cubic +dragging +##ista +caring +##ops +android +contacted +lunar +##dt +kai +lisbon +patted +1826 +sacramento +theft +madagascar +subtropical +disputes +ta +holidays +piper +willow +mare +cane +itunes +newfoundland +benny +companions +dong +raj +observe +roar +charming +plaque +tibetan +fossils +enacted +manning +bubble +tina +tanzania +##eda +##hir +funk +swamp +deputies +cloak +ufc +scenario +par +scratch +metals +anthem +guru +engaging +specially +##boat +dialects +nineteen +cecil +duet +disability +messenger +unofficial +##lies +defunct +eds +moonlight +drainage +surname +puzzle +honda +switching +conservatives +mammals +knox +broadcaster +sidewalk +cope +##ried +benson +princes +peterson +##sal +bedford +sharks +eli +wreck +alberto +gasp +archaeology +lgbt +teaches +securities +madness +compromise +waving +coordination +davidson +visions +leased +possibilities +eighty +jun +fernandez +enthusiasm +assassin +sponsorship +reviewer +kingdoms +estonian +laboratories +##fy +##nal +applies +verb +celebrations +##zzo +rowing +lightweight +sadness +submit +mvp +balanced +dude +##vas +explicitly +metric +magnificent +mound +brett +mohammad +mistakes +irregular +##hing +##ass +sanders +betrayed +shipped +surge +##enburg +reporters +termed +georg +pity +verbal +bulls +abbreviated +enabling +appealed +##are +##atic +sicily +sting +heel +sweetheart +bart +spacecraft +brutal +monarchy +##tter +aberdeen +cameo +diane +##ub +survivor +clyde +##aries +complaint +##makers +clarinet +delicious +chilean +karnataka +coordinates +1818 +panties +##rst +pretending +ar +dramatically +kiev +bella +tends +distances +113 +catalog +launching +instances +telecommunications +portable +lindsay +vatican +##eim +angles +aliens +marker +stint +screens +bolton +##rne +judy +wool +benedict +plasma +europa +spark +imaging +filmmaker +swiftly +##een +contributor +##nor +opted +stamps +apologize +financing +butter +gideon +sophisticated +alignment +avery +chemicals +yearly +speculation +prominence +professionally +##ils +immortal +institutional +inception +wrists +identifying +tribunal +derives +gains +##wo +papal +preference +linguistic +vince +operative +brewery +##ont +unemployment +boyd +##ured +##outs +albeit +prophet +1813 +bi +##rr +##face +##rad +quarterly +asteroid +cleaned +radius +temper +##llen +telugu +jerk +viscount +menu +##ote +glimpse +##aya +yacht +hawaiian +baden +##rl +laptop +readily +##gu +monetary +offshore +scots +watches +##yang +##arian +upgrade +needle +xbox +lea +encyclopedia +flank +fingertips +##pus +delight +teachings +confirm +roth +beaches +midway +winters +##iah +teasing +daytime +beverly +gambling +bonnie +##backs +regulated +clement +hermann +tricks +knot +##shing +##uring +##vre +detached +ecological +owed +specialty +byron +inventor +bats +stays +screened +unesco +midland +trim +affection +##ander +##rry +jess +thoroughly +feedback +##uma +chennai +strained +heartbeat +wrapping +overtime +pleaded +##sworth +mon +leisure +oclc +##tate +##ele +feathers +angelo +thirds +nuts +surveys +clever +gill +commentator +##dos +darren +rides +gibraltar +##nc +##mu +dissolution +dedication +shin +meals +saddle +elvis +reds +chaired +taller +appreciation +functioning +niece +favored +advocacy +robbie +criminals +suffolk +yugoslav +passport +constable +congressman +hastings +vera +##rov +consecrated +sparks +ecclesiastical +confined +##ovich +muller +floyd +nora +1822 +paved +1827 +cumberland +ned +saga +spiral +##flow +appreciated +yi +collaborative +treating +similarities +feminine +finishes +##ib +jade +import +##nse +##hot +champagne +mice +securing +celebrities +helsinki +attributes +##gos +cousins +phases +ache +lucia +gandhi +submission +vicar +spear +shine +tasmania +biting +detention +constitute +tighter +seasonal +##gus +terrestrial +matthews +##oka +effectiveness +parody +philharmonic +##onic +1816 +strangers +encoded +consortium +guaranteed +regards +shifts +tortured +collision +supervisor +inform +broader +insight +theaters +armour +emeritus +blink +incorporates +mapping +##50 +##ein +handball +flexible +##nta +substantially +generous +thief +##own +carr +loses +1793 +prose +ucla +romeo +generic +metallic +realization +damages +mk +commissioners +zach +default +##ther +helicopters +lengthy +stems +spa +partnered +spectators +rogue +indication +penalties +teresa +1801 +sen +##tric +dalton +##wich +irving +photographic +##vey +dell +deaf +peters +excluded +unsure +##vable +patterson +crawled +##zio +resided +whipped +latvia +slower +ecole +pipes +employers +maharashtra +comparable +va +textile +pageant +##gel +alphabet +binary +irrigation +chartered +choked +antoine +offs +waking +supplement +##wen +quantities +demolition +regain +locate +urdu +folks +alt +114 +##mc +scary +andreas +whites +##ava +classrooms +mw +aesthetic +publishes +valleys +guides +cubs +johannes +bryant +conventions +affecting +##itt +drain +awesome +isolation +prosecutor +ambitious +apology +captive +downs +atmospheric +lorenzo +aisle +beef +foul +##onia +kidding +composite +disturbed +illusion +natives +##ffer +emi +rockets +riverside +wartime +painters +adolf +melted +##ail +uncertainty +simulation +hawks +progressed +meantime +builder +spray +breach +unhappy +regina +russians +##urg +determining +##tation +tram +1806 +##quin +aging +##12 +1823 +garion +rented +mister +diaz +terminated +clip +1817 +depend +nervously +disco +owe +defenders +shiva +notorious +disbelief +shiny +worcester +##gation +##yr +trailing +undertook +islander +belarus +limitations +watershed +fuller +overlooking +utilized +raphael +1819 +synthetic +breakdown +klein +##nate +moaned +memoir +lamb +practicing +##erly +cellular +arrows +exotic +##graphy +witches +117 +charted +rey +hut +hierarchy +subdivision +freshwater +giuseppe +aloud +reyes +qatar +marty +sideways +utterly +sexually +jude +prayers +mccarthy +softball +blend +damien +##gging +##metric +wholly +erupted +lebanese +negro +revenues +tasted +comparative +teamed +transaction +labeled +maori +sovereignty +parkway +trauma +gran +malay +121 +advancement +descendant +2020 +buzz +salvation +inventory +symbolic +##making +antarctica +mps +##gas +##bro +mohammed +myanmar +holt +submarines +tones +##lman +locker +patriarch +bangkok +emerson +remarks +predators +kin +afghan +confession +norwich +rental +emerge +advantages +##zel +rca +##hold +shortened +storms +aidan +##matic +autonomy +compliance +##quet +dudley +atp +##osis +1803 +motto +documentation +summary +professors +spectacular +christina +archdiocese +flashing +innocence +remake +##dell +psychic +reef +scare +employ +rs +sticks +meg +gus +leans +##ude +accompany +bergen +tomas +##iko +doom +wages +pools +##nch +##bes +breasts +scholarly +alison +outline +brittany +breakthrough +willis +realistic +##cut +##boro +competitor +##stan +pike +picnic +icon +designing +commercials +washing +villain +skiing +micro +costumes +auburn +halted +executives +##hat +logistics +cycles +vowel +applicable +barrett +exclaimed +eurovision +eternity +ramon +##umi +##lls +modifications +sweeping +disgust +##uck +torch +aviv +ensuring +rude +dusty +sonic +donovan +outskirts +cu +pathway +##band +##gun +##lines +disciplines +acids +cadet +paired +##40 +sketches +##sive +marriages +##⁺ +folding +peers +slovak +implies +admired +##beck +1880s +leopold +instinct +attained +weston +megan +horace +##ination +dorsal +ingredients +evolutionary +##its +complications +deity +lethal +brushing +levy +deserted +institutes +posthumously +delivering +telescope +coronation +motivated +rapids +luc +flicked +pays +volcano +tanner +weighed +##nica +crowds +frankie +gifted +addressing +granddaughter +winding +##rna +constantine +gomez +##front +landscapes +rudolf +anthropology +slate +werewolf +##lio +astronomy +circa +rouge +dreaming +sack +knelt +drowned +naomi +prolific +tracked +freezing +herb +##dium +agony +randall +twisting +wendy +deposit +touches +vein +wheeler +##bbled +##bor +batted +retaining +tire +presently +compare +specification +daemon +nigel +##grave +merry +recommendation +czechoslovakia +sandra +ng +roma +##sts +lambert +inheritance +sheikh +winchester +cries +examining +##yle +comeback +cuisine +nave +##iv +ko +retrieve +tomatoes +barker +polished +defining +irene +lantern +personalities +begging +tract +swore +1809 +175 +##gic +omaha +brotherhood +##rley +haiti +##ots +exeter +##ete +##zia +steele +dumb +pearson +210 +surveyed +elisabeth +trends +##ef +fritz +##rf +premium +bugs +fraction +calmly +viking +##birds +tug +inserted +unusually +##ield +confronted +distress +crashing +brent +turks +resign +##olo +cambodia +gabe +sauce +##kal +evelyn +116 +extant +clusters +quarry +teenagers +luna +##lers +##ister +affiliation +drill +##ashi +panthers +scenic +libya +anita +strengthen +inscriptions +##cated +lace +sued +judith +riots +##uted +mint +##eta +preparations +midst +dub +challenger +##vich +mock +cf +displaced +wicket +breaths +enables +schmidt +analyst +##lum +ag +highlight +automotive +axe +josef +newark +sufficiently +resembles +50th +##pal +flushed +mum +traits +##ante +commodore +incomplete +warming +titular +ceremonial +ethical +118 +celebrating +eighteenth +cao +lima +medalist +mobility +strips +snakes +##city +miniature +zagreb +barton +escapes +umbrella +automated +doubted +differs +cooled +georgetown +dresden +cooked +fade +wyatt +rna +jacobs +carlton +abundant +stereo +boost +madras +inning +##hia +spur +ip +malayalam +begged +osaka +groan +escaping +charging +dose +vista +##aj +bud +papa +communists +advocates +edged +tri +##cent +resemble +peaking +necklace +fried +montenegro +saxony +goose +glances +stuttgart +curator +recruit +grocery +sympathetic +##tting +##fort +127 +lotus +randolph +ancestor +##rand +succeeding +jupiter +1798 +macedonian +##heads +hiking +1808 +handing +fischer +##itive +garbage +node +##pies +prone +singular +papua +inclined +attractions +italia +pouring +motioned +grandma +garnered +jacksonville +corp +ego +ringing +aluminum +##hausen +ordering +##foot +drawer +traders +synagogue +##play +##kawa +resistant +wandering +fragile +fiona +teased +var +hardcore +soaked +jubilee +decisive +exposition +mercer +poster +valencia +hale +kuwait +1811 +##ises +##wr +##eed +tavern +gamma +122 +johan +##uer +airways +amino +gil +##ury +vocational +domains +torres +##sp +generator +folklore +outcomes +##keeper +canberra +shooter +fl +beams +confrontation +##lling +##gram +feb +aligned +forestry +pipeline +jax +motorway +conception +decay +##tos +coffin +##cott +stalin +1805 +escorted +minded +##nam +sitcom +purchasing +twilight +veronica +additions +passive +tensions +straw +123 +frequencies +1804 +refugee +cultivation +##iate +christie +clary +bulletin +crept +disposal +##rich +##zong +processor +crescent +##rol +bmw +emphasized +whale +nazis +aurora +##eng +dwelling +hauled +sponsors +toledo +mega +ideology +theatres +tessa +cerambycidae +saves +turtle +cone +suspects +kara +rusty +yelling +greeks +mozart +shades +cocked +participant +##tro +shire +spit +freeze +necessity +##cos +inmates +nielsen +councillors +loaned +uncommon +omar +peasants +botanical +offspring +daniels +formations +jokes +1794 +pioneers +sigma +licensing +##sus +wheelchair +polite +1807 +liquor +pratt +trustee +##uta +forewings +balloon +##zz +kilometre +camping +explicit +casually +shawn +foolish +teammates +nm +hassan +carrie +judged +satisfy +vanessa +knives +selective +cnn +flowed +##lice +eclipse +stressed +eliza +mathematician +cease +cultivated +##roy +commissions +browns +##ania +destroyers +sheridan +meadow +##rius +minerals +##cial +downstream +clash +gram +memoirs +ventures +baha +seymour +archie +midlands +edith +fare +flynn +invite +canceled +tiles +stabbed +boulder +incorporate +amended +camden +facial +mollusk +unreleased +descriptions +yoga +grabs +550 +raises +ramp +shiver +##rose +coined +pioneering +tunes +qing +warwick +tops +119 +melanie +giles +##rous +wandered +##inal +annexed +nov +30th +unnamed +##ished +organizational +airplane +normandy +stoke +whistle +blessing +violations +chased +holders +shotgun +##ctic +outlet +reactor +##vik +tires +tearing +shores +fortified +mascot +constituencies +nc +columnist +productive +tibet +##rta +lineage +hooked +oct +tapes +judging +cody +##gger +hansen +kashmir +triggered +##eva +solved +cliffs +##tree +resisted +anatomy +protesters +transparent +implied +##iga +injection +mattress +excluding +##mbo +defenses +helpless +devotion +##elli +growl +liberals +weber +phenomena +atoms +plug +##iff +mortality +apprentice +howe +convincing +aaa +swimmer +barber +leone +promptly +sodium +def +nowadays +arise +##oning +gloucester +corrected +dignity +norm +erie +##ders +elders +evacuated +sylvia +compression +##yar +hartford +pose +backpack +reasoning +accepts +24th +wipe +millimetres +marcel +##oda +dodgers +albion +1790 +overwhelmed +aerospace +oaks +1795 +showcase +acknowledge +recovering +nolan +ashe +hurts +geology +fashioned +disappearance +farewell +swollen +shrug +marquis +wimbledon +124 +rue +1792 +commemorate +reduces +experiencing +inevitable +calcutta +intel +##court +murderer +sticking +fisheries +imagery +bloom +280 +brake +##inus +gustav +hesitation +memorable +po +viral +beans +accidents +tunisia +antenna +spilled +consort +treatments +aye +perimeter +##gard +donation +hostage +migrated +banker +addiction +apex +lil +trout +##ously +conscience +##nova +rams +sands +genome +passionate +troubles +##lets +##set +amid +##ibility +##ret +higgins +exceed +vikings +##vie +payne +##zan +muscular +##ste +defendant +sucking +##wal +ibrahim +fuselage +claudia +vfl +europeans +snails +interval +##garh +preparatory +statewide +tasked +lacrosse +viktor +##lation +angola +##hra +flint +implications +employs +teens +patrons +stall +weekends +barriers +scrambled +nucleus +tehran +jenna +parsons +lifelong +robots +displacement +5000 +##bles +precipitation +##gt +knuckles +clutched +1802 +marrying +ecology +marx +accusations +declare +scars +kolkata +mat +meadows +bermuda +skeleton +finalists +vintage +crawl +coordinate +affects +subjected +orchestral +mistaken +##tc +mirrors +dipped +relied +260 +arches +candle +##nick +incorporating +wildly +fond +basilica +owl +fringe +rituals +whispering +stirred +feud +tertiary +slick +goat +honorable +whereby +skip +ricardo +stripes +parachute +adjoining +submerged +synthesizer +##gren +intend +positively +ninety +phi +beaver +partition +fellows +alexis +prohibition +carlisle +bizarre +fraternity +##bre +doubts +icy +cbc +aquatic +sneak +sonny +combines +airports +crude +supervised +spatial +merge +alfonso +##bic +corrupt +scan +undergo +##ams +disabilities +colombian +comparing +dolphins +perkins +##lish +reprinted +unanimous +bounced +hairs +underworld +midwest +semester +bucket +paperback +miniseries +coventry +demise +##leigh +demonstrations +sensor +rotating +yan +##hler +arrange +soils +##idge +hyderabad +labs +##dr +brakes +grandchildren +##nde +negotiated +rover +ferrari +continuation +directorate +augusta +stevenson +counterpart +gore +##rda +nursery +rican +ave +collectively +broadly +pastoral +repertoire +asserted +discovering +nordic +styled +fiba +cunningham +harley +middlesex +survives +tumor +tempo +zack +aiming +lok +urgent +##rade +##nto +devils +##ement +contractor +turin +##wl +##ool +bliss +repaired +simmons +moan +astronomical +cr +negotiate +lyric +1890s +lara +bred +clad +angus +pbs +##ience +engineered +posed +##lk +hernandez +possessions +elbows +psychiatric +strokes +confluence +electorate +lifts +campuses +lava +alps +##ep +##ution +##date +physicist +woody +##page +##ographic +##itis +juliet +reformation +sparhawk +320 +complement +suppressed +jewel +##½ +floated +##kas +continuity +sadly +##ische +inability +melting +scanning +paula +flour +judaism +safer +vague +##lm +solving +curb +##stown +financially +gable +bees +expired +miserable +cassidy +dominion +1789 +cupped +145 +robbery +facto +amos +warden +resume +tallest +marvin +ing +pounded +usd +declaring +gasoline +##aux +darkened +270 +650 +sophomore +##mere +erection +gossip +televised +risen +dial +##eu +pillars +##link +passages +profound +##tina +arabian +ashton +silicon +nail +##ead +##lated +##wer +##hardt +fleming +firearms +ducked +circuits +blows +waterloo +titans +##lina +atom +fireplace +cheshire +financed +activation +algorithms +##zzi +constituent +catcher +cherokee +partnerships +sexuality +platoon +tragic +vivian +guarded +whiskey +meditation +poetic +##late +##nga +##ake +porto +listeners +dominance +kendra +mona +chandler +factions +22nd +salisbury +attitudes +derivative +##ido +##haus +intake +paced +javier +illustrator +barrels +bias +cockpit +burnett +dreamed +ensuing +##anda +receptors +someday +hawkins +mattered +##lal +slavic +1799 +jesuit +cameroon +wasted +tai +wax +lowering +victorious +freaking +outright +hancock +librarian +sensing +bald +calcium +myers +tablet +announcing +barack +shipyard +pharmaceutical +##uan +greenwich +flush +medley +patches +wolfgang +pt +speeches +acquiring +exams +nikolai +##gg +hayden +kannada +##type +reilly +##pt +waitress +abdomen +devastated +capped +pseudonym +pharmacy +fulfill +paraguay +1796 +clicked +##trom +archipelago +syndicated +##hman +lumber +orgasm +rejection +clifford +lorraine +advent +mafia +rodney +brock +##ght +##used +##elia +cassette +chamberlain +despair +mongolia +sensors +developmental +upstream +##eg +##alis +spanning +165 +trombone +basque +seeded +interred +renewable +rhys +leapt +revision +molecule +##ages +chord +vicious +nord +shivered +23rd +arlington +debts +corpus +sunrise +bays +blackburn +centimetres +##uded +shuddered +gm +strangely +gripping +cartoons +isabelle +orbital +##ppa +seals +proving +##lton +refusal +strengthened +bust +assisting +baghdad +batsman +portrayal +mara +pushes +spears +og +##cock +reside +nathaniel +brennan +1776 +confirmation +caucus +##worthy +markings +yemen +nobles +ku +lazy +viewer +catalan +encompasses +sawyer +##fall +sparked +substances +patents +braves +arranger +evacuation +sergio +persuade +dover +tolerance +penguin +cum +jockey +insufficient +townships +occupying +declining +plural +processed +projection +puppet +flanders +introduces +liability +##yon +gymnastics +antwerp +taipei +hobart +candles +jeep +wes +observers +126 +chaplain +bundle +glorious +##hine +hazel +flung +sol +excavations +dumped +stares +sh +bangalore +triangular +icelandic +intervals +expressing +turbine +##vers +songwriting +crafts +##igo +jasmine +ditch +rite +##ways +entertaining +comply +sorrow +wrestlers +basel +emirates +marian +rivera +helpful +##some +caution +downward +networking +##atory +##tered +darted +genocide +emergence +replies +specializing +spokesman +convenient +unlocked +fading +augustine +concentrations +resemblance +elijah +investigator +andhra +##uda +promotes +bean +##rrell +fleeing +wan +simone +announcer +##ame +##bby +lydia +weaver +132 +residency +modification +##fest +stretches +##ast +alternatively +nat +lowe +lacks +##ented +pam +tile +concealed +inferior +abdullah +residences +tissues +vengeance +##ided +moisture +peculiar +groove +zip +bologna +jennings +ninja +oversaw +zombies +pumping +batch +livingston +emerald +installations +1797 +peel +nitrogen +rama +##fying +##star +schooling +strands +responding +werner +##ost +lime +casa +accurately +targeting +##rod +underway +##uru +hemisphere +lester +##yard +occupies +2d +griffith +angrily +reorganized +##owing +courtney +deposited +##dd +##30 +estadio +##ifies +dunn +exiled +##ying +checks +##combe +##о +##fly +successes +unexpectedly +blu +assessed +##flower +##ه +observing +sacked +spiders +kn +##tail +mu +nodes +prosperity +audrey +divisional +155 +broncos +tangled +adjust +feeds +erosion +paolo +surf +directory +snatched +humid +admiralty +screwed +gt +reddish +##nese +modules +trench +lamps +bind +leah +bucks +competes +##nz +##form +transcription +##uc +isles +violently +clutching +pga +cyclist +inflation +flats +ragged +unnecessary +##hian +stubborn +coordinated +harriet +baba +disqualified +330 +insect +wolfe +##fies +reinforcements +rocked +duel +winked +embraced +bricks +##raj +hiatus +defeats +pending +brightly +jealousy +##xton +##hm +##uki +lena +gdp +colorful +##dley +stein +kidney +##shu +underwear +wanderers +##haw +##icus +guardians +m³ +roared +habits +##wise +permits +gp +uranium +punished +disguise +bundesliga +elise +dundee +erotic +partisan +pi +collectors +float +individually +rendering +behavioral +bucharest +ser +hare +valerie +corporal +nutrition +proportional +##isa +immense +##kis +pavement +##zie +##eld +sutherland +crouched +1775 +##lp +suzuki +trades +endurance +operas +crosby +prayed +priory +rory +socially +##urn +gujarat +##pu +walton +cube +pasha +privilege +lennon +floods +thorne +waterfall +nipple +scouting +approve +##lov +minorities +voter +dwight +extensions +assure +ballroom +slap +dripping +privileges +rejoined +confessed +demonstrating +patriotic +yell +investor +##uth +pagan +slumped +squares +##cle +##kins +confront +bert +embarrassment +##aid +aston +urging +sweater +starr +yuri +brains +williamson +commuter +mortar +structured +selfish +exports +##jon +cds +##him +unfinished +##rre +mortgage +destinations +##nagar +canoe +solitary +buchanan +delays +magistrate +fk +##pling +motivation +##lier +##vier +recruiting +assess +##mouth +malik +antique +1791 +pius +rahman +reich +tub +zhou +smashed +airs +galway +xii +conditioning +honduras +discharged +dexter +##pf +lionel +129 +debates +lemon +tiffany +volunteered +dom +dioxide +procession +devi +sic +tremendous +advertisements +colts +transferring +verdict +hanover +decommissioned +utter +relate +pac +racism +##top +beacon +limp +similarity +terra +occurrence +ant +##how +becky +capt +updates +armament +richie +pal +##graph +halloween +mayo +##ssen +##bone +cara +serena +fcc +dolls +obligations +##dling +violated +lafayette +jakarta +exploitation +##ime +infamous +iconic +##lah +##park +kitty +moody +reginald +dread +spill +crystals +olivier +modeled +bluff +equilibrium +separating +notices +ordnance +extinction +onset +cosmic +attachment +sammy +expose +privy +anchored +##bil +abbott +admits +bending +baritone +emmanuel +policeman +vaughan +winged +climax +dresses +denny +polytechnic +mohamed +burmese +authentic +nikki +genetics +grandparents +homestead +gaza +postponed +metacritic +una +##sby +##bat +unstable +dissertation +##rial +##cian +curls +obscure +uncovered +bronx +praying +disappearing +##hoe +prehistoric +coke +turret +mutations +nonprofit +pits +monaco +##ي +##usion +prominently +dispatched +podium +##mir +uci +##uation +133 +fortifications +birthplace +kendall +##lby +##oll +preacher +rack +goodman +##rman +persistent +##ott +countless +jaime +recorder +lexington +persecution +jumps +renewal +wagons +##11 +crushing +##holder +decorations +##lake +abundance +wrath +laundry +£1 +garde +##rp +jeanne +beetles +peasant +##sl +splitting +caste +sergei +##rer +##ema +scripts +##ively +rub +satellites +##vor +inscribed +verlag +scrapped +gale +packages +chick +potato +slogan +kathleen +arabs +##culture +counterparts +reminiscent +choral +##tead +rand +retains +bushes +dane +accomplish +courtesy +closes +##oth +slaughter +hague +krakow +lawson +tailed +elias +ginger +##ttes +canopy +betrayal +rebuilding +turf +##hof +frowning +allegiance +brigades +kicks +rebuild +polls +alias +nationalism +td +rowan +audition +bowie +fortunately +recognizes +harp +dillon +horrified +##oro +renault +##tics +ropes +##α +presumed +rewarded +infrared +wiping +accelerated +illustration +##rid +presses +practitioners +badminton +##iard +detained +##tera +recognizing +relates +misery +##sies +##tly +reproduction +piercing +potatoes +thornton +esther +manners +hbo +##aan +ours +bullshit +ernie +perennial +sensitivity +illuminated +rupert +##jin +##iss +##ear +rfc +nassau +##dock +staggered +socialism +##haven +appointments +nonsense +prestige +sharma +haul +##tical +solidarity +gps +##ook +##rata +igor +pedestrian +##uit +baxter +tenants +wires +medication +unlimited +guiding +impacts +diabetes +##rama +sasha +pas +clive +extraction +131 +continually +constraints +##bilities +sonata +hunted +sixteenth +chu +planting +quote +mayer +pretended +abs +spat +##hua +ceramic +##cci +curtains +pigs +pitching +##dad +latvian +sore +dayton +##sted +##qi +patrols +slice +playground +##nted +shone +stool +apparatus +inadequate +mates +treason +##ija +desires +##liga +##croft +somalia +laurent +mir +leonardo +oracle +grape +obliged +chevrolet +thirteenth +stunning +enthusiastic +##ede +accounted +concludes +currents +basil +##kovic +drought +##rica +mai +##aire +shove +posting +##shed +pilgrimage +humorous +packing +fry +pencil +wines +smells +144 +marilyn +aching +newest +clung +bon +neighbours +sanctioned +##pie +mug +##stock +drowning +##mma +hydraulic +##vil +hiring +reminder +lilly +investigators +##ncies +sour +##eous +compulsory +packet +##rion +##graphic +##elle +cannes +##inate +depressed +##rit +heroic +importantly +theresa +##tled +conway +saturn +marginal +rae +##xia +corresponds +royce +pact +jasper +explosives +packaging +aluminium +##ttered +denotes +rhythmic +spans +assignments +hereditary +outlined +originating +sundays +lad +reissued +greeting +beatrice +##dic +pillar +marcos +plots +handbook +alcoholic +judiciary +avant +slides +extract +masculine +blur +##eum +##force +homage +trembled +owens +hymn +trey +omega +signaling +socks +accumulated +reacted +attic +theo +lining +angie +distraction +primera +talbot +##key +1200 +ti +creativity +billed +##hey +deacon +eduardo +identifies +proposition +dizzy +gunner +hogan +##yam +##pping +##hol +ja +##chan +jensen +reconstructed +##berger +clearance +darius +##nier +abe +harlem +plea +dei +circled +emotionally +notation +fascist +neville +exceeded +upwards +viable +ducks +##fo +workforce +racer +limiting +shri +##lson +possesses +1600 +kerr +moths +devastating +laden +disturbing +locking +##cture +gal +fearing +accreditation +flavor +aide +1870s +mountainous +##baum +melt +##ures +motel +texture +servers +soda +##mb +herd +##nium +erect +puzzled +hum +peggy +examinations +gould +testified +geoff +ren +devised +sacks +##law +denial +posters +grunted +cesar +tutor +ec +gerry +offerings +byrne +falcons +combinations +ct +incoming +pardon +rocking +26th +avengers +flared +mankind +seller +uttar +loch +nadia +stroking +exposing +##hd +fertile +ancestral +instituted +##has +noises +prophecy +taxation +eminent +vivid +pol +##bol +dart +indirect +multimedia +notebook +upside +displaying +adrenaline +referenced +geometric +##iving +progression +##ddy +blunt +announce +##far +implementing +##lav +aggression +liaison +cooler +cares +headache +plantations +gorge +dots +impulse +thickness +ashamed +averaging +kathy +obligation +precursor +137 +fowler +symmetry +thee +225 +hears +##rai +undergoing +ads +butcher +bowler +##lip +cigarettes +subscription +goodness +##ically +browne +##hos +##tech +kyoto +donor +##erty +damaging +friction +drifting +expeditions +hardened +prostitution +152 +fauna +blankets +claw +tossing +snarled +butterflies +recruits +investigative +coated +healed +138 +communal +hai +xiii +academics +boone +psychologist +restless +lahore +stephens +mba +brendan +foreigners +printer +##pc +ached +explode +27th +deed +scratched +dared +##pole +cardiac +1780 +okinawa +proto +commando +compelled +oddly +electrons +##base +replica +thanksgiving +##rist +sheila +deliberate +stafford +tidal +representations +hercules +ou +##path +##iated +kidnapping +lenses +##tling +deficit +samoa +mouths +consuming +computational +maze +granting +smirk +razor +fixture +ideals +inviting +aiden +nominal +##vs +issuing +julio +pitt +ramsey +docks +##oss +exhaust +##owed +bavarian +draped +anterior +mating +ethiopian +explores +noticing +##nton +discarded +convenience +hoffman +endowment +beasts +cartridge +mormon +paternal +probe +sleeves +interfere +lump +deadline +##rail +jenks +bulldogs +scrap +alternating +justified +reproductive +nam +seize +descending +secretariat +kirby +coupe +grouped +smash +panther +sedan +tapping +##18 +lola +cheer +germanic +unfortunate +##eter +unrelated +##fan +subordinate +##sdale +suzanne +advertisement +##ility +horsepower +##lda +cautiously +discourse +luigi +##mans +##fields +noun +prevalent +mao +schneider +everett +surround +governorate +kira +##avia +westward +##take +misty +rails +sustainability +134 +unused +##rating +packs +toast +unwilling +regulate +thy +suffrage +nile +awe +assam +definitions +travelers +affordable +##rb +conferred +sells +undefeated +beneficial +torso +basal +repeating +remixes +##pass +bahrain +cables +fang +##itated +excavated +numbering +statutory +##rey +deluxe +##lian +forested +ramirez +derbyshire +zeus +slamming +transfers +astronomer +banana +lottery +berg +histories +bamboo +##uchi +resurrection +posterior +bowls +vaguely +##thi +thou +preserving +tensed +offence +##inas +meyrick +callum +ridden +watt +langdon +tying +lowland +snorted +daring +truman +##hale +##girl +aura +overly +filing +weighing +goa +infections +philanthropist +saunders +eponymous +##owski +latitude +perspectives +reviewing +mets +commandant +radial +##kha +flashlight +reliability +koch +vowels +amazed +ada +elaine +supper +##rth +##encies +predator +debated +soviets +cola +##boards +##nah +compartment +crooked +arbitrary +fourteenth +##ctive +havana +majors +steelers +clips +profitable +ambush +exited +packers +##tile +nude +cracks +fungi +##е +limb +trousers +josie +shelby +tens +frederic +##ος +definite +smoothly +constellation +insult +baton +discs +lingering +##nco +conclusions +lent +staging +becker +grandpa +shaky +##tron +einstein +obstacles +sk +adverse +elle +economically +##moto +mccartney +thor +dismissal +motions +readings +nostrils +treatise +##pace +squeezing +evidently +prolonged +1783 +venezuelan +je +marguerite +beirut +takeover +shareholders +##vent +denise +digit +airplay +norse +##bbling +imaginary +pills +hubert +blaze +vacated +eliminating +##ello +vine +mansfield +##tty +retrospective +barrow +borne +clutch +bail +forensic +weaving +##nett +##witz +desktop +citadel +promotions +worrying +dorset +ieee +subdivided +##iating +manned +expeditionary +pickup +synod +chuckle +185 +barney +##rz +##ffin +functionality +karachi +litigation +meanings +uc +lick +turbo +anders +##ffed +execute +curl +oppose +ankles +typhoon +##د +##ache +##asia +linguistics +compassion +pressures +grazing +perfection +##iting +immunity +monopoly +muddy +backgrounds +136 +namibia +francesca +monitors +attracting +stunt +tuition +##ии +vegetable +##mates +##quent +mgm +jen +complexes +forts +##ond +cellar +bites +seventeenth +royals +flemish +failures +mast +charities +##cular +peruvian +capitals +macmillan +ipswich +outward +frigate +postgraduate +folds +employing +##ouse +concurrently +fiery +##tai +contingent +nightmares +monumental +nicaragua +##kowski +lizard +mal +fielding +gig +reject +##pad +harding +##ipe +coastline +##cin +##nos +beethoven +humphrey +innovations +##tam +##nge +norris +doris +solicitor +huang +obey +141 +##lc +niagara +##tton +shelves +aug +bourbon +curry +nightclub +specifications +hilton +##ndo +centennial +dispersed +worm +neglected +briggs +sm +font +kuala +uneasy +plc +##nstein +##bound +##aking +##burgh +awaiting +pronunciation +##bbed +##quest +eh +optimal +zhu +raped +greens +presided +brenda +worries +##life +venetian +marxist +turnout +##lius +refined +braced +sins +grasped +sunderland +nickel +speculated +lowell +cyrillic +communism +fundraising +resembling +colonists +mutant +freddie +usc +##mos +gratitude +##run +mural +##lous +chemist +wi +reminds +28th +steals +tess +pietro +##ingen +promoter +ri +microphone +honoured +rai +sant +##qui +feather +##nson +burlington +kurdish +terrorists +deborah +sickness +##wed +##eet +hazard +irritated +desperation +veil +clarity +##rik +jewels +xv +##gged +##ows +##cup +berkshire +unfair +mysteries +orchid +winced +exhaustion +renovations +stranded +obe +infinity +##nies +adapt +redevelopment +thanked +registry +olga +domingo +noir +tudor +ole +##atus +commenting +behaviors +##ais +crisp +pauline +probable +stirling +wigan +##bian +paralympics +panting +surpassed +##rew +luca +barred +pony +famed +##sters +cassandra +waiter +carolyn +exported +##orted +andres +destructive +deeds +jonah +castles +vacancy +suv +##glass +1788 +orchard +yep +famine +belarusian +sprang +##forth +skinny +##mis +administrators +rotterdam +zambia +zhao +boiler +discoveries +##ride +##physics +lucius +disappointing +outreach +spoon +##frame +qualifications +unanimously +enjoys +regency +##iidae +stade +realism +veterinary +rodgers +dump +alain +chestnut +castile +censorship +rumble +gibbs +##itor +communion +reggae +inactivated +logs +loads +##houses +homosexual +##iano +ale +informs +##cas +phrases +plaster +linebacker +ambrose +kaiser +fascinated +850 +limerick +recruitment +forge +mastered +##nding +leinster +rooted +threaten +##strom +borneo +##hes +suggestions +scholarships +propeller +documentaries +patronage +coats +constructing +invest +neurons +comet +entirety +shouts +identities +annoying +unchanged +wary +##antly +##ogy +neat +oversight +##kos +phillies +replay +constance +##kka +incarnation +humble +skies +minus +##acy +smithsonian +##chel +guerrilla +jar +cadets +##plate +surplus +audit +##aru +cracking +joanna +louisa +pacing +##lights +intentionally +##iri +diner +nwa +imprint +australians +tong +unprecedented +bunker +naive +specialists +ark +nichols +railing +leaked +pedal +##uka +shrub +longing +roofs +v8 +captains +neural +tuned +##ntal +##jet +emission +medina +frantic +codex +definitive +sid +abolition +intensified +stocks +enrique +sustain +genoa +oxide +##written +clues +cha +##gers +tributaries +fragment +venom +##rity +##ente +##sca +muffled +vain +sire +laos +##ingly +##hana +hastily +snapping +surfaced +sentiment +motive +##oft +contests +approximate +mesa +luckily +dinosaur +exchanges +propelled +accord +bourne +relieve +tow +masks +offended +##ues +cynthia +##mmer +rains +bartender +zinc +reviewers +lois +##sai +legged +arrogant +rafe +rosie +comprise +handicap +blockade +inlet +lagoon +copied +drilling +shelley +petals +##inian +mandarin +obsolete +##inated +onward +arguably +productivity +cindy +praising +seldom +busch +discusses +raleigh +shortage +ranged +stanton +encouragement +firstly +conceded +overs +temporal +##uke +cbe +##bos +woo +certainty +pumps +##pton +stalked +##uli +lizzie +periodic +thieves +weaker +##night +gases +shoving +chooses +wc +##chemical +prompting +weights +##kill +robust +flanked +sticky +hu +tuberculosis +##eb +##eal +christchurch +resembled +wallet +reese +inappropriate +pictured +distract +fixing +fiddle +giggled +burger +heirs +hairy +mechanic +torque +apache +obsessed +chiefly +cheng +logging +##tag +extracted +meaningful +numb +##vsky +gloucestershire +reminding +##bay +unite +##lit +breeds +diminished +clown +glove +1860s +##ن +##ug +archibald +focal +freelance +sliced +depiction +##yk +organism +switches +sights +stray +crawling +##ril +lever +leningrad +interpretations +loops +anytime +reel +alicia +delighted +##ech +inhaled +xiv +suitcase +bernie +vega +licenses +northampton +exclusion +induction +monasteries +racecourse +homosexuality +##right +##sfield +##rky +dimitri +michele +alternatives +ions +commentators +genuinely +objected +pork +hospitality +fencing +stephan +warships +peripheral +wit +drunken +wrinkled +quentin +spends +departing +chung +numerical +spokesperson +##zone +johannesburg +caliber +killers +##udge +assumes +neatly +demographic +abigail +bloc +##vel +mounting +##lain +bentley +slightest +xu +recipients +##jk +merlin +##writer +seniors +prisons +blinking +hindwings +flickered +kappa +##hel +80s +strengthening +appealing +brewing +gypsy +mali +lashes +hulk +unpleasant +harassment +bio +treaties +predict +instrumentation +pulp +troupe +boiling +mantle +##ffe +ins +##vn +dividing +handles +verbs +##onal +coconut +senegal +340 +thorough +gum +momentarily +##sto +cocaine +panicked +destined +##turing +teatro +denying +weary +captained +mans +##hawks +##code +wakefield +bollywood +thankfully +##16 +cyril +##wu +amendments +##bahn +consultation +stud +reflections +kindness +1787 +internally +##ovo +tex +mosaic +distribute +paddy +seeming +143 +##hic +piers +##15 +##mura +##verse +popularly +winger +kang +sentinel +mccoy +##anza +covenant +##bag +verge +fireworks +suppress +thrilled +dominate +##jar +swansea +##60 +142 +reconciliation +##ndi +stiffened +cue +dorian +##uf +damascus +amor +ida +foremost +##aga +porsche +unseen +dir +##had +##azi +stony +lexi +melodies +##nko +angular +integer +podcast +ants +inherent +jaws +justify +persona +##olved +josephine +##nr +##ressed +customary +flashes +gala +cyrus +glaring +backyard +ariel +physiology +greenland +html +stir +avon +atletico +finch +methodology +ked +##lent +mas +catholicism +townsend +branding +quincy +fits +containers +1777 +ashore +aragon +##19 +forearm +poisoning +##sd +adopting +conquer +grinding +amnesty +keller +finances +evaluate +forged +lankan +instincts +##uto +guam +bosnian +photographed +workplace +desirable +protector +##dog +allocation +intently +encourages +willy +##sten +bodyguard +electro +brighter +##ν +bihar +##chev +lasts +opener +amphibious +sal +verde +arte +##cope +captivity +vocabulary +yields +##tted +agreeing +desmond +pioneered +##chus +strap +campaigned +railroads +##ович +emblem +##dre +stormed +501 +##ulous +marijuana +northumberland +##gn +##nath +bowen +landmarks +beaumont +##qua +danube +##bler +attorneys +th +ge +flyers +critique +villains +cass +mutation +acc +##0s +colombo +mckay +motif +sampling +concluding +syndicate +##rell +neon +stables +ds +warnings +clint +mourning +wilkinson +##tated +merrill +leopard +evenings +exhaled +emil +sonia +ezra +discrete +stove +farrell +fifteenth +prescribed +superhero +##rier +worms +helm +wren +##duction +##hc +expo +##rator +hq +unfamiliar +antony +prevents +acceleration +fiercely +mari +painfully +calculations +cheaper +ign +clifton +irvine +davenport +mozambique +##np +pierced +##evich +wonders +##wig +##cate +##iling +crusade +ware +##uel +enzymes +reasonably +mls +##coe +mater +ambition +bunny +eliot +kernel +##fin +asphalt +headmaster +torah +aden +lush +pins +waived +##care +##yas +joao +substrate +enforce +##grad +##ules +alvarez +selections +epidemic +tempted +##bit +bremen +translates +ensured +waterfront +29th +forrest +manny +malone +kramer +reigning +cookies +simpler +absorption +205 +engraved +##ffy +evaluated +1778 +haze +146 +comforting +crossover +##abe +thorn +##rift +##imo +##pop +suppression +fatigue +cutter +##tr +201 +wurttemberg +##orf +enforced +hovering +proprietary +gb +samurai +syllable +ascent +lacey +tick +lars +tractor +merchandise +rep +bouncing +defendants +##yre +huntington +##ground +##oko +standardized +##hor +##hima +assassinated +nu +predecessors +rainy +liar +assurance +lyrical +##uga +secondly +flattened +ios +parameter +undercover +##mity +bordeaux +punish +ridges +markers +exodus +inactive +hesitate +debbie +nyc +pledge +savoy +nagar +offset +organist +##tium +hesse +marin +converting +##iver +diagram +propulsion +pu +validity +reverted +supportive +##dc +ministries +clans +responds +proclamation +##inae +##ø +##rea +ein +pleading +patriot +sf +birch +islanders +strauss +hates +##dh +brandenburg +concession +rd +##ob +1900s +killings +textbook +antiquity +cinematography +wharf +embarrassing +setup +creed +farmland +inequality +centred +signatures +fallon +370 +##ingham +##uts +ceylon +gazing +directive +laurie +##tern +globally +##uated +##dent +allah +excavation +threads +##cross +148 +frantically +icc +utilize +determines +respiratory +thoughtful +receptions +##dicate +merging +chandra +seine +147 +builders +builds +diagnostic +dev +visibility +goddamn +analyses +dhaka +cho +proves +chancel +concurrent +curiously +canadians +pumped +restoring +1850s +turtles +jaguar +sinister +spinal +traction +declan +vows +1784 +glowed +capitalism +swirling +install +universidad +##lder +##oat +soloist +##genic +##oor +coincidence +beginnings +nissan +dip +resorts +caucasus +combustion +infectious +##eno +pigeon +serpent +##itating +conclude +masked +salad +jew +##gr +surreal +toni +##wc +harmonica +151 +##gins +##etic +##coat +fishermen +intending +bravery +##wave +klaus +titan +wembley +taiwanese +ransom +40th +incorrect +hussein +eyelids +jp +cooke +dramas +utilities +##etta +##print +eisenhower +principally +granada +lana +##rak +openings +concord +##bl +bethany +connie +morality +sega +##mons +##nard +earnings +##kara +##cine +wii +communes +##rel +coma +composing +softened +severed +grapes +##17 +nguyen +analyzed +warlord +hubbard +heavenly +behave +slovenian +##hit +##ony +hailed +filmmakers +trance +caldwell +skye +unrest +coward +likelihood +##aging +bern +sci +taliban +honolulu +propose +##wang +1700 +browser +imagining +cobra +contributes +dukes +instinctively +conan +violinist +##ores +accessories +gradual +##amp +quotes +sioux +##dating +undertake +intercepted +sparkling +compressed +139 +fungus +tombs +haley +imposing +rests +degradation +lincolnshire +retailers +wetlands +tulsa +distributor +dungeon +nun +greenhouse +convey +atlantis +aft +exits +oman +dresser +lyons +##sti +joking +eddy +judgement +omitted +digits +##cts +##game +juniors +##rae +cents +stricken +une +##ngo +wizards +weir +breton +nan +technician +fibers +liking +royalty +##cca +154 +persia +terribly +magician +##rable +##unt +vance +cafeteria +booker +camille +warmer +##static +consume +cavern +gaps +compass +contemporaries +foyer +soothing +graveyard +maj +plunged +blush +##wear +cascade +demonstrates +ordinance +##nov +boyle +##lana +rockefeller +shaken +banjo +izzy +##ense +breathless +vines +##32 +##eman +alterations +chromosome +dwellings +feudal +mole +153 +catalonia +relics +tenant +mandated +##fm +fridge +hats +honesty +patented +raul +heap +cruisers +accusing +enlightenment +infants +wherein +chatham +contractors +zen +affinity +hc +osborne +piston +156 +traps +maturity +##rana +lagos +##zal +peering +##nay +attendant +dealers +protocols +subset +prospects +biographical +##cre +artery +##zers +insignia +nuns +endured +##eration +recommend +schwartz +serbs +berger +cromwell +crossroads +##ctor +enduring +clasped +grounded +##bine +marseille +twitched +abel +choke +https +catalyst +moldova +italians +##tist +disastrous +wee +##oured +##nti +wwf +nope +##piration +##asa +expresses +thumbs +167 +##nza +coca +1781 +cheating +##ption +skipped +sensory +heidelberg +spies +satan +dangers +semifinal +202 +bohemia +whitish +confusing +shipbuilding +relies +surgeons +landings +ravi +baku +moor +suffix +alejandro +##yana +litre +upheld +##unk +rajasthan +##rek +coaster +insists +posture +scenarios +etienne +favoured +appoint +transgender +elephants +poked +greenwood +defences +fulfilled +militant +somali +1758 +chalk +potent +##ucci +migrants +wink +assistants +nos +restriction +activism +niger +##ario +colon +shaun +##sat +daphne +##erated +swam +congregations +reprise +considerations +magnet +playable +xvi +##р +overthrow +tobias +knob +chavez +coding +##mers +propped +katrina +orient +newcomer +##suke +temperate +##pool +farmhouse +interrogation +##vd +committing +##vert +forthcoming +strawberry +joaquin +macau +ponds +shocking +siberia +##cellular +chant +contributors +##nant +##ologists +sped +absorb +hail +1782 +spared +##hore +barbados +karate +opus +originates +saul +##xie +evergreen +leaped +##rock +correlation +exaggerated +weekday +unification +bump +tracing +brig +afb +pathways +utilizing +##ners +mod +mb +disturbance +kneeling +##stad +##guchi +100th +pune +##thy +decreasing +168 +manipulation +miriam +academia +ecosystem +occupational +rbi +##lem +rift +##14 +rotary +stacked +incorporation +awakening +generators +guerrero +racist +##omy +cyber +derivatives +culminated +allie +annals +panzer +sainte +wikipedia +pops +zu +austro +##vate +algerian +politely +nicholson +mornings +educate +tastes +thrill +dartmouth +##gating +db +##jee +regan +differing +concentrating +choreography +divinity +##media +pledged +alexandre +routing +gregor +madeline +##idal +apocalypse +##hora +gunfire +culminating +elves +fined +liang +lam +programmed +tar +guessing +transparency +gabrielle +##gna +cancellation +flexibility +##lining +accession +shea +stronghold +nets +specializes +##rgan +abused +hasan +sgt +ling +exceeding +##₄ +admiration +supermarket +##ark +photographers +specialised +tilt +resonance +hmm +perfume +380 +sami +threatens +garland +botany +guarding +boiled +greet +puppy +russo +supplier +wilmington +vibrant +vijay +##bius +paralympic +grumbled +paige +faa +licking +margins +hurricanes +##gong +fest +grenade +ripping +##uz +counseling +weigh +##sian +needles +wiltshire +edison +costly +##not +fulton +tramway +redesigned +staffordshire +cache +gasping +watkins +sleepy +candidacy +##group +monkeys +timeline +throbbing +##bid +##sos +berth +uzbekistan +vanderbilt +bothering +overturned +ballots +gem +##iger +sunglasses +subscribers +hooker +compelling +ang +exceptionally +saloon +stab +##rdi +carla +terrifying +rom +##vision +coil +##oids +satisfying +vendors +31st +mackay +deities +overlooked +ambient +bahamas +felipe +olympia +whirled +botanist +advertised +tugging +##dden +disciples +morales +unionist +rites +foley +morse +motives +creepy +##₀ +soo +##sz +bargain +highness +frightening +turnpike +tory +reorganization +##cer +depict +biographer +##walk +unopposed +manifesto +##gles +institut +emile +accidental +kapoor +##dam +kilkenny +cortex +lively +##13 +romanesque +jain +shan +cannons +##ood +##ske +petrol +echoing +amalgamated +disappears +cautious +proposes +sanctions +trenton +##ر +flotilla +aus +contempt +tor +canary +cote +theirs +##hun +conceptual +deleted +fascinating +paso +blazing +elf +honourable +hutchinson +##eiro +##outh +##zin +surveyor +tee +amidst +wooded +reissue +intro +##ono +cobb +shelters +newsletter +hanson +brace +encoding +confiscated +dem +caravan +marino +scroll +melodic +cows +imam +##adi +##aneous +northward +searches +biodiversity +cora +310 +roaring +##bers +connell +theologian +halo +compose +pathetic +unmarried +dynamo +##oot +az +calculation +toulouse +deserves +humour +nr +forgiveness +tam +undergone +martyr +pamela +myths +whore +counselor +hicks +290 +heavens +battleship +electromagnetic +##bbs +stellar +establishments +presley +hopped +##chin +temptation +90s +wills +nas +##yuan +nhs +##nya +seminars +##yev +adaptations +gong +asher +lex +indicator +sikh +tobago +cites +goin +##yte +satirical +##gies +characterised +correspond +bubbles +lure +participates +##vid +eruption +skate +therapeutic +1785 +canals +wholesale +defaulted +sac +460 +petit +##zzled +virgil +leak +ravens +256 +portraying +##yx +ghetto +creators +dams +portray +vicente +##rington +fae +namesake +bounty +##arium +joachim +##ota +##iser +aforementioned +axle +snout +depended +dismantled +reuben +480 +##ibly +gallagher +##lau +##pd +earnest +##ieu +##iary +inflicted +objections +##llar +asa +gritted +##athy +jericho +##sea +##was +flick +underside +ceramics +undead +substituted +195 +eastward +undoubtedly +wheeled +chimney +##iche +guinness +cb +##ager +siding +##bell +traitor +baptiste +disguised +inauguration +149 +tipperary +choreographer +perched +warmed +stationary +eco +##ike +##ntes +bacterial +##aurus +flores +phosphate +##core +attacker +invaders +alvin +intersects +a1 +indirectly +immigrated +businessmen +cornelius +valves +narrated +pill +sober +ul +nationale +monastic +applicants +scenery +##jack +161 +motifs +constitutes +cpu +##osh +jurisdictions +sd +tuning +irritation +woven +##uddin +fertility +gao +##erie +antagonist +impatient +glacial +hides +boarded +denominations +interception +##jas +cookie +nicola +##tee +algebraic +marquess +bahn +parole +buyers +bait +turbines +paperwork +bestowed +natasha +renee +oceans +purchases +157 +vaccine +215 +##tock +fixtures +playhouse +integrate +jai +oswald +intellectuals +##cky +booked +nests +mortimer +##isi +obsession +sept +##gler +##sum +440 +scrutiny +simultaneous +squinted +##shin +collects +oven +shankar +penned +remarkably +##я +slips +luggage +spectral +1786 +collaborations +louie +consolidation +##ailed +##ivating +420 +hoover +blackpool +harness +ignition +vest +tails +belmont +mongol +skinner +##nae +visually +mage +derry +##tism +##unce +stevie +transitional +##rdy +redskins +drying +prep +prospective +##21 +annoyance +oversee +##loaded +fills +##books +##iki +announces +fda +scowled +respects +prasad +mystic +tucson +##vale +revue +springer +bankrupt +1772 +aristotle +salvatore +habsburg +##geny +dal +natal +nut +pod +chewing +darts +moroccan +walkover +rosario +lenin +punjabi +##ße +grossed +scattering +wired +invasive +hui +polynomial +corridors +wakes +gina +portrays +##cratic +arid +retreating +erich +irwin +sniper +##dha +linen +lindsey +maneuver +butch +shutting +socio +bounce +commemorative +postseason +jeremiah +pines +275 +mystical +beads +bp +abbas +furnace +bidding +consulted +assaulted +empirical +rubble +enclosure +sob +weakly +cancel +polly +yielded +##emann +curly +prediction +battered +70s +vhs +jacqueline +render +sails +barked +detailing +grayson +riga +sloane +raging +##yah +herbs +bravo +##athlon +alloy +giggle +imminent +suffers +assumptions +waltz +##itate +accomplishments +##ited +bathing +remixed +deception +prefix +##emia +deepest +##tier +##eis +balkan +frogs +##rong +slab +##pate +philosophers +peterborough +grains +imports +dickinson +rwanda +##atics +1774 +dirk +lan +tablets +##rove +clone +##rice +caretaker +hostilities +mclean +##gre +regimental +treasures +norms +impose +tsar +tango +diplomacy +variously +complain +192 +recognise +arrests +1779 +celestial +pulitzer +##dus +bing +libretto +##moor +adele +splash +##rite +expectation +lds +confronts +##izer +spontaneous +harmful +wedge +entrepreneurs +buyer +##ope +bilingual +translate +rugged +conner +circulated +uae +eaton +##gra +##zzle +lingered +lockheed +vishnu +reelection +alonso +##oom +joints +yankee +headline +cooperate +heinz +laureate +invading +##sford +echoes +scandinavian +##dham +hugging +vitamin +salute +micah +hind +trader +##sper +radioactive +##ndra +militants +poisoned +ratified +remark +campeonato +deprived +wander +prop +##dong +outlook +##tani +##rix +##eye +chiang +darcy +##oping +mandolin +spice +statesman +babylon +182 +walled +forgetting +afro +##cap +158 +giorgio +buffer +##polis +planetary +##gis +overlap +terminals +kinda +centenary +##bir +arising +manipulate +elm +ke +1770 +ak +##tad +chrysler +mapped +moose +pomeranian +quad +macarthur +assemblies +shoreline +recalls +stratford +##rted +noticeable +##evic +imp +##rita +##sque +accustomed +supplying +tents +disgusted +vogue +sipped +filters +khz +reno +selecting +luftwaffe +mcmahon +tyne +masterpiece +carriages +collided +dunes +exercised +flare +remembers +muzzle +##mobile +heck +##rson +burgess +lunged +middleton +boycott +bilateral +##sity +hazardous +lumpur +multiplayer +spotlight +jackets +goldman +liege +porcelain +rag +waterford +benz +attracts +hopeful +battling +ottomans +kensington +baked +hymns +cheyenne +lattice +levine +borrow +polymer +clashes +michaels +monitored +commitments +denounced +##25 +##von +cavity +##oney +hobby +akin +##holders +futures +intricate +cornish +patty +##oned +illegally +dolphin +##lag +barlow +yellowish +maddie +apologized +luton +plagued +##puram +nana +##rds +sway +fanny +łodz +##rino +psi +suspicions +hanged +##eding +initiate +charlton +##por +nak +competent +235 +analytical +annex +wardrobe +reservations +##rma +sect +162 +fairfax +hedge +piled +buckingham +uneven +bauer +simplicity +snyder +interpret +accountability +donors +moderately +byrd +continents +##cite +##max +disciple +hr +jamaican +ping +nominees +##uss +mongolian +diver +attackers +eagerly +ideological +pillows +miracles +apartheid +revolver +sulfur +clinics +moran +163 +##enko +ile +katy +rhetoric +##icated +chronology +recycling +##hrer +elongated +mughal +pascal +profiles +vibration +databases +domination +##fare +##rant +matthias +digest +rehearsal +polling +weiss +initiation +reeves +clinging +flourished +impress +ngo +##hoff +##ume +buckley +symposium +rhythms +weed +emphasize +transforming +##taking +##gence +##yman +accountant +analyze +flicker +foil +priesthood +voluntarily +decreases +##80 +##hya +slater +sv +charting +mcgill +##lde +moreno +##iu +besieged +zur +robes +##phic +admitting +api +deported +turmoil +peyton +earthquakes +##ares +nationalists +beau +clair +brethren +interrupt +welch +curated +galerie +requesting +164 +##ested +impending +steward +viper +##vina +complaining +beautifully +brandy +foam +nl +1660 +##cake +alessandro +punches +laced +explanations +##lim +attribute +clit +reggie +discomfort +##cards +smoothed +whales +##cene +adler +countered +duffy +disciplinary +widening +recipe +reliance +conducts +goats +gradient +preaching +##shaw +matilda +quasi +striped +meridian +cannabis +cordoba +certificates +##agh +##tering +graffiti +hangs +pilgrims +repeats +##ych +revive +urine +etat +##hawk +fueled +belts +fuzzy +susceptible +##hang +mauritius +salle +sincere +beers +hooks +##cki +arbitration +entrusted +advise +sniffed +seminar +junk +donnell +processors +principality +strapped +celia +mendoza +everton +fortunes +prejudice +starving +reassigned +steamer +##lund +tuck +evenly +foreman +##ffen +dans +375 +envisioned +slit +##xy +baseman +liberia +rosemary +##weed +electrified +periodically +potassium +stride +contexts +sperm +slade +mariners +influx +bianca +subcommittee +##rane +spilling +icao +estuary +##nock +delivers +iphone +##ulata +isa +mira +bohemian +dessert +##sbury +welcoming +proudly +slowing +##chs +musee +ascension +russ +##vian +waits +##psy +africans +exploit +##morphic +gov +eccentric +crab +peck +##ull +entrances +formidable +marketplace +groom +bolted +metabolism +patton +robbins +courier +payload +endure +##ifier +andes +refrigerator +##pr +ornate +##uca +ruthless +illegitimate +masonry +strasbourg +bikes +adobe +##³ +apples +quintet +willingly +niche +bakery +corpses +energetic +##cliffe +##sser +##ards +177 +centimeters +centro +fuscous +cretaceous +rancho +##yde +andrei +telecom +tottenham +oasis +ordination +vulnerability +presiding +corey +cp +penguins +sims +##pis +malawi +piss +##48 +correction +##cked +##ffle +##ryn +countdown +detectives +psychiatrist +psychedelic +dinosaurs +blouse +##get +choi +vowed +##oz +randomly +##pol +49ers +scrub +blanche +bruins +dusseldorf +##using +unwanted +##ums +212 +dominique +elevations +headlights +om +laguna +##oga +1750 +famously +ignorance +shrewsbury +##aine +ajax +breuning +che +confederacy +greco +overhaul +##screen +paz +skirts +disagreement +cruelty +jagged +phoebe +shifter +hovered +viruses +##wes +mandy +##lined +##gc +landlord +squirrel +dashed +##ι +ornamental +gag +wally +grange +literal +spurs +undisclosed +proceeding +yin +##text +billie +orphan +spanned +humidity +indy +weighted +presentations +explosions +lucian +##tary +vaughn +hindus +##anga +##hell +psycho +171 +daytona +protects +efficiently +rematch +sly +tandem +##oya +rebranded +impaired +hee +metropolis +peach +godfrey +diaspora +ethnicity +prosperous +gleaming +dar +grossing +playback +##rden +stripe +pistols +##tain +births +labelled +##cating +172 +rudy +alba +##onne +aquarium +hostility +##gb +##tase +shudder +sumatra +hardest +lakers +consonant +creeping +demos +homicide +capsule +zeke +liberties +expulsion +pueblo +##comb +trait +transporting +##ddin +##neck +##yna +depart +gregg +mold +ledge +hangar +oldham +playboy +termination +analysts +gmbh +romero +##itic +insist +cradle +filthy +brightness +slash +shootout +deposed +bordering +##truct +isis +microwave +tumbled +sheltered +cathy +werewolves +messy +andersen +convex +clapped +clinched +satire +wasting +edo +vc +rufus +##jak +mont +##etti +poznan +##keeping +restructuring +transverse +##rland +azerbaijani +slovene +gestures +roommate +choking +shear +##quist +vanguard +oblivious +##hiro +disagreed +baptism +##lich +coliseum +##aceae +salvage +societe +cory +locke +relocation +relying +versailles +ahl +swelling +##elo +cheerful +##word +##edes +gin +sarajevo +obstacle +diverted +##nac +messed +thoroughbred +fluttered +utrecht +chewed +acquaintance +assassins +dispatch +mirza +##wart +nike +salzburg +swell +yen +##gee +idle +ligue +samson +##nds +##igh +playful +spawned +##cise +tease +##case +burgundy +##bot +stirring +skeptical +interceptions +marathi +##dies +bedrooms +aroused +pinch +##lik +preferences +tattoos +buster +digitally +projecting +rust +##ital +kitten +priorities +addison +pseudo +##guard +dusk +icons +sermon +##psis +##iba +bt +##lift +##xt +ju +truce +rink +##dah +##wy +defects +psychiatry +offences +calculate +glucose +##iful +##rized +##unda +francaise +##hari +richest +warwickshire +carly +1763 +purity +redemption +lending +##cious +muse +bruises +cerebral +aero +carving +##name +preface +terminology +invade +monty +##int +anarchist +blurred +##iled +rossi +treats +guts +shu +foothills +ballads +undertaking +premise +cecilia +affiliates +blasted +conditional +wilder +minors +drone +rudolph +buffy +swallowing +horton +attested +##hop +rutherford +howell +primetime +livery +penal +##bis +minimize +hydro +wrecked +wrought +palazzo +##gling +cans +vernacular +friedman +nobleman +shale +walnut +danielle +##ection +##tley +sears +##kumar +chords +lend +flipping +streamed +por +dracula +gallons +sacrifices +gamble +orphanage +##iman +mckenzie +##gible +boxers +daly +##balls +##ان +208 +##ific +##rative +##iq +exploited +slated +##uity +circling +hillary +pinched +goldberg +provost +campaigning +lim +piles +ironically +jong +mohan +successors +usaf +##tem +##ught +autobiographical +haute +preserves +##ending +acquitted +comparisons +203 +hydroelectric +gangs +cypriot +torpedoes +rushes +chrome +derive +bumps +instability +fiat +pets +##mbe +silas +dye +reckless +settler +##itation +info +heats +##writing +176 +canonical +maltese +fins +mushroom +stacy +aspen +avid +##kur +##loading +vickers +gaston +hillside +statutes +wilde +gail +kung +sabine +comfortably +motorcycles +##rgo +169 +pneumonia +fetch +##sonic +axel +faintly +parallels +##oop +mclaren +spouse +compton +interdisciplinary +miner +##eni +181 +clamped +##chal +##llah +separates +versa +##mler +scarborough +labrador +##lity +##osing +rutgers +hurdles +como +166 +burt +divers +##100 +wichita +cade +coincided +##erson +bruised +mla +##pper +vineyard +##ili +##brush +notch +mentioning +jase +hearted +kits +doe +##acle +pomerania +##ady +ronan +seizure +pavel +problematic +##zaki +domenico +##ulin +catering +penelope +dependence +parental +emilio +ministerial +atkinson +##bolic +clarkson +chargers +colby +grill +peeked +arises +summon +##aged +fools +##grapher +faculties +qaeda +##vial +garner +refurbished +##hwa +geelong +disasters +nudged +bs +shareholder +lori +algae +reinstated +rot +##ades +##nous +invites +stainless +183 +inclusive +##itude +diocesan +til +##icz +denomination +##xa +benton +floral +registers +##ider +##erman +##kell +absurd +brunei +guangzhou +hitter +retaliation +##uled +##eve +blanc +nh +consistency +contamination +##eres +##rner +dire +palermo +broadcasters +diaries +inspire +vols +brewer +tightening +ky +mixtape +hormone +##tok +stokes +##color +##dly +##ssi +pg +##ometer +##lington +sanitation +##tility +intercontinental +apps +##adt +¹⁄₂ +cylinders +economies +favourable +unison +croix +gertrude +odyssey +vanity +dangling +##logists +upgrades +dice +middleweight +practitioner +##ight +206 +henrik +parlor +orion +angered +lac +python +blurted +##rri +sensual +intends +swings +angled +##phs +husky +attain +peerage +precinct +textiles +cheltenham +shuffled +dai +confess +tasting +bhutan +##riation +tyrone +segregation +abrupt +ruiz +##rish +smirked +blackwell +confidential +browning +amounted +##put +vase +scarce +fabulous +raided +staple +guyana +unemployed +glider +shay +##tow +carmine +troll +intervene +squash +superstar +##uce +cylindrical +len +roadway +researched +handy +##rium +##jana +meta +lao +declares +##rring +##tadt +##elin +##kova +willem +shrubs +napoleonic +realms +skater +qi +volkswagen +##ł +tad +hara +archaeologist +awkwardly +eerie +##kind +wiley +##heimer +##24 +titus +organizers +cfl +crusaders +lama +usb +vent +enraged +thankful +occupants +maximilian +##gaard +possessing +textbooks +##oran +collaborator +quaker +##ulo +avalanche +mono +silky +straits +isaiah +mustang +surged +resolutions +potomac +descend +cl +kilograms +plato +strains +saturdays +##olin +bernstein +##ype +holstein +ponytail +##watch +belize +conversely +heroine +perpetual +##ylus +charcoal +piedmont +glee +negotiating +backdrop +prologue +##jah +##mmy +pasadena +climbs +ramos +sunni +##holm +##tner +##tri +anand +deficiency +hertfordshire +stout +##avi +aperture +orioles +##irs +doncaster +intrigued +bombed +coating +otis +##mat +cocktail +##jit +##eto +amir +arousal +sar +##proof +##act +##ories +dixie +pots +##bow +whereabouts +159 +##fted +drains +bullying +cottages +scripture +coherent +fore +poe +appetite +##uration +sampled +##ators +##dp +derrick +rotor +jays +peacock +installment +##rro +advisors +##coming +rodeo +scotch +##mot +##db +##fen +##vant +ensued +rodrigo +dictatorship +martyrs +twenties +##н +towed +incidence +marta +rainforest +sai +scaled +##cles +oceanic +qualifiers +symphonic +mcbride +dislike +generalized +aubrey +colonization +##iation +##lion +##ssing +disliked +lublin +salesman +##ulates +spherical +whatsoever +sweating +avalon +contention +punt +severity +alderman +atari +##dina +##grant +##rop +scarf +seville +vertices +annexation +fairfield +fascination +inspiring +launches +palatinate +regretted +##rca +feral +##iom +elk +nap +olsen +reddy +yong +##leader +##iae +garment +transports +feng +gracie +outrage +viceroy +insides +##esis +breakup +grady +organizer +softer +grimaced +222 +murals +galicia +arranging +vectors +##rsten +bas +##sb +##cens +sloan +##eka +bitten +ara +fender +nausea +bumped +kris +banquet +comrades +detector +persisted +##llan +adjustment +endowed +cinemas +##shot +sellers +##uman +peek +epa +kindly +neglect +simpsons +talon +mausoleum +runaway +hangul +lookout +##cic +rewards +coughed +acquainted +chloride +##ald +quicker +accordion +neolithic +##qa +artemis +coefficient +lenny +pandora +tx +##xed +ecstasy +litter +segunda +chairperson +gemma +hiss +rumor +vow +nasal +antioch +compensate +patiently +transformers +##eded +judo +morrow +penis +posthumous +philips +bandits +husbands +denote +flaming +##any +##phones +langley +yorker +1760 +walters +##uo +##kle +gubernatorial +fatty +samsung +leroy +outlaw +##nine +unpublished +poole +jakob +##ᵢ +##ₙ +crete +distorted +superiority +##dhi +intercept +crust +mig +claus +crashes +positioning +188 +stallion +301 +frontal +armistice +##estinal +elton +aj +encompassing +camel +commemorated +malaria +woodward +calf +cigar +penetrate +##oso +willard +##rno +##uche +illustrate +amusing +convergence +noteworthy +##lma +##rva +journeys +realise +manfred +##sable +410 +##vocation +hearings +fiance +##posed +educators +provoked +adjusting +##cturing +modular +stockton +paterson +vlad +rejects +electors +selena +maureen +##tres +uber +##rce +swirled +##num +proportions +nanny +pawn +naturalist +parma +apostles +awoke +ethel +wen +##bey +monsoon +overview +##inating +mccain +rendition +risky +adorned +##ih +equestrian +germain +nj +conspicuous +confirming +##yoshi +shivering +##imeter +milestone +rumours +flinched +bounds +smacked +token +##bei +lectured +automobiles +##shore +impacted +##iable +nouns +nero +##leaf +ismail +prostitute +trams +##lace +bridget +sud +stimulus +impressions +reins +revolves +##oud +##gned +giro +honeymoon +##swell +criterion +##sms +##uil +libyan +prefers +##osition +211 +preview +sucks +accusation +bursts +metaphor +diffusion +tolerate +faye +betting +cinematographer +liturgical +specials +bitterly +humboldt +##ckle +flux +rattled +##itzer +archaeologists +odor +authorised +marshes +discretion +##ов +alarmed +archaic +inverse +##leton +explorers +##pine +drummond +tsunami +woodlands +##minate +##tland +booklet +insanity +owning +insert +crafted +calculus +##tore +receivers +##bt +stung +##eca +##nched +prevailing +travellers +eyeing +lila +graphs +##borne +178 +julien +##won +morale +adaptive +therapist +erica +cw +libertarian +bowman +pitches +vita +##ional +crook +##ads +##entation +caledonia +mutiny +##sible +1840s +automation +##ß +flock +##pia +ironic +pathology +##imus +remarried +##22 +joker +withstand +energies +##att +shropshire +hostages +madeleine +tentatively +conflicting +mateo +recipes +euros +ol +mercenaries +nico +##ndon +albuquerque +augmented +mythical +bel +freud +##child +cough +##lica +365 +freddy +lillian +genetically +nuremberg +calder +209 +bonn +outdoors +paste +suns +urgency +vin +restraint +tyson +##cera +##selle +barrage +bethlehem +kahn +##par +mounts +nippon +barony +happier +ryu +makeshift +sheldon +blushed +castillo +barking +listener +taped +bethel +fluent +headlines +pornography +rum +disclosure +sighing +mace +doubling +gunther +manly +##plex +rt +interventions +physiological +forwards +emerges +##tooth +##gny +compliment +rib +recession +visibly +barge +faults +connector +exquisite +prefect +##rlin +patio +##cured +elevators +brandt +italics +pena +173 +wasp +satin +ea +botswana +graceful +respectable +##jima +##rter +##oic +franciscan +generates +##dl +alfredo +disgusting +##olate +##iously +sherwood +warns +cod +promo +cheryl +sino +##ة +##escu +twitch +##zhi +brownish +thom +ortiz +##dron +densely +##beat +carmel +reinforce +##bana +187 +anastasia +downhill +vertex +contaminated +remembrance +harmonic +homework +##sol +fiancee +gears +olds +angelica +loft +ramsay +quiz +colliery +sevens +##cape +autism +##hil +walkway +##boats +ruben +abnormal +ounce +khmer +##bbe +zachary +bedside +morphology +punching +##olar +sparrow +convinces +##35 +hewitt +queer +remastered +rods +mabel +solemn +notified +lyricist +symmetric +##xide +174 +encore +passports +wildcats +##uni +baja +##pac +mildly +##ease +bleed +commodity +mounds +glossy +orchestras +##omo +damian +prelude +ambitions +##vet +awhile +remotely +##aud +asserts +imply +##iques +distinctly +modelling +remedy +##dded +windshield +dani +xiao +##endra +audible +powerplant +1300 +invalid +elemental +acquisitions +##hala +immaculate +libby +plata +smuggling +ventilation +denoted +minh +##morphism +430 +differed +dion +kelley +lore +mocking +sabbath +spikes +hygiene +drown +runoff +stylized +tally +liberated +aux +interpreter +righteous +aba +siren +reaper +pearce +millie +##cier +##yra +gaius +##iso +captures +##ttering +dorm +claudio +##sic +benches +knighted +blackness +##ored +discount +fumble +oxidation +routed +##ς +novak +perpendicular +spoiled +fracture +splits +##urt +pads +topology +##cats +axes +fortunate +offenders +protestants +esteem +221 +broadband +convened +frankly +hound +prototypes +isil +facilitated +keel +##sher +sahara +awaited +bubba +orb +prosecutors +186 +hem +520 +##xing +relaxing +remnant +romney +sorted +slalom +stefano +ulrich +##active +exemption +folder +pauses +foliage +hitchcock +epithet +204 +criticisms +##aca +ballistic +brody +hinduism +chaotic +youths +equals +##pala +pts +thicker +analogous +capitalist +improvised +overseeing +sinatra +ascended +beverage +##tl +straightforward +##kon +curran +##west +bois +325 +induce +surveying +emperors +sax +unpopular +##kk +cartoonist +fused +##mble +unto +##yuki +localities +##cko +##ln +darlington +slain +academie +lobbying +sediment +puzzles +##grass +defiance +dickens +manifest +tongues +alumnus +arbor +coincide +184 +appalachian +mustafa +examiner +cabaret +traumatic +yves +bracelet +draining +heroin +magnum +baths +odessa +consonants +mitsubishi +##gua +kellan +vaudeville +##fr +joked +null +straps +probation +##ław +ceded +interfaces +##pas +##zawa +blinding +viet +224 +rothschild +museo +640 +huddersfield +##vr +tactic +##storm +brackets +dazed +incorrectly +##vu +reg +glazed +fearful +manifold +benefited +irony +##sun +stumbling +##rte +willingness +balkans +mei +wraps +##aba +injected +##lea +gu +syed +harmless +##hammer +bray +takeoff +poppy +timor +cardboard +astronaut +purdue +weeping +southbound +cursing +stalls +diagonal +##neer +lamar +bryce +comte +weekdays +harrington +##uba +negatively +##see +lays +grouping +##cken +##henko +affirmed +halle +modernist +##lai +hodges +smelling +aristocratic +baptized +dismiss +justification +oilers +##now +coupling +qin +snack +healer +##qing +gardener +layla +battled +formulated +stephenson +gravitational +##gill +##jun +1768 +granny +coordinating +suites +##cd +##ioned +monarchs +##cote +##hips +sep +blended +apr +barrister +deposition +fia +mina +policemen +paranoid +##pressed +churchyard +covert +crumpled +creep +abandoning +tr +transmit +conceal +barr +understands +readiness +spire +##cology +##enia +##erry +610 +startling +unlock +vida +bowled +slots +##nat +##islav +spaced +trusting +admire +rig +##ink +slack +##70 +mv +207 +casualty +##wei +classmates +##odes +##rar +##rked +amherst +furnished +evolve +foundry +menace +mead +##lein +flu +wesleyan +##kled +monterey +webber +##vos +wil +##mith +##на +bartholomew +justices +restrained +##cke +amenities +191 +mediated +sewage +trenches +ml +mainz +##thus +1800s +##cula +##inski +caine +bonding +213 +converts +spheres +superseded +marianne +crypt +sweaty +ensign +historia +##br +spruce +##post +##ask +forks +thoughtfully +yukon +pamphlet +ames +##uter +karma +##yya +bryn +negotiation +sighs +incapable +##mbre +##ntial +actresses +taft +##mill +luce +prevailed +##amine +1773 +motionless +envoy +testify +investing +sculpted +instructors +provence +kali +cullen +horseback +##while +goodwin +##jos +gaa +norte +##ldon +modify +wavelength +abd +214 +skinned +sprinter +forecast +scheduling +marries +squared +tentative +##chman +boer +##isch +bolts +swap +fisherman +assyrian +impatiently +guthrie +martins +murdoch +194 +tanya +nicely +dolly +lacy +med +##45 +syn +decks +fashionable +millionaire +##ust +surfing +##ml +##ision +heaved +tammy +consulate +attendees +routinely +197 +fuse +saxophonist +backseat +malaya +##lord +scowl +tau +##ishly +193 +sighted +steaming +##rks +303 +911 +##holes +##hong +ching +##wife +bless +conserved +jurassic +stacey +unix +zion +chunk +rigorous +blaine +198 +peabody +slayer +dismay +brewers +nz +##jer +det +##glia +glover +postwar +int +penetration +sylvester +imitation +vertically +airlift +heiress +knoxville +viva +##uin +390 +macon +##rim +##fighter +##gonal +janice +##orescence +##wari +marius +belongings +leicestershire +196 +blanco +inverted +preseason +sanity +sobbing +##due +##elt +##dled +collingwood +regeneration +flickering +shortest +##mount +##osi +feminism +##lat +sherlock +cabinets +fumbled +northbound +precedent +snaps +##mme +researching +##akes +guillaume +insights +manipulated +vapor +neighbour +sap +gangster +frey +f1 +stalking +scarcely +callie +barnett +tendencies +audi +doomed +assessing +slung +panchayat +ambiguous +bartlett +##etto +distributing +violating +wolverhampton +##hetic +swami +histoire +##urus +liable +pounder +groin +hussain +larsen +popping +surprises +##atter +vie +curt +##station +mute +relocate +musicals +authorization +richter +##sef +immortality +tna +bombings +##press +deteriorated +yiddish +##acious +robbed +colchester +cs +pmid +ao +verified +balancing +apostle +swayed +recognizable +oxfordshire +retention +nottinghamshire +contender +judd +invitational +shrimp +uhf +##icient +cleaner +longitudinal +tanker +##mur +acronym +broker +koppen +sundance +suppliers +##gil +4000 +clipped +fuels +petite +##anne +landslide +helene +diversion +populous +landowners +auspices +melville +quantitative +##xes +ferries +nicky +##llus +doo +haunting +roche +carver +downed +unavailable +##pathy +approximation +hiroshima +##hue +garfield +valle +comparatively +keyboardist +traveler +##eit +congestion +calculating +subsidiaries +##bate +serb +modernization +fairies +deepened +ville +averages +##lore +inflammatory +tonga +##itch +co₂ +squads +##hea +gigantic +serum +enjoyment +retailer +verona +35th +cis +##phobic +magna +technicians +##vati +arithmetic +##sport +levin +##dation +amtrak +chow +sienna +##eyer +backstage +entrepreneurship +##otic +learnt +tao +##udy +worcestershire +formulation +baggage +hesitant +bali +sabotage +##kari +barren +enhancing +murmur +pl +freshly +putnam +syntax +aces +medicines +resentment +bandwidth +##sier +grins +chili +guido +##sei +framing +implying +gareth +lissa +genevieve +pertaining +admissions +geo +thorpe +proliferation +sato +bela +analyzing +parting +##gor +awakened +##isman +huddled +secrecy +##kling +hush +gentry +540 +dungeons +##ego +coasts +##utz +sacrificed +##chule +landowner +mutually +prevalence +programmer +adolescent +disrupted +seaside +gee +trusts +vamp +georgie +##nesian +##iol +schedules +sindh +##market +etched +hm +sparse +bey +beaux +scratching +gliding +unidentified +216 +collaborating +gems +jesuits +oro +accumulation +shaping +mbe +anal +##xin +231 +enthusiasts +newscast +##egan +janata +dewey +parkinson +179 +ankara +biennial +towering +dd +inconsistent +950 +##chet +thriving +terminate +cabins +furiously +eats +advocating +donkey +marley +muster +phyllis +leiden +##user +grassland +glittering +iucn +loneliness +217 +memorandum +armenians +##ddle +popularized +rhodesia +60s +lame +##illon +sans +bikini +header +orbits +##xx +##finger +##ulator +sharif +spines +biotechnology +strolled +naughty +yates +##wire +fremantle +milo +##mour +abducted +removes +##atin +humming +wonderland +##chrome +##ester +hume +pivotal +##rates +armand +grams +believers +elector +rte +apron +bis +scraped +##yria +endorsement +initials +##llation +eps +dotted +hints +buzzing +emigration +nearer +##tom +indicators +##ulu +coarse +neutron +protectorate +##uze +directional +exploits +pains +loire +1830s +proponents +guggenheim +rabbits +ritchie +305 +hectare +inputs +hutton +##raz +verify +##ako +boilers +longitude +##lev +skeletal +yer +emilia +citrus +compromised +##gau +pokemon +prescription +paragraph +eduard +cadillac +attire +categorized +kenyan +weddings +charley +##bourg +entertain +monmouth +##lles +nutrients +davey +mesh +incentive +practised +ecosystems +kemp +subdued +overheard +##rya +bodily +maxim +##nius +apprenticeship +ursula +##fight +lodged +rug +silesian +unconstitutional +patel +inspected +coyote +unbeaten +##hak +34th +disruption +convict +parcel +##cl +##nham +collier +implicated +mallory +##iac +##lab +susannah +winkler +##rber +shia +phelps +sediments +graphical +robotic +##sner +adulthood +mart +smoked +##isto +kathryn +clarified +##aran +divides +convictions +oppression +pausing +burying +##mt +federico +mathias +eileen +##tana +kite +hunched +##acies +189 +##atz +disadvantage +liza +kinetic +greedy +paradox +yokohama +dowager +trunks +ventured +##gement +gupta +vilnius +olaf +##thest +crimean +hopper +##ej +progressively +arturo +mouthed +arrondissement +##fusion +rubin +simulcast +oceania +##orum +##stra +##rred +busiest +intensely +navigator +cary +##vine +##hini +##bies +fife +rowe +rowland +posing +insurgents +shafts +lawsuits +activate +conor +inward +culturally +garlic +265 +##eering +eclectic +##hui +##kee +##nl +furrowed +vargas +meteorological +rendezvous +##aus +culinary +commencement +##dition +quota +##notes +mommy +salaries +overlapping +mule +##iology +##mology +sums +wentworth +##isk +##zione +mainline +subgroup +##illy +hack +plaintiff +verdi +bulb +differentiation +engagements +multinational +supplemented +bertrand +caller +regis +##naire +##sler +##arts +##imated +blossom +propagation +kilometer +viaduct +vineyards +##uate +beckett +optimization +golfer +songwriters +seminal +semitic +thud +volatile +evolving +ridley +##wley +trivial +distributions +scandinavia +jiang +##ject +wrestled +insistence +##dio +emphasizes +napkin +##ods +adjunct +rhyme +##ricted +##eti +hopeless +surrounds +tremble +32nd +smoky +##ntly +oils +medicinal +padded +steer +wilkes +219 +255 +concessions +hue +uniquely +blinded +landon +yahoo +##lane +hendrix +commemorating +dex +specify +chicks +##ggio +intercity +1400 +morley +##torm +highlighting +##oting +pang +oblique +stalled +##liner +flirting +newborn +1769 +bishopric +shaved +232 +currie +##ush +dharma +spartan +##ooped +favorites +smug +novella +sirens +abusive +creations +espana +##lage +paradigm +semiconductor +sheen +##rdo +##yen +##zak +nrl +renew +##pose +##tur +adjutant +marches +norma +##enity +ineffective +weimar +grunt +##gat +lordship +plotting +expenditure +infringement +lbs +refrain +av +mimi +mistakenly +postmaster +1771 +##bara +ras +motorsports +tito +199 +subjective +##zza +bully +stew +##kaya +prescott +1a +##raphic +##zam +bids +styling +paranormal +reeve +sneaking +exploding +katz +akbar +migrant +syllables +indefinitely +##ogical +destroys +replaces +applause +##phine +pest +##fide +218 +articulated +bertie +##thing +##cars +##ptic +courtroom +crowley +aesthetics +cummings +tehsil +hormones +titanic +dangerously +##ibe +stadion +jaenelle +auguste +ciudad +##chu +mysore +partisans +##sio +lucan +philipp +##aly +debating +henley +interiors +##rano +##tious +homecoming +beyonce +usher +henrietta +prepares +weeds +##oman +ely +plucked +##pire +##dable +luxurious +##aq +artifact +password +pasture +juno +maddy +minsk +##dder +##ologies +##rone +assessments +martian +royalist +1765 +examines +##mani +##rge +nino +223 +parry +scooped +relativity +##eli +##uting +##cao +congregational +noisy +traverse +##agawa +strikeouts +nickelodeon +obituary +transylvania +binds +depictions +polk +trolley +##yed +##lard +breeders +##under +dryly +hokkaido +1762 +strengths +stacks +bonaparte +connectivity +neared +prostitutes +stamped +anaheim +gutierrez +sinai +##zzling +bram +fresno +madhya +##86 +proton +##lena +##llum +##phon +reelected +wanda +##anus +##lb +ample +distinguishing +##yler +grasping +sermons +tomato +bland +stimulation +avenues +##eux +spreads +scarlett +fern +pentagon +assert +baird +chesapeake +ir +calmed +distortion +fatalities +##olis +correctional +pricing +##astic +##gina +prom +dammit +ying +collaborate +##chia +welterweight +33rd +pointer +substitution +bonded +umpire +communicating +multitude +paddle +##obe +federally +intimacy +##insky +betray +ssr +##lett +##lean +##lves +##therapy +airbus +##tery +functioned +ud +bearer +biomedical +netflix +##hire +##nca +condom +brink +ik +##nical +macy +##bet +flap +gma +experimented +jelly +lavender +##icles +##ulia +munro +##mian +##tial +rye +##rle +60th +gigs +hottest +rotated +predictions +fuji +bu +##erence +##omi +barangay +##fulness +##sas +clocks +##rwood +##liness +cereal +roe +wight +decker +uttered +babu +onion +xml +forcibly +##df +petra +sarcasm +hartley +peeled +storytelling +##42 +##xley +##ysis +##ffa +fibre +kiel +auditor +fig +harald +greenville +##berries +geographically +nell +quartz +##athic +cemeteries +##lr +crossings +nah +holloway +reptiles +chun +sichuan +snowy +660 +corrections +##ivo +zheng +ambassadors +blacksmith +fielded +fluids +hardcover +turnover +medications +melvin +academies +##erton +ro +roach +absorbing +spaniards +colton +##founded +outsider +espionage +kelsey +245 +edible +##ulf +dora +establishes +##sham +##tries +contracting +##tania +cinematic +costello +nesting +##uron +connolly +duff +##nology +mma +##mata +fergus +sexes +gi +optics +spectator +woodstock +banning +##hee +##fle +differentiate +outfielder +refinery +226 +312 +gerhard +horde +lair +drastically +##udi +landfall +##cheng +motorsport +odi +##achi +predominant +quay +skins +##ental +edna +harshly +complementary +murdering +##aves +wreckage +##90 +ono +outstretched +lennox +munitions +galen +reconcile +470 +scalp +bicycles +gillespie +questionable +rosenberg +guillermo +hostel +jarvis +kabul +volvo +opium +yd +##twined +abuses +decca +outpost +##cino +sensible +neutrality +##64 +ponce +anchorage +atkins +turrets +inadvertently +disagree +libre +vodka +reassuring +weighs +##yal +glide +jumper +ceilings +repertory +outs +stain +##bial +envy +##ucible +smashing +heightened +policing +hyun +mixes +lai +prima +##ples +celeste +##bina +lucrative +intervened +kc +manually +##rned +stature +staffed +bun +bastards +nairobi +priced +##auer +thatcher +##kia +tripped +comune +##ogan +##pled +brasil +incentives +emanuel +hereford +musica +##kim +benedictine +biennale +##lani +eureka +gardiner +rb +knocks +sha +##ael +##elled +##onate +efficacy +ventura +masonic +sanford +maize +leverage +##feit +capacities +santana +##aur +novelty +vanilla +##cter +##tour +benin +##oir +##rain +neptune +drafting +tallinn +##cable +humiliation +##boarding +schleswig +fabian +bernardo +liturgy +spectacle +sweeney +pont +routledge +##tment +cosmos +ut +hilt +sleek +universally +##eville +##gawa +typed +##dry +favors +allegheny +glaciers +##rly +recalling +aziz +##log +parasite +requiem +auf +##berto +##llin +illumination +##breaker +##issa +festivities +bows +govern +vibe +vp +333 +sprawled +larson +pilgrim +bwf +leaping +##rts +##ssel +alexei +greyhound +hoarse +##dler +##oration +seneca +##cule +gaping +##ulously +##pura +cinnamon +##gens +##rricular +craven +fantasies +houghton +engined +reigned +dictator +supervising +##oris +bogota +commentaries +unnatural +fingernails +spirituality +tighten +##tm +canadiens +protesting +intentional +cheers +sparta +##ytic +##iere +##zine +widen +belgarath +controllers +dodd +iaaf +navarre +##ication +defect +squire +steiner +whisky +##mins +560 +inevitably +tome +##gold +chew +##uid +##lid +elastic +##aby +streaked +alliances +jailed +regal +##ined +##phy +czechoslovak +narration +absently +##uld +bluegrass +guangdong +quran +criticizing +hose +hari +##liest +##owa +skier +streaks +deploy +##lom +raft +bose +dialed +huff +##eira +haifa +simplest +bursting +endings +ib +sultanate +##titled +franks +whitman +ensures +sven +##ggs +collaborators +forster +organising +ui +banished +napier +injustice +teller +layered +thump +##otti +roc +battleships +evidenced +fugitive +sadie +robotics +##roud +equatorial +geologist +##iza +yielding +##bron +##sr +internationale +mecca +##diment +sbs +skyline +toad +uploaded +reflective +undrafted +lal +leafs +bayern +##dai +lakshmi +shortlisted +##stick +##wicz +camouflage +donate +af +christi +lau +##acio +disclosed +nemesis +1761 +assemble +straining +northamptonshire +tal +##asi +bernardino +premature +heidi +42nd +coefficients +galactic +reproduce +buzzed +sensations +zionist +monsieur +myrtle +##eme +archery +strangled +musically +viewpoint +antiquities +bei +trailers +seahawks +cured +pee +preferring +tasmanian +lange +sul +##mail +##working +colder +overland +lucivar +massey +gatherings +haitian +##smith +disapproval +flaws +##cco +##enbach +1766 +npr +##icular +boroughs +creole +forums +techno +1755 +dent +abdominal +streetcar +##eson +##stream +procurement +gemini +predictable +##tya +acheron +christoph +feeder +fronts +vendor +bernhard +jammu +tumors +slang +##uber +goaltender +twists +curving +manson +vuelta +mer +peanut +confessions +pouch +unpredictable +allowance +theodor +vascular +##factory +bala +authenticity +metabolic +coughing +nanjing +##cea +pembroke +##bard +splendid +36th +ff +hourly +##ahu +elmer +handel +##ivate +awarding +thrusting +dl +experimentation +##hesion +##46 +caressed +entertained +steak +##rangle +biologist +orphans +baroness +oyster +stepfather +##dridge +mirage +reefs +speeding +##31 +barons +1764 +227 +inhabit +preached +repealed +##tral +honoring +boogie +captives +administer +johanna +##imate +gel +suspiciously +1767 +sobs +##dington +backbone +hayward +garry +##folding +##nesia +maxi +##oof +##ppe +ellison +galileo +##stand +crimea +frenzy +amour +bumper +matrices +natalia +baking +garth +palestinians +##grove +smack +conveyed +ensembles +gardening +##manship +##rup +##stituting +1640 +harvesting +topography +jing +shifters +dormitory +##carriage +##lston +ist +skulls +##stadt +dolores +jewellery +sarawak +##wai +##zier +fences +christy +confinement +tumbling +credibility +fir +stench +##bria +##plication +##nged +##sam +virtues +##belt +marjorie +pba +##eem +##made +celebrates +schooner +agitated +barley +fulfilling +anthropologist +##pro +restrict +novi +regulating +##nent +padres +##rani +##hesive +loyola +tabitha +milky +olson +proprietor +crambidae +guarantees +intercollegiate +ljubljana +hilda +##sko +ignorant +hooded +##lts +sardinia +##lidae +##vation +frontman +privileged +witchcraft +##gp +jammed +laude +poking +##than +bracket +amazement +yunnan +##erus +maharaja +linnaeus +264 +commissioning +milano +peacefully +##logies +akira +rani +regulator +##36 +grasses +##rance +luzon +crows +compiler +gretchen +seaman +edouard +tab +buccaneers +ellington +hamlets +whig +socialists +##anto +directorial +easton +mythological +##kr +##vary +rhineland +semantic +taut +dune +inventions +succeeds +##iter +replication +branched +##pired +jul +prosecuted +kangaroo +penetrated +##avian +middlesbrough +doses +bleak +madam +predatory +relentless +##vili +reluctance +##vir +hailey +crore +silvery +1759 +monstrous +swimmers +transmissions +hawthorn +informing +##eral +toilets +caracas +crouch +kb +##sett +295 +cartel +hadley +##aling +alexia +yvonne +##biology +cinderella +eton +superb +blizzard +stabbing +industrialist +maximus +##gm +##orus +groves +maud +clade +oversized +comedic +##bella +rosen +nomadic +fulham +montane +beverages +galaxies +redundant +swarm +##rot +##folia +##llis +buckinghamshire +fen +bearings +bahadur +##rom +gilles +phased +dynamite +faber +benoit +vip +##ount +##wd +booking +fractured +tailored +anya +spices +westwood +cairns +auditions +inflammation +steamed +##rocity +##acion +##urne +skyla +thereof +watford +torment +archdeacon +transforms +lulu +demeanor +fucked +serge +##sor +mckenna +minas +entertainer +##icide +caress +originate +residue +##sty +1740 +##ilised +##org +beech +##wana +subsidies +##ghton +emptied +gladstone +ru +firefighters +voodoo +##rcle +het +nightingale +tamara +edmond +ingredient +weaknesses +silhouette +285 +compatibility +withdrawing +hampson +##mona +anguish +giggling +##mber +bookstore +##jiang +southernmost +tilting +##vance +bai +economical +rf +briefcase +dreadful +hinted +projections +shattering +totaling +##rogate +analogue +indicted +periodical +fullback +##dman +haynes +##tenberg +##ffs +##ishment +1745 +thirst +stumble +penang +vigorous +##ddling +##kor +##lium +octave +##ove +##enstein +##inen +##ones +siberian +##uti +cbn +repeal +swaying +##vington +khalid +tanaka +unicorn +otago +plastered +lobe +riddle +##rella +perch +##ishing +croydon +filtered +graeme +tripoli +##ossa +crocodile +##chers +sufi +mined +##tung +inferno +lsu +##phi +swelled +utilizes +£2 +cale +periodicals +styx +hike +informally +coop +lund +##tidae +ala +hen +qui +transformations +disposed +sheath +chickens +##cade +fitzroy +sas +silesia +unacceptable +odisha +1650 +sabrina +pe +spokane +ratios +athena +massage +shen +dilemma +##drum +##riz +##hul +corona +doubtful +niall +##pha +##bino +fines +cite +acknowledging +bangor +ballard +bathurst +##resh +huron +mustered +alzheimer +garments +kinase +tyre +warship +##cp +flashback +pulmonary +braun +cheat +kamal +cyclists +constructions +grenades +ndp +traveller +excuses +stomped +signalling +trimmed +futsal +mosques +relevance +##wine +wta +##23 +##vah +##lter +hoc +##riding +optimistic +##´s +deco +sim +interacting +rejecting +moniker +waterways +##ieri +##oku +mayors +gdansk +outnumbered +pearls +##ended +##hampton +fairs +totals +dominating +262 +notions +stairway +compiling +pursed +commodities +grease +yeast +##jong +carthage +griffiths +residual +amc +contraction +laird +sapphire +##marine +##ivated +amalgamation +dissolve +inclination +lyle +packaged +altitudes +suez +canons +graded +lurched +narrowing +boasts +guise +wed +enrico +##ovsky +rower +scarred +bree +cub +iberian +protagonists +bargaining +proposing +trainers +voyages +vans +fishes +##aea +##ivist +##verance +encryption +artworks +kazan +sabre +cleopatra +hepburn +rotting +supremacy +mecklenburg +##brate +burrows +hazards +outgoing +flair +organizes +##ctions +scorpion +##usions +boo +234 +chevalier +dunedin +slapping +##34 +ineligible +pensions +##38 +##omic +manufactures +emails +bismarck +238 +weakening +blackish +ding +mcgee +quo +##rling +northernmost +xx +manpower +greed +sampson +clicking +##ange +##horpe +##inations +##roving +torre +##eptive +##moral +symbolism +38th +asshole +meritorious +outfits +splashed +biographies +sprung +astros +##tale +302 +737 +filly +raoul +nw +tokugawa +linden +clubhouse +##apa +tracts +romano +##pio +putin +tags +##note +chained +dickson +gunshot +moe +gunn +rashid +##tails +zipper +##bas +##nea +contrasted +##ply +##udes +plum +pharaoh +##pile +aw +comedies +ingrid +sandwiches +subdivisions +1100 +mariana +nokia +kamen +hz +delaney +veto +herring +##words +possessive +outlines +##roup +siemens +stairwell +rc +gallantry +messiah +palais +yells +233 +zeppelin +##dm +bolivar +##cede +smackdown +mckinley +##mora +##yt +muted +geologic +finely +unitary +avatar +hamas +maynard +rees +bog +contrasting +##rut +liv +chico +disposition +pixel +##erate +becca +dmitry +yeshiva +narratives +##lva +##ulton +mercenary +sharpe +tempered +navigate +stealth +amassed +keynes +##lini +untouched +##rrie +havoc +lithium +##fighting +abyss +graf +southward +wolverine +balloons +implements +ngos +transitions +##icum +ambushed +concacaf +dormant +economists +##dim +costing +csi +rana +universite +boulders +verity +##llon +collin +mellon +misses +cypress +fluorescent +lifeless +spence +##ulla +crewe +shepard +pak +revelations +##م +jolly +gibbons +paw +##dro +##quel +freeing +##test +shack +fries +palatine +##51 +##hiko +accompaniment +cruising +recycled +##aver +erwin +sorting +synthesizers +dyke +realities +sg +strides +enslaved +wetland +##ghan +competence +gunpowder +grassy +maroon +reactors +objection +##oms +carlson +gearbox +macintosh +radios +shelton +##sho +clergyman +prakash +254 +mongols +trophies +oricon +228 +stimuli +twenty20 +cantonese +cortes +mirrored +##saurus +bhp +cristina +melancholy +##lating +enjoyable +nuevo +##wny +downfall +schumacher +##ind +banging +lausanne +rumbled +paramilitary +reflex +ax +amplitude +migratory +##gall +##ups +midi +barnard +lastly +sherry +##hp +##nall +keystone +##kra +carleton +slippery +##53 +coloring +foe +socket +otter +##rgos +mats +##tose +consultants +bafta +bison +topping +##km +490 +primal +abandonment +transplant +atoll +hideous +mort +pained +reproduced +tae +howling +##turn +unlawful +billionaire +hotter +poised +lansing +##chang +dinamo +retro +messing +nfc +domesday +##mina +blitz +timed +##athing +##kley +ascending +gesturing +##izations +signaled +tis +chinatown +mermaid +savanna +jameson +##aint +catalina +##pet +##hers +cochrane +cy +chatting +##kus +alerted +computation +mused +noelle +majestic +mohawk +campo +octagonal +##sant +##hend +241 +aspiring +##mart +comprehend +iona +paralyzed +shimmering +swindon +rhone +##eley +reputed +configurations +pitchfork +agitation +francais +gillian +lipstick +##ilo +outsiders +pontifical +resisting +bitterness +sewer +rockies +##edd +##ucher +misleading +1756 +exiting +galloway +##nging +risked +##heart +246 +commemoration +schultz +##rka +integrating +##rsa +poses +shrieked +##weiler +guineas +gladys +jerking +owls +goldsmith +nightly +penetrating +##unced +lia +##33 +ignited +betsy +##aring +##thorpe +follower +vigorously +##rave +coded +kiran +knit +zoology +tbilisi +##28 +##bered +repository +govt +deciduous +dino +growling +##bba +enhancement +unleashed +chanting +pussy +biochemistry +##eric +kettle +repression +toxicity +nrhp +##arth +##kko +##bush +ernesto +commended +outspoken +242 +mca +parchment +sms +kristen +##aton +bisexual +raked +glamour +navajo +a2 +conditioned +showcased +##hma +spacious +youthful +##esa +usl +appliances +junta +brest +layne +conglomerate +enchanted +chao +loosened +picasso +circulating +inspect +montevideo +##centric +##kti +piazza +spurred +##aith +bari +freedoms +poultry +stamford +lieu +##ect +indigo +sarcastic +bahia +stump +attach +dvds +frankenstein +lille +approx +scriptures +pollen +##script +nmi +overseen +##ivism +tides +proponent +newmarket +inherit +milling +##erland +centralized +##rou +distributors +credentials +drawers +abbreviation +##lco +##xon +downing +uncomfortably +ripe +##oes +erase +franchises +##ever +populace +##bery +##khar +decomposition +pleas +##tet +daryl +sabah +##stle +##wide +fearless +genie +lesions +annette +##ogist +oboe +appendix +nair +dripped +petitioned +maclean +mosquito +parrot +rpg +hampered +1648 +operatic +reservoirs +##tham +irrelevant +jolt +summarized +##fp +medallion +##taff +##− +clawed +harlow +narrower +goddard +marcia +bodied +fremont +suarez +altering +tempest +mussolini +porn +##isms +sweetly +oversees +walkers +solitude +grimly +shrines +hk +ich +supervisors +hostess +dietrich +legitimacy +brushes +expressive +##yp +dissipated +##rse +localized +systemic +##nikov +gettysburg +##js +##uaries +dialogues +muttering +251 +housekeeper +sicilian +discouraged +##frey +beamed +kaladin +halftime +kidnap +##amo +##llet +1754 +synonymous +depleted +instituto +insulin +reprised +##opsis +clashed +##ctric +interrupting +radcliffe +insisting +medici +1715 +ejected +playfully +turbulent +##47 +starvation +##rini +shipment +rebellious +petersen +verification +merits +##rified +cakes +##charged +1757 +milford +shortages +spying +fidelity +##aker +emitted +storylines +harvested +seismic +##iform +cheung +kilda +theoretically +barbie +lynx +##rgy +##tius +goblin +mata +poisonous +##nburg +reactive +residues +obedience +##евич +conjecture +##rac +401 +hating +sixties +kicker +moaning +motown +##bha +emancipation +neoclassical +##hering +consoles +ebert +professorship +##tures +sustaining +assaults +obeyed +affluent +incurred +tornadoes +##eber +##zow +emphasizing +highlanders +cheated +helmets +##ctus +internship +terence +bony +executions +legislators +berries +peninsular +tinged +##aco +1689 +amplifier +corvette +ribbons +lavish +pennant +##lander +worthless +##chfield +##forms +mariano +pyrenees +expenditures +##icides +chesterfield +mandir +tailor +39th +sergey +nestled +willed +aristocracy +devotees +goodnight +raaf +rumored +weaponry +remy +appropriations +harcourt +burr +riaa +##lence +limitation +unnoticed +guo +soaking +swamps +##tica +collapsing +tatiana +descriptive +brigham +psalm +##chment +maddox +##lization +patti +caliph +##aja +akron +injuring +serra +##ganj +basins +##sari +astonished +launcher +##church +hilary +wilkins +sewing +##sf +stinging +##fia +##ncia +underwood +startup +##ition +compilations +vibrations +embankment +jurist +##nity +bard +juventus +groundwater +kern +palaces +helium +boca +cramped +marissa +soto +##worm +jae +princely +##ggy +faso +bazaar +warmly +##voking +229 +pairing +##lite +##grate +##nets +wien +freaked +ulysses +rebirth +##alia +##rent +mummy +guzman +jimenez +stilled +##nitz +trajectory +tha +woken +archival +professions +##pts +##pta +hilly +shadowy +shrink +##bolt +norwood +glued +migrate +stereotypes +devoid +##pheus +625 +evacuate +horrors +infancy +gotham +knowles +optic +downloaded +sachs +kingsley +parramatta +darryl +mor +##onale +shady +commence +confesses +kan +##meter +##placed +marlborough +roundabout +regents +frigates +io +##imating +gothenburg +revoked +carvings +clockwise +convertible +intruder +##sche +banged +##ogo +vicky +bourgeois +##mony +dupont +footing +##gum +pd +##real +buckle +yun +penthouse +sane +720 +serviced +stakeholders +neumann +bb +##eers +comb +##gam +catchment +pinning +rallies +typing +##elles +forefront +freiburg +sweetie +giacomo +widowed +goodwill +worshipped +aspirations +midday +##vat +fishery +##trick +bournemouth +turk +243 +hearth +ethanol +guadalajara +murmurs +sl +##uge +afforded +scripted +##hta +wah +##jn +coroner +translucent +252 +memorials +puck +progresses +clumsy +##race +315 +candace +recounted +##27 +##slin +##uve +filtering +##mac +howl +strata +heron +leveled +##ays +dubious +##oja +##т +##wheel +citations +exhibiting +##laya +##mics +##pods +turkic +##lberg +injunction +##ennial +##mit +antibodies +##44 +organise +##rigues +cardiovascular +cushion +inverness +##zquez +dia +cocoa +sibling +##tman +##roid +expanse +feasible +tunisian +algiers +##relli +rus +bloomberg +dso +westphalia +bro +tacoma +281 +downloads +##ours +konrad +duran +##hdi +continuum +jett +compares +legislator +secession +##nable +##gues +##zuka +translating +reacher +##gley +##ła +aleppo +##agi +tc +orchards +trapping +linguist +versatile +drumming +postage +calhoun +superiors +##mx +barefoot +leary +##cis +ignacio +alfa +kaplan +##rogen +bratislava +mori +##vot +disturb +haas +313 +cartridges +gilmore +radiated +salford +tunic +hades +##ulsive +archeological +delilah +magistrates +auditioned +brewster +charters +empowerment +blogs +cappella +dynasties +iroquois +whipping +##krishna +raceway +truths +myra +weaken +judah +mcgregor +##horse +mic +refueling +37th +burnley +bosses +markus +premio +query +##gga +dunbar +##economic +darkest +lyndon +sealing +commendation +reappeared +##mun +addicted +ezio +slaughtered +satisfactory +shuffle +##eves +##thic +##uj +fortification +warrington +##otto +resurrected +fargo +mane +##utable +##lei +##space +foreword +ox +##aris +##vern +abrams +hua +##mento +sakura +##alo +uv +sentimental +##skaya +midfield +##eses +sturdy +scrolls +macleod +##kyu +entropy +##lance +mitochondrial +cicero +excelled +thinner +convoys +perceive +##oslav +##urable +systematically +grind +burkina +287 +##tagram +ops +##aman +guantanamo +##cloth +##tite +forcefully +wavy +##jou +pointless +##linger +##tze +layton +portico +superficial +clerical +outlaws +##hism +burials +muir +##inn +creditors +hauling +rattle +##leg +calais +monde +archers +reclaimed +dwell +wexford +hellenic +falsely +remorse +##tek +dough +furnishings +##uttered +gabon +neurological +novice +##igraphy +contemplated +pulpit +nightstand +saratoga +##istan +documenting +pulsing +taluk +##firmed +busted +marital +##rien +disagreements +wasps +##yes +hodge +mcdonnell +mimic +fran +pendant +dhabi +musa +##nington +congratulations +argent +darrell +concussion +losers +regrets +thessaloniki +reversal +donaldson +hardwood +thence +achilles +ritter +##eran +demonic +jurgen +prophets +goethe +eki +classmate +buff +##cking +yank +irrational +##inging +perished +seductive +qur +sourced +##crat +##typic +mustard +ravine +barre +horizontally +characterization +phylogenetic +boise +##dit +##runner +##tower +brutally +intercourse +seduce +##bbing +fay +ferris +ogden +amar +nik +unarmed +##inator +evaluating +kyrgyzstan +sweetness +##lford +##oki +mccormick +meiji +notoriety +stimulate +disrupt +figuring +instructional +mcgrath +##zoo +groundbreaking +##lto +flinch +khorasan +agrarian +bengals +mixer +radiating +##sov +ingram +pitchers +nad +tariff +##cript +tata +##codes +##emi +##ungen +appellate +lehigh +##bled +##giri +brawl +duct +texans +##ciation +##ropolis +skipper +speculative +vomit +doctrines +stresses +253 +davy +graders +whitehead +jozef +timely +cumulative +haryana +paints +appropriately +boon +cactus +##ales +##pid +dow +legions +##pit +perceptions +1730 +picturesque +##yse +periphery +rune +wr +##aha +celtics +sentencing +whoa +##erin +confirms +variance +425 +moines +mathews +spade +rave +m1 +fronted +fx +blending +alleging +reared +##gl +237 +##paper +grassroots +eroded +##free +##physical +directs +ordeal +##sław +accelerate +hacker +rooftop +##inia +lev +buys +cebu +devote +##lce +specialising +##ulsion +choreographed +repetition +warehouses +##ryl +paisley +tuscany +analogy +sorcerer +hash +huts +shards +descends +exclude +nix +chaplin +gaga +ito +vane +##drich +causeway +misconduct +limo +orchestrated +glands +jana +##kot +u2 +##mple +##sons +branching +contrasts +scoop +longed +##virus +chattanooga +##75 +syrup +cornerstone +##tized +##mind +##iaceae +careless +precedence +frescoes +##uet +chilled +consult +modelled +snatch +peat +##thermal +caucasian +humane +relaxation +spins +temperance +##lbert +occupations +lambda +hybrids +moons +mp3 +##oese +247 +rolf +societal +yerevan +ness +##ssler +befriended +mechanized +nominate +trough +boasted +cues +seater +##hom +bends +##tangle +conductors +emptiness +##lmer +eurasian +adriatic +tian +##cie +anxiously +lark +propellers +chichester +jock +ev +2a +##holding +credible +recounts +tori +loyalist +abduction +##hoot +##redo +nepali +##mite +ventral +tempting +##ango +##crats +steered +##wice +javelin +dipping +laborers +prentice +looming +titanium +##ː +badges +emir +tensor +##ntation +egyptians +rash +denies +hawthorne +lombard +showers +wehrmacht +dietary +trojan +##reus +welles +executing +horseshoe +lifeboat +##lak +elsa +infirmary +nearing +roberta +boyer +mutter +trillion +joanne +##fine +##oked +sinks +vortex +uruguayan +clasp +sirius +##block +accelerator +prohibit +sunken +byu +chronological +diplomats +ochreous +510 +symmetrical +1644 +maia +##tology +salts +reigns +atrocities +##ия +hess +bared +issn +##vyn +cater +saturated +##cycle +##isse +sable +voyager +dyer +yusuf +##inge +fountains +wolff +##39 +##nni +engraving +rollins +atheist +ominous +##ault +herr +chariot +martina +strung +##fell +##farlane +horrific +sahib +gazes +saetan +erased +ptolemy +##olic +flushing +lauderdale +analytic +##ices +530 +navarro +beak +gorilla +herrera +broom +guadalupe +raiding +sykes +311 +bsc +deliveries +1720 +invasions +carmichael +tajikistan +thematic +ecumenical +sentiments +onstage +##rians +##brand +##sume +catastrophic +flanks +molten +##arns +waller +aimee +terminating +##icing +alternately +##oche +nehru +printers +outraged +##eving +empires +template +banners +repetitive +za +##oise +vegetarian +##tell +guiana +opt +cavendish +lucknow +synthesized +##hani +##mada +finalized +##ctable +fictitious +mayoral +unreliable +##enham +embracing +peppers +rbis +##chio +##neo +inhibition +slashed +togo +orderly +embroidered +safari +salty +236 +barron +benito +totaled +##dak +pubs +simulated +caden +devin +tolkien +momma +welding +sesame +##ept +gottingen +hardness +630 +shaman +temeraire +620 +adequately +pediatric +##kit +ck +assertion +radicals +composure +cadence +seafood +beaufort +lazarus +mani +warily +cunning +kurdistan +249 +cantata +##kir +ares +##41 +##clusive +nape +townland +geared +insulted +flutter +boating +violate +draper +dumping +malmo +##hh +##romatic +firearm +alta +bono +obscured +##clave +exceeds +panorama +unbelievable +##train +preschool +##essed +disconnected +installing +rescuing +secretaries +accessibility +##castle +##drive +##ifice +##film +bouts +slug +waterway +mindanao +##buro +##ratic +halves +##ل +calming +liter +maternity +adorable +bragg +electrification +mcc +##dote +roxy +schizophrenia +##body +munoz +kaye +whaling +239 +mil +tingling +tolerant +##ago +unconventional +volcanoes +##finder +deportivo +##llie +robson +kaufman +neuroscience +wai +deportation +masovian +scraping +converse +##bh +hacking +bulge +##oun +administratively +yao +580 +amp +mammoth +booster +claremont +hooper +nomenclature +pursuits +mclaughlin +melinda +##sul +catfish +barclay +substrates +taxa +zee +originals +kimberly +packets +padma +##ality +borrowing +ostensibly +solvent +##bri +##genesis +##mist +lukas +shreveport +veracruz +##ь +##lou +##wives +cheney +tt +anatolia +hobbs +##zyn +cyclic +radiant +alistair +greenish +siena +dat +independents +##bation +conform +pieter +hyper +applicant +bradshaw +spores +telangana +vinci +inexpensive +nuclei +322 +jang +nme +soho +spd +##ign +cradled +receptionist +pow +##43 +##rika +fascism +##ifer +experimenting +##ading +##iec +##region +345 +jocelyn +maris +stair +nocturnal +toro +constabulary +elgin +##kker +msc +##giving +##schen +##rase +doherty +doping +sarcastically +batter +maneuvers +##cano +##apple +##gai +##git +intrinsic +##nst +##stor +1753 +showtime +cafes +gasps +lviv +ushered +##thed +fours +restart +astonishment +transmitting +flyer +shrugs +##sau +intriguing +cones +dictated +mushrooms +medial +##kovsky +##elman +escorting +gaped +##26 +godfather +##door +##sell +djs +recaptured +timetable +vila +1710 +3a +aerodrome +mortals +scientology +##orne +angelina +mag +convection +unpaid +insertion +intermittent +lego +##nated +endeavor +kota +pereira +##lz +304 +bwv +glamorgan +insults +agatha +fey +##cend +fleetwood +mahogany +protruding +steamship +zeta +##arty +mcguire +suspense +##sphere +advising +urges +##wala +hurriedly +meteor +gilded +inline +arroyo +stalker +##oge +excitedly +revered +##cure +earle +introductory +##break +##ilde +mutants +puff +pulses +reinforcement +##haling +curses +lizards +stalk +correlated +##fixed +fallout +macquarie +##unas +bearded +denton +heaving +802 +##ocation +winery +assign +dortmund +##lkirk +everest +invariant +charismatic +susie +##elling +bled +lesley +telegram +sumner +bk +##ogen +##к +wilcox +needy +colbert +duval +##iferous +##mbled +allotted +attends +imperative +##hita +replacements +hawker +##inda +insurgency +##zee +##eke +casts +##yla +680 +ives +transitioned +##pack +##powering +authoritative +baylor +flex +cringed +plaintiffs +woodrow +##skie +drastic +ape +aroma +unfolded +commotion +nt +preoccupied +theta +routines +lasers +privatization +wand +domino +ek +clenching +nsa +strategically +showered +bile +handkerchief +pere +storing +christophe +insulting +316 +nakamura +romani +asiatic +magdalena +palma +cruises +stripping +405 +konstantin +soaring +##berman +colloquially +forerunner +havilland +incarcerated +parasites +sincerity +##utus +disks +plank +saigon +##ining +corbin +homo +ornaments +powerhouse +##tlement +chong +fastened +feasibility +idf +morphological +usable +##nish +##zuki +aqueduct +jaguars +keepers +##flies +aleksandr +faust +assigns +ewing +bacterium +hurled +tricky +hungarians +integers +wallis +321 +yamaha +##isha +hushed +oblivion +aviator +evangelist +friars +##eller +monograph +ode +##nary +airplanes +labourers +charms +##nee +1661 +hagen +tnt +rudder +fiesta +transcript +dorothea +ska +inhibitor +maccabi +retorted +raining +encompassed +clauses +menacing +1642 +lineman +##gist +vamps +##ape +##dick +gloom +##rera +dealings +easing +seekers +##nut +##pment +helens +unmanned +##anu +##isson +basics +##amy +##ckman +adjustments +1688 +brutality +horne +##zell +sui +##55 +##mable +aggregator +##thal +rhino +##drick +##vira +counters +zoom +##01 +##rting +mn +montenegrin +packard +##unciation +##♭ +##kki +reclaim +scholastic +thugs +pulsed +##icia +syriac +quan +saddam +banda +kobe +blaming +buddies +dissent +##lusion +##usia +corbett +jaya +delle +erratic +lexie +##hesis +435 +amiga +hermes +##pressing +##leen +chapels +gospels +jamal +##uating +compute +revolving +warp +##sso +##thes +armory +##eras +##gol +antrim +loki +##kow +##asian +##good +##zano +braid +handwriting +subdistrict +funky +pantheon +##iculate +concurrency +estimation +improper +juliana +##his +newcomers +johnstone +staten +communicated +##oco +##alle +sausage +stormy +##stered +##tters +superfamily +##grade +acidic +collateral +tabloid +##oped +##rza +bladder +austen +##ellant +mcgraw +##hay +hannibal +mein +aquino +lucifer +wo +badger +boar +cher +christensen +greenberg +interruption +##kken +jem +244 +mocked +bottoms +cambridgeshire +##lide +sprawling +##bbly +eastwood +ghent +synth +##buck +advisers +##bah +nominally +hapoel +qu +daggers +estranged +fabricated +towels +vinnie +wcw +misunderstanding +anglia +nothin +unmistakable +##dust +##lova +chilly +marquette +truss +##edge +##erine +reece +##lty +##chemist +##connected +272 +308 +41st +bash +raion +waterfalls +##ump +##main +labyrinth +queue +theorist +##istle +bharatiya +flexed +soundtracks +rooney +leftist +patrolling +wharton +plainly +alleviate +eastman +schuster +topographic +engages +immensely +unbearable +fairchild +1620 +dona +lurking +parisian +oliveira +ia +indictment +hahn +bangladeshi +##aster +vivo +##uming +##ential +antonia +expects +indoors +kildare +harlan +##logue +##ogenic +##sities +forgiven +##wat +childish +tavi +##mide +##orra +plausible +grimm +successively +scooted +##bola +##dget +##rith +spartans +emery +flatly +azure +epilogue +##wark +flourish +##iny +##tracted +##overs +##oshi +bestseller +distressed +receipt +spitting +hermit +topological +##cot +drilled +subunit +francs +##layer +eel +##fk +##itas +octopus +footprint +petitions +ufo +##say +##foil +interfering +leaking +palo +##metry +thistle +valiant +##pic +narayan +mcpherson +##fast +gonzales +##ym +##enne +dustin +novgorod +solos +##zman +doin +##raph +##patient +##meyer +soluble +ashland +cuffs +carole +pendleton +whistling +vassal +##river +deviation +revisited +constituents +rallied +rotate +loomed +##eil +##nting +amateurs +augsburg +auschwitz +crowns +skeletons +##cona +bonnet +257 +dummy +globalization +simeon +sleeper +mandal +differentiated +##crow +##mare +milne +bundled +exasperated +talmud +owes +segregated +##feng +##uary +dentist +piracy +props +##rang +devlin +##torium +malicious +paws +##laid +dependency +##ergy +##fers +##enna +258 +pistons +rourke +jed +grammatical +tres +maha +wig +512 +ghostly +jayne +##achal +##creen +##ilis +##lins +##rence +designate +##with +arrogance +cambodian +clones +showdown +throttle +twain +##ception +lobes +metz +nagoya +335 +braking +##furt +385 +roaming +##minster +amin +crippled +##37 +##llary +indifferent +hoffmann +idols +intimidating +1751 +261 +influenza +memo +onions +1748 +bandage +consciously +##landa +##rage +clandestine +observes +swiped +tangle +##ener +##jected +##trum +##bill +##lta +hugs +congresses +josiah +spirited +##dek +humanist +managerial +filmmaking +inmate +rhymes +debuting +grimsby +ur +##laze +duplicate +vigor +##tf +republished +bolshevik +refurbishment +antibiotics +martini +methane +newscasts +royale +horizons +levant +iain +visas +##ischen +paler +##around +manifestation +snuck +alf +chop +futile +pedestal +rehab +##kat +bmg +kerman +res +fairbanks +jarrett +abstraction +saharan +##zek +1746 +procedural +clearer +kincaid +sash +luciano +##ffey +crunch +helmut +##vara +revolutionaries +##tute +creamy +leach +##mmon +1747 +permitting +nes +plight +wendell +##lese +contra +ts +clancy +ipa +mach +staples +autopsy +disturbances +nueva +karin +pontiac +##uding +proxy +venerable +haunt +leto +bergman +expands +##helm +wal +##pipe +canning +celine +cords +obesity +##enary +intrusion +planner +##phate +reasoned +sequencing +307 +harrow +##chon +##dora +marred +mcintyre +repay +tarzan +darting +248 +harrisburg +margarita +repulsed +##hur +##lding +belinda +hamburger +novo +compliant +runways +bingham +registrar +skyscraper +ic +cuthbert +improvisation +livelihood +##corp +##elial +admiring +##dened +sporadic +believer +casablanca +popcorn +##29 +asha +shovel +##bek +##dice +coiled +tangible +##dez +casper +elsie +resin +tenderness +rectory +##ivision +avail +sonar +##mori +boutique +##dier +guerre +bathed +upbringing +vaulted +sandals +blessings +##naut +##utnant +1680 +306 +foxes +pia +corrosion +hesitantly +confederates +crystalline +footprints +shapiro +tirana +valentin +drones +45th +microscope +shipments +texted +inquisition +wry +guernsey +unauthorized +resigning +760 +ripple +schubert +stu +reassure +felony +##ardo +brittle +koreans +##havan +##ives +dun +implicit +tyres +##aldi +##lth +magnolia +##ehan +##puri +##poulos +aggressively +fei +gr +familiarity +##poo +indicative +##trust +fundamentally +jimmie +overrun +395 +anchors +moans +##opus +britannia +armagh +##ggle +purposely +seizing +##vao +bewildered +mundane +avoidance +cosmopolitan +geometridae +quartermaster +caf +415 +chatter +engulfed +gleam +purge +##icate +juliette +jurisprudence +guerra +revisions +##bn +casimir +brew +##jm +1749 +clapton +cloudy +conde +hermitage +278 +simulations +torches +vincenzo +matteo +##rill +hidalgo +booming +westbound +accomplishment +tentacles +unaffected +##sius +annabelle +flopped +sloping +##litz +dreamer +interceptor +vu +##loh +consecration +copying +messaging +breaker +climates +hospitalized +1752 +torino +afternoons +winfield +witnessing +##teacher +breakers +choirs +sawmill +coldly +##ege +sipping +haste +uninhabited +conical +bibliography +pamphlets +severn +edict +##oca +deux +illnesses +grips +##pl +rehearsals +sis +thinkers +tame +##keepers +1690 +acacia +reformer +##osed +##rys +shuffling +##iring +##shima +eastbound +ionic +rhea +flees +littered +##oum +rocker +vomiting +groaning +champ +overwhelmingly +civilizations +paces +sloop +adoptive +##tish +skaters +##vres +aiding +mango +##joy +nikola +shriek +##ignon +pharmaceuticals +##mg +tuna +calvert +gustavo +stocked +yearbook +##urai +##mana +computed +subsp +riff +hanoi +kelvin +hamid +moors +pastures +summons +jihad +nectar +##ctors +bayou +untitled +pleasing +vastly +republics +intellect +##η +##ulio +##tou +crumbling +stylistic +sb +##ی +consolation +frequented +h₂o +walden +widows +##iens +404 +##ignment +chunks +improves +288 +grit +recited +##dev +snarl +sociological +##arte +##gul +inquired +##held +bruise +clube +consultancy +homogeneous +hornets +multiplication +pasta +prick +savior +##grin +##kou +##phile +yoon +##gara +grimes +vanishing +cheering +reacting +bn +distillery +##quisite +##vity +coe +dockyard +massif +##jord +escorts +voss +##valent +byte +chopped +hawke +illusions +workings +floats +##koto +##vac +kv +annapolis +madden +##onus +alvaro +noctuidae +##cum +##scopic +avenge +steamboat +forte +illustrates +erika +##trip +570 +dew +nationalities +bran +manifested +thirsty +diversified +muscled +reborn +##standing +arson +##lessness +##dran +##logram +##boys +##kushima +##vious +willoughby +##phobia +286 +alsace +dashboard +yuki +##chai +granville +myspace +publicized +tricked +##gang +adjective +##ater +relic +reorganisation +enthusiastically +indications +saxe +##lassified +consolidate +iec +padua +helplessly +ramps +renaming +regulars +pedestrians +accents +convicts +inaccurate +lowers +mana +##pati +barrie +bjp +outta +someplace +berwick +flanking +invoked +marrow +sparsely +excerpts +clothed +rei +##ginal +wept +##straße +##vish +alexa +excel +##ptive +membranes +aquitaine +creeks +cutler +sheppard +implementations +ns +##dur +fragrance +budge +concordia +magnesium +marcelo +##antes +gladly +vibrating +##rral +##ggles +montrose +##omba +lew +seamus +1630 +cocky +##ament +##uen +bjorn +##rrick +fielder +fluttering +##lase +methyl +kimberley +mcdowell +reductions +barbed +##jic +##tonic +aeronautical +condensed +distracting +##promising +huffed +##cala +##sle +claudius +invincible +missy +pious +balthazar +ci +##lang +butte +combo +orson +##dication +myriad +1707 +silenced +##fed +##rh +coco +netball +yourselves +##oza +clarify +heller +peg +durban +etudes +offender +roast +blackmail +curvature +##woods +vile +309 +illicit +suriname +##linson +overture +1685 +bubbling +gymnast +tucking +##mming +##ouin +maldives +##bala +gurney +##dda +##eased +##oides +backside +pinto +jars +racehorse +tending +##rdial +baronetcy +wiener +duly +##rke +barbarian +cupping +flawed +##thesis +bertha +pleistocene +puddle +swearing +##nob +##tically +fleeting +prostate +amulet +educating +##mined +##iti +##tler +75th +jens +respondents +analytics +cavaliers +papacy +raju +##iente +##ulum +##tip +funnel +271 +disneyland +##lley +sociologist +##iam +2500 +faulkner +louvre +menon +##dson +276 +##ower +afterlife +mannheim +peptide +referees +comedians +meaningless +##anger +##laise +fabrics +hurley +renal +sleeps +##bour +##icle +breakout +kristin +roadside +animator +clover +disdain +unsafe +redesign +##urity +firth +barnsley +portage +reset +narrows +268 +commandos +expansive +speechless +tubular +##lux +essendon +eyelashes +smashwords +##yad +##bang +##claim +craved +sprinted +chet +somme +astor +wrocław +orton +266 +bane +##erving +##uing +mischief +##amps +##sund +scaling +terre +##xious +impairment +offenses +undermine +moi +soy +contiguous +arcadia +inuit +seam +##tops +macbeth +rebelled +##icative +##iot +590 +elaborated +frs +uniformed +##dberg +259 +powerless +priscilla +stimulated +980 +qc +arboretum +frustrating +trieste +bullock +##nified +enriched +glistening +intern +##adia +locus +nouvelle +ollie +ike +lash +starboard +ee +tapestry +headlined +hove +rigged +##vite +pollock +##yme +thrive +clustered +cas +roi +gleamed +olympiad +##lino +pressured +regimes +##hosis +##lick +ripley +##ophone +kickoff +gallon +rockwell +##arable +crusader +glue +revolutions +scrambling +1714 +grover +##jure +englishman +aztec +263 +contemplating +coven +ipad +preach +triumphant +tufts +##esian +rotational +##phus +328 +falkland +##brates +strewn +clarissa +rejoin +environmentally +glint +banded +drenched +moat +albanians +johor +rr +maestro +malley +nouveau +shaded +taxonomy +v6 +adhere +bunk +airfields +##ritan +1741 +encompass +remington +tran +##erative +amelie +mazda +friar +morals +passions +##zai +breadth +vis +##hae +argus +burnham +caressing +insider +rudd +##imov +##mini +##rso +italianate +murderous +textual +wainwright +armada +bam +weave +timer +##taken +##nh +fra +##crest +ardent +salazar +taps +tunis +##ntino +allegro +gland +philanthropic +##chester +implication +##optera +esq +judas +noticeably +wynn +##dara +inched +indexed +crises +villiers +bandit +royalties +patterned +cupboard +interspersed +accessory +isla +kendrick +entourage +stitches +##esthesia +headwaters +##ior +interlude +distraught +draught +1727 +##basket +biased +sy +transient +triad +subgenus +adapting +kidd +shortstop +##umatic +dimly +spiked +mcleod +reprint +nellie +pretoria +windmill +##cek +singled +##mps +273 +reunite +##orous +747 +bankers +outlying +##omp +##ports +##tream +apologies +cosmetics +patsy +##deh +##ocks +##yson +bender +nantes +serene +##nad +lucha +mmm +323 +##cius +##gli +cmll +coinage +nestor +juarez +##rook +smeared +sprayed +twitching +sterile +irina +embodied +juveniles +enveloped +miscellaneous +cancers +dq +gulped +luisa +crested +swat +donegal +ref +##anov +##acker +hearst +mercantile +##lika +doorbell +ua +vicki +##alla +##som +bilbao +psychologists +stryker +sw +horsemen +turkmenistan +wits +##national +anson +mathew +screenings +##umb +rihanna +##agne +##nessy +aisles +##iani +##osphere +hines +kenton +saskatoon +tasha +truncated +##champ +##itan +mildred +advises +fredrik +interpreting +inhibitors +##athi +spectroscopy +##hab +##kong +karim +panda +##oia +##nail +##vc +conqueror +kgb +leukemia +##dity +arrivals +cheered +pisa +phosphorus +shielded +##riated +mammal +unitarian +urgently +chopin +sanitary +##mission +spicy +drugged +hinges +##tort +tipping +trier +impoverished +westchester +##caster +267 +epoch +nonstop +##gman +##khov +aromatic +centrally +cerro +##tively +##vio +billions +modulation +sedimentary +283 +facilitating +outrageous +goldstein +##eak +##kt +ld +maitland +penultimate +pollard +##dance +fleets +spaceship +vertebrae +##nig +alcoholism +als +recital +##bham +##ference +##omics +m2 +##bm +trois +##tropical +##в +commemorates +##meric +marge +##raction +1643 +670 +cosmetic +ravaged +##ige +catastrophe +eng +##shida +albrecht +arterial +bellamy +decor +harmon +##rde +bulbs +synchronized +vito +easiest +shetland +shielding +wnba +##glers +##ssar +##riam +brianna +cumbria +##aceous +##rard +cores +thayer +##nsk +brood +hilltop +luminous +carts +keynote +larkin +logos +##cta +##ا +##mund +##quay +lilith +tinted +277 +wrestle +mobilization +##uses +sequential +siam +bloomfield +takahashi +274 +##ieving +presenters +ringo +blazed +witty +##oven +##ignant +devastation +haydn +harmed +newt +therese +##peed +gershwin +molina +rabbis +sudanese +001 +innate +restarted +##sack +##fus +slices +wb +##shah +enroll +hypothetical +hysterical +1743 +fabio +indefinite +warped +##hg +exchanging +525 +unsuitable +##sboro +gallo +1603 +bret +cobalt +homemade +##hunter +mx +operatives +##dhar +terraces +durable +latch +pens +whorls +##ctuated +##eaux +billing +ligament +succumbed +##gly +regulators +spawn +##brick +##stead +filmfare +rochelle +##nzo +1725 +circumstance +saber +supplements +##nsky +##tson +crowe +wellesley +carrot +##9th +##movable +primate +drury +sincerely +topical +##mad +##rao +callahan +kyiv +smarter +tits +undo +##yeh +announcements +anthologies +barrio +nebula +##islaus +##shaft +##tyn +bodyguards +2021 +assassinate +barns +emmett +scully +##mah +##yd +##eland +##tino +##itarian +demoted +gorman +lashed +prized +adventist +writ +##gui +alla +invertebrates +##ausen +1641 +amman +1742 +align +healy +redistribution +##gf +##rize +insulation +##drop +adherents +hezbollah +vitro +ferns +yanking +269 +php +registering +uppsala +cheerleading +confines +mischievous +tully +##ross +49th +docked +roam +stipulated +pumpkin +##bry +prompt +##ezer +blindly +shuddering +craftsmen +frail +scented +katharine +scramble +shaggy +sponge +helix +zaragoza +279 +##52 +43rd +backlash +fontaine +seizures +posse +cowan +nonfiction +telenovela +wwii +hammered +undone +##gpur +encircled +irs +##ivation +artefacts +oneself +searing +smallpox +##belle +##osaurus +shandong +breached +upland +blushing +rankin +infinitely +psyche +tolerated +docking +evicted +##col +unmarked +##lving +gnome +lettering +litres +musique +##oint +benevolent +##jal +blackened +##anna +mccall +racers +tingle +##ocene +##orestation +introductions +radically +292 +##hiff +##باد +1610 +1739 +munchen +plead +##nka +condo +scissors +##sight +##tens +apprehension +##cey +##yin +hallmark +watering +formulas +sequels +##llas +aggravated +bae +commencing +##building +enfield +prohibits +marne +vedic +civilized +euclidean +jagger +beforehand +blasts +dumont +##arney +##nem +740 +conversions +hierarchical +rios +simulator +##dya +##lellan +hedges +oleg +thrusts +shadowed +darby +maximize +1744 +gregorian +##nded +##routed +sham +unspecified +##hog +emory +factual +##smo +##tp +fooled +##rger +ortega +wellness +marlon +##oton +##urance +casket +keating +ley +enclave +##ayan +char +influencing +jia +##chenko +412 +ammonia +erebidae +incompatible +violins +cornered +##arat +grooves +astronauts +columbian +rampant +fabrication +kyushu +mahmud +vanish +##dern +mesopotamia +##lete +ict +##rgen +caspian +kenji +pitted +##vered +999 +grimace +roanoke +tchaikovsky +twinned +##analysis +##awan +xinjiang +arias +clemson +kazakh +sizable +1662 +##khand +##vard +plunge +tatum +vittorio +##nden +cholera +##dana +##oper +bracing +indifference +projectile +superliga +##chee +realises +upgrading +299 +porte +retribution +##vies +nk +stil +##resses +ama +bureaucracy +blackberry +bosch +testosterone +collapses +greer +##pathic +ioc +fifties +malls +##erved +bao +baskets +adolescents +siegfried +##osity +##tosis +mantra +detecting +existent +fledgling +##cchi +dissatisfied +gan +telecommunication +mingled +sobbed +6000 +controversies +outdated +taxis +##raus +fright +slams +##lham +##fect +##tten +detectors +fetal +tanned +##uw +fray +goth +olympian +skipping +mandates +scratches +sheng +unspoken +hyundai +tracey +hotspur +restrictive +##buch +americana +mundo +##bari +burroughs +diva +vulcan +##6th +distinctions +thumping +##ngen +mikey +sheds +fide +rescues +springsteen +vested +valuation +##ece +##ely +pinnacle +rake +sylvie +##edo +almond +quivering +##irus +alteration +faltered +##wad +51st +hydra +ticked +##kato +recommends +##dicated +antigua +arjun +stagecoach +wilfred +trickle +pronouns +##pon +aryan +nighttime +##anian +gall +pea +stitch +##hei +leung +milos +##dini +eritrea +nexus +starved +snowfall +kant +parasitic +cot +discus +hana +strikers +appleton +kitchens +##erina +##partisan +##itha +##vius +disclose +metis +##channel +1701 +tesla +##vera +fitch +1735 +blooded +##tila +decimal +##tang +##bai +cyclones +eun +bottled +peas +pensacola +basha +bolivian +crabs +boil +lanterns +partridge +roofed +1645 +necks +##phila +opined +patting +##kla +##lland +chuckles +volta +whereupon +##nche +devout +euroleague +suicidal +##dee +inherently +involuntary +knitting +nasser +##hide +puppets +colourful +courageous +southend +stills +miraculous +hodgson +richer +rochdale +ethernet +greta +uniting +prism +umm +##haya +##itical +##utation +deterioration +pointe +prowess +##ropriation +lids +scranton +billings +subcontinent +##koff +##scope +brute +kellogg +psalms +degraded +##vez +stanisław +##ructured +ferreira +pun +astonishing +gunnar +##yat +arya +prc +gottfried +##tight +excursion +##ographer +dina +##quil +##nare +huffington +illustrious +wilbur +gundam +verandah +##zard +naacp +##odle +constructive +fjord +kade +##naud +generosity +thrilling +baseline +cayman +frankish +plastics +accommodations +zoological +##fting +cedric +qb +motorized +##dome +##otted +squealed +tackled +canucks +budgets +situ +asthma +dail +gabled +grasslands +whimpered +writhing +judgments +##65 +minnie +pv +##carbon +bananas +grille +domes +monique +odin +maguire +markham +tierney +##estra +##chua +libel +poke +speedy +atrium +laval +notwithstanding +##edly +fai +kala +##sur +robb +##sma +listings +luz +supplementary +tianjin +##acing +enzo +jd +ric +scanner +croats +transcribed +##49 +arden +cv +##hair +##raphy +##lver +##uy +357 +seventies +staggering +alam +horticultural +hs +regression +timbers +blasting +##ounded +montagu +manipulating +##cit +catalytic +1550 +troopers +##meo +condemnation +fitzpatrick +##oire +##roved +inexperienced +1670 +castes +##lative +outing +314 +dubois +flicking +quarrel +ste +learners +1625 +iq +whistled +##class +282 +classify +tariffs +temperament +355 +folly +liszt +##yles +immersed +jordanian +ceasefire +apparel +extras +maru +fished +##bio +harta +stockport +assortment +craftsman +paralysis +transmitters +##cola +blindness +##wk +fatally +proficiency +solemnly +##orno +repairing +amore +groceries +ultraviolet +##chase +schoolhouse +##tua +resurgence +nailed +##otype +##× +ruse +saliva +diagrams +##tructing +albans +rann +thirties +1b +antennas +hilarious +cougars +paddington +stats +##eger +breakaway +ipod +reza +authorship +prohibiting +scoffed +##etz +##ttle +conscription +defected +trondheim +##fires +ivanov +keenan +##adan +##ciful +##fb +##slow +locating +##ials +##tford +cadiz +basalt +blankly +interned +rags +rattling +##tick +carpathian +reassured +sync +bum +guildford +iss +staunch +##onga +astronomers +sera +sofie +emergencies +susquehanna +##heard +duc +mastery +vh1 +williamsburg +bayer +buckled +craving +##khan +##rdes +bloomington +##write +alton +barbecue +##bians +justine +##hri +##ndt +delightful +smartphone +newtown +photon +retrieval +peugeot +hissing +##monium +##orough +flavors +lighted +relaunched +tainted +##games +##lysis +anarchy +microscopic +hopping +adept +evade +evie +##beau +inhibit +sinn +adjustable +hurst +intuition +wilton +cisco +44th +lawful +lowlands +stockings +thierry +##dalen +##hila +##nai +fates +prank +tb +maison +lobbied +provocative +1724 +4a +utopia +##qual +carbonate +gujarati +purcell +##rford +curtiss +##mei +overgrown +arenas +mediation +swallows +##rnik +respectful +turnbull +##hedron +##hope +alyssa +ozone +##ʻi +ami +gestapo +johansson +snooker +canteen +cuff +declines +empathy +stigma +##ags +##iner +##raine +taxpayers +gui +volga +##wright +##copic +lifespan +overcame +tattooed +enactment +giggles +##ador +##camp +barrington +bribe +obligatory +orbiting +peng +##enas +elusive +sucker +##vating +cong +hardship +empowered +anticipating +estrada +cryptic +greasy +detainees +planck +sudbury +plaid +dod +marriott +kayla +##ears +##vb +##zd +mortally +##hein +cognition +radha +319 +liechtenstein +meade +richly +argyle +harpsichord +liberalism +trumpets +lauded +tyrant +salsa +tiled +lear +promoters +reused +slicing +trident +##chuk +##gami +##lka +cantor +checkpoint +##points +gaul +leger +mammalian +##tov +##aar +##schaft +doha +frenchman +nirvana +##vino +delgado +headlining +##eron +##iography +jug +tko +1649 +naga +intersections +##jia +benfica +nawab +##suka +ashford +gulp +##deck +##vill +##rug +brentford +frazier +pleasures +dunne +potsdam +shenzhen +dentistry +##tec +flanagan +##dorff +##hear +chorale +dinah +prem +quezon +##rogated +relinquished +sutra +terri +##pani +flaps +##rissa +poly +##rnet +homme +aback +##eki +linger +womb +##kson +##lewood +doorstep +orthodoxy +threaded +westfield +##rval +dioceses +fridays +subsided +##gata +loyalists +##biotic +##ettes +letterman +lunatic +prelate +tenderly +invariably +souza +thug +winslow +##otide +furlongs +gogh +jeopardy +##runa +pegasus +##umble +humiliated +standalone +tagged +##roller +freshmen +klan +##bright +attaining +initiating +transatlantic +logged +viz +##uance +1723 +combatants +intervening +stephane +chieftain +despised +grazed +317 +cdc +galveston +godzilla +macro +simulate +##planes +parades +##esses +960 +##ductive +##unes +equator +overdose +##cans +##hosh +##lifting +joshi +epstein +sonora +treacherous +aquatics +manchu +responsive +##sation +supervisory +##christ +##llins +##ibar +##balance +##uso +kimball +karlsruhe +mab +##emy +ignores +phonetic +reuters +spaghetti +820 +almighty +danzig +rumbling +tombstone +designations +lured +outset +##felt +supermarkets +##wt +grupo +kei +kraft +susanna +##blood +comprehension +genealogy +##aghan +##verted +redding +##ythe +1722 +bowing +##pore +##roi +lest +sharpened +fulbright +valkyrie +sikhs +##unds +swans +bouquet +merritt +##tage +##venting +commuted +redhead +clerks +leasing +cesare +dea +hazy +##vances +fledged +greenfield +servicemen +##gical +armando +blackout +dt +sagged +downloadable +intra +potion +pods +##4th +##mism +xp +attendants +gambia +stale +##ntine +plump +asteroids +rediscovered +buds +flea +hive +##neas +1737 +classifications +debuts +##eles +olympus +scala +##eurs +##gno +##mute +hummed +sigismund +visuals +wiggled +await +pilasters +clench +sulfate +##ances +bellevue +enigma +trainee +snort +##sw +clouded +denim +##rank +##rder +churning +hartman +lodges +riches +sima +##missible +accountable +socrates +regulates +mueller +##cr +1702 +avoids +solids +himalayas +nutrient +pup +##jevic +squat +fades +nec +##lates +##pina +##rona +##ου +privateer +tequila +##gative +##mpton +apt +hornet +immortals +##dou +asturias +cleansing +dario +##rries +##anta +etymology +servicing +zhejiang +##venor +##nx +horned +erasmus +rayon +relocating +£10 +##bags +escalated +promenade +stubble +2010s +artisans +axial +liquids +mora +sho +yoo +##tsky +bundles +oldies +##nally +notification +bastion +##ths +sparkle +##lved +1728 +leash +pathogen +highs +##hmi +immature +880 +gonzaga +ignatius +mansions +monterrey +sweets +bryson +##loe +polled +regatta +brightest +pei +rosy +squid +hatfield +payroll +addict +meath +cornerback +heaviest +lodging +##mage +capcom +rippled +##sily +barnet +mayhem +ymca +snuggled +rousseau +##cute +blanchard +284 +fragmented +leighton +chromosomes +risking +##md +##strel +##utter +corinne +coyotes +cynical +hiroshi +yeomanry +##ractive +ebook +grading +mandela +plume +agustin +magdalene +##rkin +bea +femme +trafford +##coll +##lun +##tance +52nd +fourier +upton +##mental +camilla +gust +iihf +islamabad +longevity +##kala +feldman +netting +##rization +endeavour +foraging +mfa +orr +##open +greyish +contradiction +graz +##ruff +handicapped +marlene +tweed +oaxaca +spp +campos +miocene +pri +configured +cooks +pluto +cozy +pornographic +##entes +70th +fairness +glided +jonny +lynne +rounding +sired +##emon +##nist +remade +uncover +##mack +complied +lei +newsweek +##jured +##parts +##enting +##pg +293 +finer +guerrillas +athenian +deng +disused +stepmother +accuse +gingerly +seduction +521 +confronting +##walker +##going +gora +nostalgia +sabres +virginity +wrenched +##minated +syndication +wielding +eyre +##56 +##gnon +##igny +behaved +taxpayer +sweeps +##growth +childless +gallant +##ywood +amplified +geraldine +scrape +##ffi +babylonian +fresco +##rdan +##kney +##position +1718 +restricting +tack +fukuoka +osborn +selector +partnering +##dlow +318 +gnu +kia +tak +whitley +gables +##54 +##mania +mri +softness +immersion +##bots +##evsky +1713 +chilling +insignificant +pcs +##uis +elites +lina +purported +supplemental +teaming +##americana +##dding +##inton +proficient +rouen +##nage +##rret +niccolo +selects +##bread +fluffy +1621 +gruff +knotted +mukherjee +polgara +thrash +nicholls +secluded +smoothing +thru +corsica +loaf +whitaker +inquiries +##rrier +##kam +indochina +289 +marlins +myles +peking +##tea +extracts +pastry +superhuman +connacht +vogel +##ditional +##het +##udged +##lash +gloss +quarries +refit +teaser +##alic +##gaon +20s +materialized +sling +camped +pickering +tung +tracker +pursuant +##cide +cranes +soc +##cini +##typical +##viere +anhalt +overboard +workout +chores +fares +orphaned +stains +##logie +fenton +surpassing +joyah +triggers +##itte +grandmaster +##lass +##lists +clapping +fraudulent +ledger +nagasaki +##cor +##nosis +##tsa +eucalyptus +tun +##icio +##rney +##tara +dax +heroism +ina +wrexham +onboard +unsigned +##dates +moshe +galley +winnie +droplets +exiles +praises +watered +noodles +##aia +fein +adi +leland +multicultural +stink +bingo +comets +erskine +modernized +canned +constraint +domestically +chemotherapy +featherweight +stifled +##mum +darkly +irresistible +refreshing +hasty +isolate +##oys +kitchener +planners +##wehr +cages +yarn +implant +toulon +elects +childbirth +yue +##lind +##lone +cn +rightful +sportsman +junctions +remodeled +specifies +##rgh +291 +##oons +complimented +##urgent +lister +ot +##logic +bequeathed +cheekbones +fontana +gabby +##dial +amadeus +corrugated +maverick +resented +triangles +##hered +##usly +nazareth +tyrol +1675 +assent +poorer +sectional +aegean +##cous +296 +nylon +ghanaian +##egorical +##weig +cushions +forbid +fusiliers +obstruction +somerville +##scia +dime +earrings +elliptical +leyte +oder +polymers +timmy +atm +midtown +piloted +settles +continual +externally +mayfield +##uh +enrichment +henson +keane +persians +1733 +benji +braden +pep +324 +##efe +contenders +pepsi +valet +##isches +298 +##asse +##earing +goofy +stroll +##amen +authoritarian +occurrences +adversary +ahmedabad +tangent +toppled +dorchester +1672 +modernism +marxism +islamist +charlemagne +exponential +racks +unicode +brunette +mbc +pic +skirmish +##bund +##lad +##powered +##yst +hoisted +messina +shatter +##ctum +jedi +vantage +##music +##neil +clemens +mahmoud +corrupted +authentication +lowry +nils +##washed +omnibus +wounding +jillian +##itors +##opped +serialized +narcotics +handheld +##arm +##plicity +intersecting +stimulating +##onis +crate +fellowships +hemingway +casinos +climatic +fordham +copeland +drip +beatty +leaflets +robber +brothel +madeira +##hedral +sphinx +ultrasound +##vana +valor +forbade +leonid +villas +##aldo +duane +marquez +##cytes +disadvantaged +forearms +kawasaki +reacts +consular +lax +uncles +uphold +##hopper +concepcion +dorsey +lass +##izan +arching +passageway +1708 +researches +tia +internationals +##graphs +##opers +distinguishes +javanese +divert +##uven +plotted +##listic +##rwin +##erik +##tify +affirmative +signifies +validation +##bson +kari +felicity +georgina +zulu +##eros +##rained +##rath +overcoming +##dot +argyll +##rbin +1734 +chiba +ratification +windy +earls +parapet +##marks +hunan +pristine +astrid +punta +##gart +brodie +##kota +##oder +malaga +minerva +rouse +##phonic +bellowed +pagoda +portals +reclamation +##gur +##odies +##⁄₄ +parentheses +quoting +allergic +palette +showcases +benefactor +heartland +nonlinear +##tness +bladed +cheerfully +scans +##ety +##hone +1666 +girlfriends +pedersen +hiram +sous +##liche +##nator +1683 +##nery +##orio +##umen +bobo +primaries +smiley +##cb +unearthed +uniformly +fis +metadata +1635 +ind +##oted +recoil +##titles +##tura +##ια +406 +hilbert +jamestown +mcmillan +tulane +seychelles +##frid +antics +coli +fated +stucco +##grants +1654 +bulky +accolades +arrays +caledonian +carnage +optimism +puebla +##tative +##cave +enforcing +rotherham +seo +dunlop +aeronautics +chimed +incline +zoning +archduke +hellenistic +##oses +##sions +candi +thong +##ople +magnate +rustic +##rsk +projective +slant +##offs +danes +hollis +vocalists +##ammed +congenital +contend +gesellschaft +##ocating +##pressive +douglass +quieter +##cm +##kshi +howled +salim +spontaneously +townsville +buena +southport +##bold +kato +1638 +faerie +stiffly +##vus +##rled +297 +flawless +realising +taboo +##7th +bytes +straightening +356 +jena +##hid +##rmin +cartwright +berber +bertram +soloists +411 +noses +417 +coping +fission +hardin +inca +##cen +1717 +mobilized +vhf +##raf +biscuits +curate +##85 +##anial +331 +gaunt +neighbourhoods +1540 +##abas +blanca +bypassed +sockets +behold +coincidentally +##bane +nara +shave +splinter +terrific +##arion +##erian +commonplace +juris +redwood +waistband +boxed +caitlin +fingerprints +jennie +naturalized +##ired +balfour +craters +jody +bungalow +hugely +quilt +glitter +pigeons +undertaker +bulging +constrained +goo +##sil +##akh +assimilation +reworked +##person +persuasion +##pants +felicia +##cliff +##ulent +1732 +explodes +##dun +##inium +##zic +lyman +vulture +hog +overlook +begs +northwards +ow +spoil +##urer +fatima +favorably +accumulate +sargent +sorority +corresponded +dispersal +kochi +toned +##imi +##lita +internacional +newfound +##agger +##lynn +##rigue +booths +peanuts +##eborg +medicare +muriel +nur +##uram +crates +millennia +pajamas +worsened +##breakers +jimi +vanuatu +yawned +##udeau +carousel +##hony +hurdle +##ccus +##mounted +##pod +rv +##eche +airship +ambiguity +compulsion +recapture +##claiming +arthritis +##osomal +1667 +asserting +ngc +sniffing +dade +discontent +glendale +ported +##amina +defamation +rammed +##scent +fling +livingstone +##fleet +875 +##ppy +apocalyptic +comrade +lcd +##lowe +cessna +eine +persecuted +subsistence +demi +hoop +reliefs +710 +coptic +progressing +stemmed +perpetrators +1665 +priestess +##nio +dobson +ebony +rooster +itf +tortricidae +##bbon +##jian +cleanup +##jean +##øy +1721 +eighties +taxonomic +holiness +##hearted +##spar +antilles +showcasing +stabilized +##nb +gia +mascara +michelangelo +dawned +##uria +##vinsky +extinguished +fitz +grotesque +£100 +##fera +##loid +##mous +barges +neue +throbbed +cipher +johnnie +##a1 +##mpt +outburst +##swick +spearheaded +administrations +c1 +heartbreak +pixels +pleasantly +##enay +lombardy +plush +##nsed +bobbie +##hly +reapers +tremor +xiang +minogue +substantive +hitch +barak +##wyl +kwan +##encia +910 +obscene +elegance +indus +surfer +bribery +conserve +##hyllum +##masters +horatio +##fat +apes +rebound +psychotic +##pour +iteration +##mium +##vani +botanic +horribly +antiques +dispose +paxton +##hli +##wg +timeless +1704 +disregard +engraver +hounds +##bau +##version +looted +uno +facilitates +groans +masjid +rutland +antibody +disqualification +decatur +footballers +quake +slacks +48th +rein +scribe +stabilize +commits +exemplary +tho +##hort +##chison +pantry +traversed +##hiti +disrepair +identifiable +vibrated +baccalaureate +##nnis +csa +interviewing +##iensis +##raße +greaves +wealthiest +343 +classed +jogged +£5 +##58 +##atal +illuminating +knicks +respecting +##uno +scrubbed +##iji +##dles +kruger +moods +growls +raider +silvia +chefs +kam +vr +cree +percival +##terol +gunter +counterattack +defiant +henan +ze +##rasia +##riety +equivalence +submissions +##fra +##thor +bautista +mechanically +##heater +cornice +herbal +templar +##mering +outputs +ruining +ligand +renumbered +extravagant +mika +blockbuster +eta +insurrection +##ilia +darkening +ferocious +pianos +strife +kinship +##aer +melee +##anor +##iste +##may +##oue +decidedly +weep +##jad +##missive +##ppel +354 +puget +unease +##gnant +1629 +hammering +kassel +ob +wessex +##lga +bromwich +egan +paranoia +utilization +##atable +##idad +contradictory +provoke +##ols +##ouring +##tangled +knesset +##very +##lette +plumbing +##sden +##¹ +greensboro +occult +sniff +338 +zev +beaming +gamer +haggard +mahal +##olt +##pins +mendes +utmost +briefing +gunnery +##gut +##pher +##zh +##rok +1679 +khalifa +sonya +##boot +principals +urbana +wiring +##liffe +##minating +##rrado +dahl +nyu +skepticism +np +townspeople +ithaca +lobster +somethin +##fur +##arina +##−1 +freighter +zimmerman +biceps +contractual +##herton +amend +hurrying +subconscious +##anal +336 +meng +clermont +spawning +##eia +##lub +dignitaries +impetus +snacks +spotting +twigs +##bilis +##cz +##ouk +libertadores +nic +skylar +##aina +##firm +gustave +asean +##anum +dieter +legislatures +flirt +bromley +trolls +umar +##bbies +##tyle +blah +parc +bridgeport +crank +negligence +##nction +46th +constantin +molded +bandages +seriousness +00pm +siegel +carpets +compartments +upbeat +statehood +##dner +##edging +marko +730 +platt +##hane +paving +##iy +1738 +abbess +impatience +limousine +nbl +##talk +441 +lucille +mojo +nightfall +robbers +##nais +karel +brisk +calves +replicate +ascribed +telescopes +##olf +intimidated +##reen +ballast +specialization +##sit +aerodynamic +caliphate +rainer +visionary +##arded +epsilon +##aday +##onte +aggregation +auditory +boosted +reunification +kathmandu +loco +robyn +402 +acknowledges +appointing +humanoid +newell +redeveloped +restraints +##tained +barbarians +chopper +1609 +italiana +##lez +##lho +investigates +wrestlemania +##anies +##bib +690 +##falls +creaked +dragoons +gravely +minions +stupidity +volley +##harat +##week +musik +##eries +##uously +fungal +massimo +semantics +malvern +##ahl +##pee +discourage +embryo +imperialism +1910s +profoundly +##ddled +jiangsu +sparkled +stat +##holz +sweatshirt +tobin +##iction +sneered +##cheon +##oit +brit +causal +smyth +##neuve +diffuse +perrin +silvio +##ipes +##recht +detonated +iqbal +selma +##nism +##zumi +roasted +##riders +tay +##ados +##mament +##mut +##rud +840 +completes +nipples +cfa +flavour +hirsch +##laus +calderon +sneakers +moravian +##ksha +1622 +rq +294 +##imeters +bodo +##isance +##pre +##ronia +anatomical +excerpt +##lke +dh +kunst +##tablished +##scoe +biomass +panted +unharmed +gael +housemates +montpellier +##59 +coa +rodents +tonic +hickory +singleton +##taro +451 +1719 +aldo +breaststroke +dempsey +och +rocco +##cuit +merton +dissemination +midsummer +serials +##idi +haji +polynomials +##rdon +gs +enoch +prematurely +shutter +taunton +£3 +##grating +##inates +archangel +harassed +##asco +326 +archway +dazzling +##ecin +1736 +sumo +wat +##kovich +1086 +honneur +##ently +##nostic +##ttal +##idon +1605 +403 +1716 +blogger +rents +##gnan +hires +##ikh +##dant +howie +##rons +handler +retracted +shocks +1632 +arun +duluth +kepler +trumpeter +##lary +peeking +seasoned +trooper +##mara +laszlo +##iciencies +##rti +heterosexual +##inatory +##ssion +indira +jogging +##inga +##lism +beit +dissatisfaction +malice +##ately +nedra +peeling +##rgeon +47th +stadiums +475 +vertigo +##ains +iced +restroom +##plify +##tub +illustrating +pear +##chner +##sibility +inorganic +rappers +receipts +watery +##kura +lucinda +##oulos +reintroduced +##8th +##tched +gracefully +saxons +nutritional +wastewater +rained +favourites +bedrock +fisted +hallways +likeness +upscale +##lateral +1580 +blinds +prequel +##pps +##tama +deter +humiliating +restraining +tn +vents +1659 +laundering +recess +rosary +tractors +coulter +federer +##ifiers +##plin +persistence +##quitable +geschichte +pendulum +quakers +##beam +bassett +pictorial +buffet +koln +##sitor +drills +reciprocal +shooters +##57 +##cton +##tees +converge +pip +dmitri +donnelly +yamamoto +aqua +azores +demographics +hypnotic +spitfire +suspend +wryly +roderick +##rran +sebastien +##asurable +mavericks +##fles +##200 +himalayan +prodigy +##iance +transvaal +demonstrators +handcuffs +dodged +mcnamara +sublime +1726 +crazed +##efined +##till +ivo +pondered +reconciled +shrill +sava +##duk +bal +cad +heresy +jaipur +goran +##nished +341 +lux +shelly +whitehall +##hre +israelis +peacekeeping +##wled +1703 +demetrius +ousted +##arians +##zos +beale +anwar +backstroke +raged +shrinking +cremated +##yck +benign +towing +wadi +darmstadt +landfill +parana +soothe +colleen +sidewalks +mayfair +tumble +hepatitis +ferrer +superstructure +##gingly +##urse +##wee +anthropological +translators +##mies +closeness +hooves +##pw +mondays +##roll +##vita +landscaping +##urized +purification +sock +thorns +thwarted +jalan +tiberius +##taka +saline +##rito +confidently +khyber +sculptors +##ij +brahms +hammersmith +inspectors +battista +fivb +fragmentation +hackney +##uls +arresting +exercising +antoinette +bedfordshire +##zily +dyed +##hema +1656 +racetrack +variability +##tique +1655 +austrians +deteriorating +madman +theorists +aix +lehman +weathered +1731 +decreed +eruptions +1729 +flaw +quinlan +sorbonne +flutes +nunez +1711 +adored +downwards +fable +rasped +1712 +moritz +mouthful +renegade +shivers +stunts +dysfunction +restrain +translit +327 +pancakes +##avio +##cision +##tray +351 +vial +##lden +bain +##maid +##oxide +chihuahua +malacca +vimes +##rba +##rnier +1664 +donnie +plaques +##ually +337 +bangs +floppy +huntsville +loretta +nikolay +##otte +eater +handgun +ubiquitous +##hett +eras +zodiac +1634 +##omorphic +1820s +##zog +cochran +##bula +##lithic +warring +##rada +dalai +excused +blazers +mcconnell +reeling +bot +este +##abi +geese +hoax +taxon +##bla +guitarists +##icon +condemning +hunts +inversion +moffat +taekwondo +##lvis +1624 +stammered +##rest +##rzy +sousa +fundraiser +marylebone +navigable +uptown +cabbage +daniela +salman +shitty +whimper +##kian +##utive +programmers +protections +rm +##rmi +##rued +forceful +##enes +fuss +##tao +##wash +brat +oppressive +reykjavik +spartak +ticking +##inkles +##kiewicz +adolph +horst +maui +protege +straighten +cpc +landau +concourse +clements +resultant +##ando +imaginative +joo +reactivated +##rem +##ffled +##uising +consultative +##guide +flop +kaitlyn +mergers +parenting +somber +##vron +supervise +vidhan +##imum +courtship +exemplified +harmonies +medallist +refining +##rrow +##ка +amara +##hum +780 +goalscorer +sited +overshadowed +rohan +displeasure +secretive +multiplied +osman +##orth +engravings +padre +##kali +##veda +miniatures +mis +##yala +clap +pali +rook +##cana +1692 +57th +antennae +astro +oskar +1628 +bulldog +crotch +hackett +yucatan +##sure +amplifiers +brno +ferrara +migrating +##gree +thanking +turing +##eza +mccann +ting +andersson +onslaught +gaines +ganga +incense +standardization +##mation +sentai +scuba +stuffing +turquoise +waivers +alloys +##vitt +regaining +vaults +##clops +##gizing +digger +furry +memorabilia +probing +##iad +payton +rec +deutschland +filippo +opaque +seamen +zenith +afrikaans +##filtration +disciplined +inspirational +##merie +banco +confuse +grafton +tod +##dgets +championed +simi +anomaly +biplane +##ceptive +electrode +##para +1697 +cleavage +crossbow +swirl +informant +##lars +##osta +afi +bonfire +spec +##oux +lakeside +slump +##culus +##lais +##qvist +##rrigan +1016 +facades +borg +inwardly +cervical +xl +pointedly +050 +stabilization +##odon +chests +1699 +hacked +ctv +orthogonal +suzy +##lastic +gaulle +jacobite +rearview +##cam +##erted +ashby +##drik +##igate +##mise +##zbek +affectionately +canine +disperse +latham +##istles +##ivar +spielberg +##orin +##idium +ezekiel +cid +##sg +durga +middletown +##cina +customized +frontiers +harden +##etano +##zzy +1604 +bolsheviks +##66 +coloration +yoko +##bedo +briefs +slabs +debra +liquidation +plumage +##oin +blossoms +dementia +subsidy +1611 +proctor +relational +jerseys +parochial +ter +##ici +esa +peshawar +cavalier +loren +cpi +idiots +shamrock +1646 +dutton +malabar +mustache +##endez +##ocytes +referencing +terminates +marche +yarmouth +##sop +acton +mated +seton +subtly +baptised +beige +extremes +jolted +kristina +telecast +##actic +safeguard +waldo +##baldi +##bular +endeavors +sloppy +subterranean +##ensburg +##itung +delicately +pigment +tq +##scu +1626 +##ound +collisions +coveted +herds +##personal +##meister +##nberger +chopra +##ricting +abnormalities +defective +galician +lucie +##dilly +alligator +likened +##genase +burundi +clears +complexion +derelict +deafening +diablo +fingered +champaign +dogg +enlist +isotope +labeling +mrna +##erre +brilliance +marvelous +##ayo +1652 +crawley +ether +footed +dwellers +deserts +hamish +rubs +warlock +skimmed +##lizer +870 +buick +embark +heraldic +irregularities +##ajan +kiara +##kulam +##ieg +antigen +kowalski +##lge +oakley +visitation +##mbit +vt +##suit +1570 +murderers +##miento +##rites +chimneys +##sling +condemn +custer +exchequer +havre +##ghi +fluctuations +##rations +dfb +hendricks +vaccines +##tarian +nietzsche +biking +juicy +##duced +brooding +scrolling +selangor +##ragan +352 +annum +boomed +seminole +sugarcane +##dna +departmental +dismissing +innsbruck +arteries +ashok +batavia +daze +kun +overtook +##rga +##tlan +beheaded +gaddafi +holm +electronically +faulty +galilee +fractures +kobayashi +##lized +gunmen +magma +aramaic +mala +eastenders +inference +messengers +bf +##qu +407 +bathrooms +##vere +1658 +flashbacks +ideally +misunderstood +##jali +##weather +mendez +##grounds +505 +uncanny +##iii +1709 +friendships +##nbc +sacrament +accommodated +reiterated +logistical +pebbles +thumped +##escence +administering +decrees +drafts +##flight +##cased +##tula +futuristic +picket +intimidation +winthrop +##fahan +interfered +339 +afar +francoise +morally +uta +cochin +croft +dwarfs +##bruck +##dents +##nami +biker +##hner +##meral +nano +##isen +##ometric +##pres +##ан +brightened +meek +parcels +securely +gunners +##jhl +##zko +agile +hysteria +##lten +##rcus +bukit +champs +chevy +cuckoo +leith +sadler +theologians +welded +##section +1663 +jj +plurality +xander +##rooms +##formed +shredded +temps +intimately +pau +tormented +##lok +##stellar +1618 +charred +ems +essen +##mmel +alarms +spraying +ascot +blooms +twinkle +##abia +##apes +internment +obsidian +##chaft +snoop +##dav +##ooping +malibu +##tension +quiver +##itia +hays +mcintosh +travers +walsall +##ffie +1623 +beverley +schwarz +plunging +structurally +m3 +rosenthal +vikram +##tsk +770 +ghz +##onda +##tiv +chalmers +groningen +pew +reckon +unicef +##rvis +55th +##gni +1651 +sulawesi +avila +cai +metaphysical +screwing +turbulence +##mberg +augusto +samba +56th +baffled +momentary +toxin +##urian +##wani +aachen +condoms +dali +steppe +##3d +##app +##oed +##year +adolescence +dauphin +electrically +inaccessible +microscopy +nikita +##ega +atv +##cel +##enter +##oles +##oteric +##ы +accountants +punishments +wrongly +bribes +adventurous +clinch +flinders +southland +##hem +##kata +gough +##ciency +lads +soared +##ה +undergoes +deformation +outlawed +rubbish +##arus +##mussen +##nidae +##rzburg +arcs +##ingdon +##tituted +1695 +wheelbase +wheeling +bombardier +campground +zebra +##lices +##oj +##bain +lullaby +##ecure +donetsk +wylie +grenada +##arding +##ης +squinting +eireann +opposes +##andra +maximal +runes +##broken +##cuting +##iface +##ror +##rosis +additive +britney +adultery +triggering +##drome +detrimental +aarhus +containment +jc +swapped +vichy +##ioms +madly +##oric +##rag +brant +##ckey +##trix +1560 +1612 +broughton +rustling +##stems +##uder +asbestos +mentoring +##nivorous +finley +leaps +##isan +apical +pry +slits +substitutes +##dict +intuitive +fantasia +insistent +unreasonable +##igen +##vna +domed +hannover +margot +ponder +##zziness +impromptu +jian +lc +rampage +stemming +##eft +andrey +gerais +whichever +amnesia +appropriated +anzac +clicks +modifying +ultimatum +cambrian +maids +verve +yellowstone +##mbs +conservatoire +##scribe +adherence +dinners +spectra +imperfect +mysteriously +sidekick +tatar +tuba +##aks +##ifolia +distrust +##athan +##zle +c2 +ronin +zac +##pse +celaena +instrumentalist +scents +skopje +##mbling +comical +compensated +vidal +condor +intersect +jingle +wavelengths +##urrent +mcqueen +##izzly +carp +weasel +422 +kanye +militias +postdoctoral +eugen +gunslinger +##ɛ +faux +hospice +##for +appalled +derivation +dwarves +##elis +dilapidated +##folk +astoria +philology +##lwyn +##otho +##saka +inducing +philanthropy +##bf +##itative +geek +markedly +sql +##yce +bessie +indices +rn +##flict +495 +frowns +resolving +weightlifting +tugs +cleric +contentious +1653 +mania +rms +##miya +##reate +##ruck +##tucket +bien +eels +marek +##ayton +##cence +discreet +unofficially +##ife +leaks +##bber +1705 +332 +dung +compressor +hillsborough +pandit +shillings +distal +##skin +381 +##tat +##you +nosed +##nir +mangrove +undeveloped +##idia +textures +##inho +##500 +##rise +ae +irritating +nay +amazingly +bancroft +apologetic +compassionate +kata +symphonies +##lovic +airspace +##lch +930 +gifford +precautions +fulfillment +sevilla +vulgar +martinique +##urities +looting +piccolo +tidy +##dermott +quadrant +armchair +incomes +mathematicians +stampede +nilsson +##inking +##scan +foo +quarterfinal +##ostal +shang +shouldered +squirrels +##owe +344 +vinegar +##bner +##rchy +##systems +delaying +##trics +ars +dwyer +rhapsody +sponsoring +##gration +bipolar +cinder +starters +##olio +##urst +421 +signage +##nty +aground +figurative +mons +acquaintances +duets +erroneously +soyuz +elliptic +recreated +##cultural +##quette +##ssed +##tma +##zcz +moderator +scares +##itaire +##stones +##udence +juniper +sighting +##just +##nsen +britten +calabria +ry +bop +cramer +forsyth +stillness +##л +airmen +gathers +unfit +##umber +##upt +taunting +##rip +seeker +streamlined +##bution +holster +schumann +tread +vox +##gano +##onzo +strive +dil +reforming +covent +newbury +predicting +##orro +decorate +tre +##puted +andover +ie +asahi +dept +dunkirk +gills +##tori +buren +huskies +##stis +##stov +abstracts +bets +loosen +##opa +1682 +yearning +##glio +##sir +berman +effortlessly +enamel +napoli +persist +##peration +##uez +attache +elisa +b1 +invitations +##kic +accelerating +reindeer +boardwalk +clutches +nelly +polka +starbucks +##kei +adamant +huey +lough +unbroken +adventurer +embroidery +inspecting +stanza +##ducted +naia +taluka +##pone +##roids +chases +deprivation +florian +##jing +##ppet +earthly +##lib +##ssee +colossal +foreigner +vet +freaks +patrice +rosewood +triassic +upstate +##pkins +dominates +ata +chants +ks +vo +##400 +##bley +##raya +##rmed +555 +agra +infiltrate +##ailing +##ilation +##tzer +##uppe +##werk +binoculars +enthusiast +fujian +squeak +##avs +abolitionist +almeida +boredom +hampstead +marsden +rations +##ands +inflated +334 +bonuses +rosalie +patna +##rco +329 +detachments +penitentiary +54th +flourishing +woolf +##dion +##etched +papyrus +##lster +##nsor +##toy +bobbed +dismounted +endelle +inhuman +motorola +tbs +wince +wreath +##ticus +hideout +inspections +sanjay +disgrace +infused +pudding +stalks +##urbed +arsenic +leases +##hyl +##rrard +collarbone +##waite +##wil +dowry +##bant +##edance +genealogical +nitrate +salamanca +scandals +thyroid +necessitated +##! +##" +### +##$ +##% +##& +##' +##( +##) +##* +##+ +##, +##- +##. +##/ +##: +##; +##< +##= +##> +##? +##@ +##[ +##\ +##] +##^ +##_ +##` +##{ +##| +##} +##~ +##¡ +##¢ +##£ +##¤ +##¥ +##¦ +##§ +##¨ +##© +##ª +##« +##¬ +##® +##± +##´ +##µ +##¶ +##· +##º +##» +##¼ +##¾ +##¿ +##æ +##ð +##÷ +##þ +##đ +##ħ +##ŋ +##œ +##ƒ +##ɐ +##ɑ +##ɒ +##ɔ +##ɕ +##ə +##ɡ +##ɣ +##ɨ +##ɪ +##ɫ +##ɬ +##ɯ +##ɲ +##ɴ +##ɹ +##ɾ +##ʀ +##ʁ +##ʂ +##ʃ +##ʉ +##ʊ +##ʋ +##ʌ +##ʎ +##ʐ +##ʑ +##ʒ +##ʔ +##ʰ +##ʲ +##ʳ +##ʷ +##ʸ +##ʻ +##ʼ +##ʾ +##ʿ +##ˈ +##ˡ +##ˢ +##ˣ +##ˤ +##β +##γ +##δ +##ε +##ζ +##θ +##κ +##λ +##μ +##ξ +##ο +##π +##ρ +##σ +##τ +##υ +##φ +##χ +##ψ +##ω +##б +##г +##д +##ж +##з +##м +##п +##с +##у +##ф +##х +##ц +##ч +##ш +##щ +##ъ +##э +##ю +##ђ +##є +##і +##ј +##љ +##њ +##ћ +##ӏ +##ա +##բ +##գ +##դ +##ե +##թ +##ի +##լ +##կ +##հ +##մ +##յ +##ն +##ո +##պ +##ս +##վ +##տ +##ր +##ւ +##ք +##־ +##א +##ב +##ג +##ד +##ו +##ז +##ח +##ט +##י +##ך +##כ +##ל +##ם +##מ +##ן +##נ +##ס +##ע +##ף +##פ +##ץ +##צ +##ק +##ר +##ש +##ת +##، +##ء +##ب +##ت +##ث +##ج +##ح +##خ +##ذ +##ز +##س +##ش +##ص +##ض +##ط +##ظ +##ع +##غ +##ـ +##ف +##ق +##ك +##و +##ى +##ٹ +##پ +##چ +##ک +##گ +##ں +##ھ +##ہ +##ے +##अ +##आ +##उ +##ए +##क +##ख +##ग +##च +##ज +##ट +##ड +##ण +##त +##थ +##द +##ध +##न +##प +##ब +##भ +##म +##य +##र +##ल +##व +##श +##ष +##स +##ह +##ा +##ि +##ी +##ो +##। +##॥ +##ং +##অ +##আ +##ই +##উ +##এ +##ও +##ক +##খ +##গ +##চ +##ছ +##জ +##ট +##ড +##ণ +##ত +##থ +##দ +##ধ +##ন +##প +##ব +##ভ +##ম +##য +##র +##ল +##শ +##ষ +##স +##হ +##া +##ি +##ী +##ে +##க +##ச +##ட +##த +##ந +##ன +##ப +##ம +##ய +##ர +##ல +##ள +##வ +##ா +##ி +##ு +##ே +##ை +##ನ +##ರ +##ಾ +##ක +##ය +##ර +##ල +##ව +##ා +##ก +##ง +##ต +##ท +##น +##พ +##ม +##ย +##ร +##ล +##ว +##ส +##อ +##า +##เ +##་ +##། +##ག +##ང +##ད +##ན +##པ +##བ +##མ +##འ +##ར +##ལ +##ས +##မ +##ა +##ბ +##გ +##დ +##ე +##ვ +##თ +##ი +##კ +##ლ +##მ +##ნ +##ო +##რ +##ს +##ტ +##უ +##ᄀ +##ᄂ +##ᄃ +##ᄅ +##ᄆ +##ᄇ +##ᄉ +##ᄊ +##ᄋ +##ᄌ +##ᄎ +##ᄏ +##ᄐ +##ᄑ +##ᄒ +##ᅡ +##ᅢ +##ᅥ +##ᅦ +##ᅧ +##ᅩ +##ᅪ +##ᅭ +##ᅮ +##ᅯ +##ᅲ +##ᅳ +##ᅴ +##ᅵ +##ᆨ +##ᆫ +##ᆯ +##ᆷ +##ᆸ +##ᆼ +##ᴬ +##ᴮ +##ᴰ +##ᴵ +##ᴺ +##ᵀ +##ᵃ +##ᵇ +##ᵈ +##ᵉ +##ᵍ +##ᵏ +##ᵐ +##ᵒ +##ᵖ +##ᵗ +##ᵘ +##ᵣ +##ᵤ +##ᵥ +##ᶜ +##ᶠ +##‐ +##‑ +##‒ +##– +##— +##― +##‖ +##‘ +##’ +##‚ +##“ +##” +##„ +##† +##‡ +##• +##… +##‰ +##′ +##″ +##› +##‿ +##⁄ +##⁰ +##ⁱ +##⁴ +##⁵ +##⁶ +##⁷ +##⁸ +##⁹ +##⁻ +##ⁿ +##₅ +##₆ +##₇ +##₈ +##₉ +##₊ +##₍ +##₎ +##ₐ +##ₑ +##ₒ +##ₓ +##ₕ +##ₖ +##ₗ +##ₘ +##ₚ +##ₛ +##ₜ +##₤ +##₩ +##€ +##₱ +##₹ +##ℓ +##№ +##ℝ +##™ +##⅓ +##⅔ +##← +##↑ +##→ +##↓ +##↔ +##↦ +##⇄ +##⇌ +##⇒ +##∂ +##∅ +##∆ +##∇ +##∈ +##∗ +##∘ +##√ +##∞ +##∧ +##∨ +##∩ +##∪ +##≈ +##≡ +##≤ +##≥ +##⊂ +##⊆ +##⊕ +##⊗ +##⋅ +##─ +##│ +##■ +##▪ +##● +##★ +##☆ +##☉ +##♠ +##♣ +##♥ +##♦ +##♯ +##⟨ +##⟩ +##ⱼ +##⺩ +##⺼ +##⽥ +##、 +##。 +##〈 +##〉 +##《 +##》 +##「 +##」 +##『 +##』 +##〜 +##あ +##い +##う +##え +##お +##か +##き +##く +##け +##こ +##さ +##し +##す +##せ +##そ +##た +##ち +##っ +##つ +##て +##と +##な +##に +##ぬ +##ね +##の +##は +##ひ +##ふ +##へ +##ほ +##ま +##み +##む +##め +##も +##や +##ゆ +##よ +##ら +##り +##る +##れ +##ろ +##を +##ん +##ァ +##ア +##ィ +##イ +##ウ +##ェ +##エ +##オ +##カ +##キ +##ク +##ケ +##コ +##サ +##シ +##ス +##セ +##タ +##チ +##ッ +##ツ +##テ +##ト +##ナ +##ニ +##ノ +##ハ +##ヒ +##フ +##ヘ +##ホ +##マ +##ミ +##ム +##メ +##モ +##ャ +##ュ +##ョ +##ラ +##リ +##ル +##レ +##ロ +##ワ +##ン +##・ +##ー +##一 +##三 +##上 +##下 +##不 +##世 +##中 +##主 +##久 +##之 +##也 +##事 +##二 +##五 +##井 +##京 +##人 +##亻 +##仁 +##介 +##代 +##仮 +##伊 +##会 +##佐 +##侍 +##保 +##信 +##健 +##元 +##光 +##八 +##公 +##内 +##出 +##分 +##前 +##劉 +##力 +##加 +##勝 +##北 +##区 +##十 +##千 +##南 +##博 +##原 +##口 +##古 +##史 +##司 +##合 +##吉 +##同 +##名 +##和 +##囗 +##四 +##国 +##國 +##土 +##地 +##坂 +##城 +##堂 +##場 +##士 +##夏 +##外 +##大 +##天 +##太 +##夫 +##奈 +##女 +##子 +##学 +##宀 +##宇 +##安 +##宗 +##定 +##宣 +##宮 +##家 +##宿 +##寺 +##將 +##小 +##尚 +##山 +##岡 +##島 +##崎 +##川 +##州 +##巿 +##帝 +##平 +##年 +##幸 +##广 +##弘 +##張 +##彳 +##後 +##御 +##德 +##心 +##忄 +##志 +##忠 +##愛 +##成 +##我 +##戦 +##戸 +##手 +##扌 +##政 +##文 +##新 +##方 +##日 +##明 +##星 +##春 +##昭 +##智 +##曲 +##書 +##月 +##有 +##朝 +##木 +##本 +##李 +##村 +##東 +##松 +##林 +##森 +##楊 +##樹 +##橋 +##歌 +##止 +##正 +##武 +##比 +##氏 +##民 +##水 +##氵 +##氷 +##永 +##江 +##沢 +##河 +##治 +##法 +##海 +##清 +##漢 +##瀬 +##火 +##版 +##犬 +##王 +##生 +##田 +##男 +##疒 +##発 +##白 +##的 +##皇 +##目 +##相 +##省 +##真 +##石 +##示 +##社 +##神 +##福 +##禾 +##秀 +##秋 +##空 +##立 +##章 +##竹 +##糹 +##美 +##義 +##耳 +##良 +##艹 +##花 +##英 +##華 +##葉 +##藤 +##行 +##街 +##西 +##見 +##訁 +##語 +##谷 +##貝 +##貴 +##車 +##軍 +##辶 +##道 +##郎 +##郡 +##部 +##都 +##里 +##野 +##金 +##鈴 +##镇 +##長 +##門 +##間 +##阝 +##阿 +##陳 +##陽 +##雄 +##青 +##面 +##風 +##食 +##香 +##馬 +##高 +##龍 +##龸 +##fi +##fl +##! +##( +##) +##, +##- +##. +##/ +##: +##? +##~ diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index a7ee4493..ac6f26ba 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -31,13 +31,13 @@ def __init__(self, fixed_length_left: int = 30, Example: - import matchzoo as mz - train_data = mz.datasets.toy.load_data() - test_data = mz.datasets.toy.load_data(stage='test') - # the argument 'bert_vocab_path' must feed the bert vocab path - bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='vocab.txt') - train_data_processed = bert_preprocessor.fit_transform(train_data) - test_data_processed = bert_preprocessor.transform(test_data) + >>> import matchzoo as mz + >>> train_data = mz.datasets.toy.load_data() + >>> test_data = mz.datasets.toy.load_data(stage='test') + >>> # the argument 'bert_vocab_path' must feed the bert vocab path + >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='../datasets/bert_resources/uncased_vocab.txt') + >>> train_data_processed = bert_preprocessor.fit_transform(train_data) + >>> test_data_processed = bert_preprocessor.transform(test_data) """ super().__init__() From 872be4bf7bcf5d9f541490143f399aa28a537ae6 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Fri, 17 May 2019 14:59:20 +0800 Subject: [PATCH 067/100] fix the vocab_path and pass the quick test --- matchzoo/preprocessors/bert_preprocessor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index ac6f26ba..83840d95 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -35,7 +35,7 @@ def __init__(self, fixed_length_left: int = 30, >>> train_data = mz.datasets.toy.load_data() >>> test_data = mz.datasets.toy.load_data(stage='test') >>> # the argument 'bert_vocab_path' must feed the bert vocab path - >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='../datasets/bert_resources/uncased_vocab.txt') + >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='matchzoo/datasets/bert_resources/uncased_vocab.txt') >>> train_data_processed = bert_preprocessor.fit_transform(train_data) >>> test_data_processed = bert_preprocessor.transform(test_data) From 8cdfe8b9eaed04397783845a5ec9a6cdbaabf706 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Fri, 17 May 2019 15:17:48 +0800 Subject: [PATCH 068/100] cut the bert vocab size for test --- .../datasets/bert_resources/uncased_vocab.txt | 30522 ---------------- .../bert_resources/uncased_vocab_100.txt | 101 + matchzoo/preprocessors/bert_preprocessor.py | 2 +- 3 files changed, 102 insertions(+), 30523 deletions(-) delete mode 100644 matchzoo/datasets/bert_resources/uncased_vocab.txt create mode 100644 matchzoo/datasets/bert_resources/uncased_vocab_100.txt diff --git a/matchzoo/datasets/bert_resources/uncased_vocab.txt b/matchzoo/datasets/bert_resources/uncased_vocab.txt deleted file mode 100644 index fb140275..00000000 --- a/matchzoo/datasets/bert_resources/uncased_vocab.txt +++ /dev/null @@ -1,30522 +0,0 @@ -[PAD] -[unused0] -[unused1] -[unused2] -[unused3] -[unused4] -[unused5] -[unused6] -[unused7] -[unused8] -[unused9] -[unused10] -[unused11] -[unused12] -[unused13] -[unused14] -[unused15] -[unused16] -[unused17] -[unused18] -[unused19] -[unused20] -[unused21] -[unused22] -[unused23] -[unused24] -[unused25] -[unused26] -[unused27] -[unused28] -[unused29] -[unused30] -[unused31] -[unused32] -[unused33] -[unused34] -[unused35] -[unused36] -[unused37] -[unused38] -[unused39] -[unused40] -[unused41] -[unused42] -[unused43] -[unused44] -[unused45] -[unused46] -[unused47] -[unused48] -[unused49] -[unused50] -[unused51] -[unused52] -[unused53] -[unused54] -[unused55] -[unused56] -[unused57] -[unused58] -[unused59] -[unused60] -[unused61] -[unused62] -[unused63] -[unused64] -[unused65] -[unused66] -[unused67] -[unused68] -[unused69] -[unused70] -[unused71] -[unused72] -[unused73] -[unused74] -[unused75] -[unused76] -[unused77] -[unused78] -[unused79] -[unused80] -[unused81] -[unused82] -[unused83] -[unused84] -[unused85] -[unused86] -[unused87] -[unused88] -[unused89] -[unused90] -[unused91] -[unused92] -[unused93] -[unused94] -[unused95] -[unused96] -[unused97] -[unused98] -[UNK] -[CLS] -[SEP] -[MASK] -[unused99] -[unused100] -[unused101] -[unused102] -[unused103] -[unused104] -[unused105] -[unused106] -[unused107] -[unused108] -[unused109] -[unused110] -[unused111] -[unused112] -[unused113] -[unused114] -[unused115] -[unused116] -[unused117] -[unused118] -[unused119] -[unused120] -[unused121] -[unused122] -[unused123] -[unused124] -[unused125] -[unused126] -[unused127] -[unused128] -[unused129] -[unused130] -[unused131] -[unused132] -[unused133] -[unused134] -[unused135] -[unused136] -[unused137] -[unused138] -[unused139] -[unused140] -[unused141] -[unused142] -[unused143] -[unused144] -[unused145] -[unused146] -[unused147] -[unused148] -[unused149] -[unused150] -[unused151] -[unused152] -[unused153] -[unused154] -[unused155] -[unused156] -[unused157] -[unused158] -[unused159] -[unused160] -[unused161] -[unused162] -[unused163] -[unused164] -[unused165] -[unused166] -[unused167] -[unused168] -[unused169] -[unused170] -[unused171] -[unused172] -[unused173] -[unused174] -[unused175] -[unused176] -[unused177] -[unused178] -[unused179] -[unused180] -[unused181] -[unused182] -[unused183] -[unused184] -[unused185] -[unused186] -[unused187] -[unused188] -[unused189] -[unused190] -[unused191] -[unused192] -[unused193] -[unused194] -[unused195] -[unused196] -[unused197] -[unused198] -[unused199] -[unused200] -[unused201] -[unused202] -[unused203] -[unused204] -[unused205] -[unused206] -[unused207] -[unused208] -[unused209] -[unused210] -[unused211] -[unused212] -[unused213] -[unused214] -[unused215] -[unused216] -[unused217] -[unused218] -[unused219] -[unused220] -[unused221] -[unused222] -[unused223] -[unused224] -[unused225] -[unused226] -[unused227] -[unused228] -[unused229] -[unused230] -[unused231] -[unused232] -[unused233] -[unused234] -[unused235] -[unused236] -[unused237] -[unused238] -[unused239] -[unused240] -[unused241] -[unused242] -[unused243] -[unused244] -[unused245] -[unused246] -[unused247] -[unused248] -[unused249] -[unused250] -[unused251] -[unused252] -[unused253] -[unused254] -[unused255] -[unused256] -[unused257] -[unused258] -[unused259] -[unused260] -[unused261] -[unused262] -[unused263] -[unused264] -[unused265] -[unused266] -[unused267] -[unused268] -[unused269] -[unused270] -[unused271] -[unused272] -[unused273] -[unused274] -[unused275] -[unused276] -[unused277] -[unused278] -[unused279] -[unused280] -[unused281] -[unused282] -[unused283] -[unused284] -[unused285] -[unused286] -[unused287] -[unused288] -[unused289] -[unused290] -[unused291] -[unused292] -[unused293] -[unused294] -[unused295] -[unused296] -[unused297] -[unused298] -[unused299] -[unused300] -[unused301] -[unused302] -[unused303] -[unused304] -[unused305] -[unused306] -[unused307] -[unused308] -[unused309] -[unused310] -[unused311] -[unused312] -[unused313] -[unused314] -[unused315] -[unused316] -[unused317] -[unused318] -[unused319] -[unused320] -[unused321] -[unused322] -[unused323] -[unused324] -[unused325] -[unused326] -[unused327] -[unused328] -[unused329] -[unused330] -[unused331] -[unused332] -[unused333] -[unused334] -[unused335] -[unused336] -[unused337] -[unused338] -[unused339] -[unused340] -[unused341] -[unused342] -[unused343] -[unused344] -[unused345] -[unused346] -[unused347] -[unused348] -[unused349] -[unused350] -[unused351] -[unused352] -[unused353] -[unused354] -[unused355] -[unused356] -[unused357] -[unused358] -[unused359] -[unused360] -[unused361] -[unused362] -[unused363] -[unused364] -[unused365] -[unused366] -[unused367] -[unused368] -[unused369] -[unused370] -[unused371] -[unused372] -[unused373] -[unused374] -[unused375] -[unused376] -[unused377] -[unused378] -[unused379] -[unused380] -[unused381] -[unused382] -[unused383] -[unused384] -[unused385] -[unused386] -[unused387] -[unused388] -[unused389] -[unused390] -[unused391] -[unused392] -[unused393] -[unused394] -[unused395] -[unused396] -[unused397] -[unused398] -[unused399] -[unused400] -[unused401] -[unused402] -[unused403] -[unused404] -[unused405] -[unused406] -[unused407] -[unused408] -[unused409] -[unused410] -[unused411] -[unused412] -[unused413] -[unused414] -[unused415] -[unused416] -[unused417] -[unused418] -[unused419] -[unused420] -[unused421] -[unused422] -[unused423] -[unused424] -[unused425] -[unused426] -[unused427] -[unused428] -[unused429] -[unused430] -[unused431] -[unused432] -[unused433] -[unused434] -[unused435] -[unused436] -[unused437] -[unused438] -[unused439] -[unused440] -[unused441] -[unused442] -[unused443] -[unused444] -[unused445] -[unused446] -[unused447] -[unused448] -[unused449] -[unused450] -[unused451] -[unused452] -[unused453] -[unused454] -[unused455] -[unused456] -[unused457] -[unused458] -[unused459] -[unused460] -[unused461] -[unused462] -[unused463] -[unused464] -[unused465] -[unused466] -[unused467] -[unused468] -[unused469] -[unused470] -[unused471] -[unused472] -[unused473] -[unused474] -[unused475] -[unused476] -[unused477] -[unused478] -[unused479] -[unused480] -[unused481] -[unused482] -[unused483] -[unused484] -[unused485] -[unused486] -[unused487] -[unused488] -[unused489] -[unused490] -[unused491] -[unused492] -[unused493] -[unused494] -[unused495] -[unused496] -[unused497] -[unused498] -[unused499] -[unused500] -[unused501] -[unused502] -[unused503] -[unused504] -[unused505] -[unused506] -[unused507] -[unused508] -[unused509] -[unused510] -[unused511] -[unused512] -[unused513] -[unused514] -[unused515] -[unused516] -[unused517] -[unused518] -[unused519] -[unused520] -[unused521] -[unused522] -[unused523] -[unused524] -[unused525] -[unused526] -[unused527] -[unused528] -[unused529] -[unused530] -[unused531] -[unused532] -[unused533] -[unused534] -[unused535] -[unused536] -[unused537] -[unused538] -[unused539] -[unused540] -[unused541] -[unused542] -[unused543] -[unused544] -[unused545] -[unused546] -[unused547] -[unused548] -[unused549] -[unused550] -[unused551] -[unused552] -[unused553] -[unused554] -[unused555] -[unused556] -[unused557] -[unused558] -[unused559] -[unused560] -[unused561] -[unused562] -[unused563] -[unused564] -[unused565] -[unused566] -[unused567] -[unused568] -[unused569] -[unused570] -[unused571] -[unused572] -[unused573] -[unused574] -[unused575] -[unused576] -[unused577] -[unused578] -[unused579] -[unused580] -[unused581] -[unused582] -[unused583] -[unused584] -[unused585] -[unused586] -[unused587] -[unused588] -[unused589] -[unused590] -[unused591] -[unused592] -[unused593] -[unused594] -[unused595] -[unused596] -[unused597] -[unused598] -[unused599] -[unused600] -[unused601] -[unused602] -[unused603] -[unused604] -[unused605] -[unused606] -[unused607] -[unused608] -[unused609] -[unused610] -[unused611] -[unused612] -[unused613] -[unused614] -[unused615] -[unused616] -[unused617] -[unused618] -[unused619] -[unused620] -[unused621] -[unused622] -[unused623] -[unused624] -[unused625] -[unused626] -[unused627] -[unused628] -[unused629] -[unused630] -[unused631] -[unused632] -[unused633] -[unused634] -[unused635] -[unused636] -[unused637] -[unused638] -[unused639] -[unused640] -[unused641] -[unused642] -[unused643] -[unused644] -[unused645] -[unused646] -[unused647] -[unused648] -[unused649] -[unused650] -[unused651] -[unused652] -[unused653] -[unused654] -[unused655] -[unused656] -[unused657] -[unused658] -[unused659] -[unused660] -[unused661] -[unused662] -[unused663] -[unused664] -[unused665] -[unused666] -[unused667] -[unused668] -[unused669] -[unused670] -[unused671] -[unused672] -[unused673] -[unused674] -[unused675] -[unused676] -[unused677] -[unused678] -[unused679] -[unused680] -[unused681] -[unused682] -[unused683] -[unused684] -[unused685] -[unused686] -[unused687] -[unused688] -[unused689] -[unused690] -[unused691] -[unused692] -[unused693] -[unused694] -[unused695] -[unused696] -[unused697] -[unused698] -[unused699] -[unused700] -[unused701] -[unused702] -[unused703] -[unused704] -[unused705] -[unused706] -[unused707] -[unused708] -[unused709] -[unused710] -[unused711] -[unused712] -[unused713] -[unused714] -[unused715] -[unused716] -[unused717] -[unused718] -[unused719] -[unused720] -[unused721] -[unused722] -[unused723] -[unused724] -[unused725] -[unused726] -[unused727] -[unused728] -[unused729] -[unused730] -[unused731] -[unused732] -[unused733] -[unused734] -[unused735] -[unused736] -[unused737] -[unused738] -[unused739] -[unused740] -[unused741] -[unused742] -[unused743] -[unused744] -[unused745] -[unused746] -[unused747] -[unused748] -[unused749] -[unused750] -[unused751] -[unused752] -[unused753] -[unused754] -[unused755] -[unused756] -[unused757] -[unused758] -[unused759] -[unused760] -[unused761] -[unused762] -[unused763] -[unused764] -[unused765] -[unused766] -[unused767] -[unused768] -[unused769] -[unused770] -[unused771] -[unused772] -[unused773] -[unused774] -[unused775] -[unused776] -[unused777] -[unused778] -[unused779] -[unused780] -[unused781] -[unused782] -[unused783] -[unused784] -[unused785] -[unused786] -[unused787] -[unused788] -[unused789] -[unused790] -[unused791] -[unused792] -[unused793] -[unused794] -[unused795] -[unused796] -[unused797] -[unused798] -[unused799] -[unused800] -[unused801] -[unused802] -[unused803] -[unused804] -[unused805] -[unused806] -[unused807] -[unused808] -[unused809] -[unused810] -[unused811] -[unused812] -[unused813] -[unused814] -[unused815] -[unused816] -[unused817] -[unused818] -[unused819] -[unused820] -[unused821] -[unused822] -[unused823] -[unused824] -[unused825] -[unused826] -[unused827] -[unused828] -[unused829] -[unused830] -[unused831] -[unused832] -[unused833] -[unused834] -[unused835] -[unused836] -[unused837] -[unused838] -[unused839] -[unused840] -[unused841] -[unused842] -[unused843] -[unused844] -[unused845] -[unused846] -[unused847] -[unused848] -[unused849] -[unused850] -[unused851] -[unused852] -[unused853] -[unused854] -[unused855] -[unused856] -[unused857] -[unused858] -[unused859] -[unused860] -[unused861] -[unused862] -[unused863] -[unused864] -[unused865] -[unused866] -[unused867] -[unused868] -[unused869] -[unused870] -[unused871] -[unused872] -[unused873] -[unused874] -[unused875] -[unused876] -[unused877] -[unused878] -[unused879] -[unused880] -[unused881] -[unused882] -[unused883] -[unused884] -[unused885] -[unused886] -[unused887] -[unused888] -[unused889] -[unused890] -[unused891] -[unused892] -[unused893] -[unused894] -[unused895] -[unused896] -[unused897] -[unused898] -[unused899] -[unused900] -[unused901] -[unused902] -[unused903] -[unused904] -[unused905] -[unused906] -[unused907] -[unused908] -[unused909] -[unused910] -[unused911] -[unused912] -[unused913] -[unused914] -[unused915] -[unused916] -[unused917] -[unused918] -[unused919] -[unused920] -[unused921] -[unused922] -[unused923] -[unused924] -[unused925] -[unused926] -[unused927] -[unused928] -[unused929] -[unused930] -[unused931] -[unused932] -[unused933] -[unused934] -[unused935] -[unused936] -[unused937] -[unused938] -[unused939] -[unused940] -[unused941] -[unused942] -[unused943] -[unused944] -[unused945] -[unused946] -[unused947] -[unused948] -[unused949] -[unused950] -[unused951] -[unused952] -[unused953] -[unused954] -[unused955] -[unused956] -[unused957] -[unused958] -[unused959] -[unused960] -[unused961] -[unused962] -[unused963] -[unused964] -[unused965] -[unused966] -[unused967] -[unused968] -[unused969] -[unused970] -[unused971] -[unused972] -[unused973] -[unused974] -[unused975] -[unused976] -[unused977] -[unused978] -[unused979] -[unused980] -[unused981] -[unused982] -[unused983] -[unused984] -[unused985] -[unused986] -[unused987] -[unused988] -[unused989] -[unused990] -[unused991] -[unused992] -[unused993] -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -< -= -> -? -@ -[ -\ -] -^ -_ -` -a -b -c -d -e -f -g -h -i -j -k -l -m -n -o -p -q -r -s -t -u -v -w -x -y -z -{ -| -} -~ -¡ -¢ -£ -¤ -¥ -¦ -§ -¨ -© -ª -« -¬ -® -° -± -² -³ -´ -µ -¶ -· -¹ -º -» -¼ -½ -¾ -¿ -× -ß -æ -ð -÷ -ø -þ -đ -ħ -ı -ł -ŋ -œ -ƒ -ɐ -ɑ -ɒ -ɔ -ɕ -ə -ɛ -ɡ -ɣ -ɨ -ɪ -ɫ -ɬ -ɯ -ɲ -ɴ -ɹ -ɾ -ʀ -ʁ -ʂ -ʃ -ʉ -ʊ -ʋ -ʌ -ʎ -ʐ -ʑ -ʒ -ʔ -ʰ -ʲ -ʳ -ʷ -ʸ -ʻ -ʼ -ʾ -ʿ -ˈ -ː -ˡ -ˢ -ˣ -ˤ -α -β -γ -δ -ε -ζ -η -θ -ι -κ -λ -μ -ν -ξ -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -а -б -в -г -д -е -ж -з -и -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -щ -ъ -ы -ь -э -ю -я -ђ -є -і -ј -љ -њ -ћ -ӏ -ա -բ -գ -դ -ե -թ -ի -լ -կ -հ -մ -յ -ն -ո -պ -ս -վ -տ -ր -ւ -ք -־ -א -ב -ג -ד -ה -ו -ז -ח -ט -י -ך -כ -ל -ם -מ -ן -נ -ס -ע -ף -פ -ץ -צ -ק -ר -ש -ת -، -ء -ا -ب -ة -ت -ث -ج -ح -خ -د -ذ -ر -ز -س -ش -ص -ض -ط -ظ -ع -غ -ـ -ف -ق -ك -ل -م -ن -ه -و -ى -ي -ٹ -پ -چ -ک -گ -ں -ھ -ہ -ی -ے -अ -आ -उ -ए -क -ख -ग -च -ज -ट -ड -ण -त -थ -द -ध -न -प -ब -भ -म -य -र -ल -व -श -ष -स -ह -ा -ि -ी -ो -। -॥ -ং -অ -আ -ই -উ -এ -ও -ক -খ -গ -চ -ছ -জ -ট -ড -ণ -ত -থ -দ -ধ -ন -প -ব -ভ -ম -য -র -ল -শ -ষ -স -হ -া -ি -ী -ে -க -ச -ட -த -ந -ன -ப -ம -ய -ர -ல -ள -வ -ா -ி -ு -ே -ை -ನ -ರ -ಾ -ක -ය -ර -ල -ව -ා -ก -ง -ต -ท -น -พ -ม -ย -ร -ล -ว -ส -อ -า -เ -་ -། -ག -ང -ད -ན -པ -བ -མ -འ -ར -ལ -ས -မ -ა -ბ -გ -დ -ე -ვ -თ -ი -კ -ლ -მ -ნ -ო -რ -ს -ტ -უ -ᄀ -ᄂ -ᄃ -ᄅ -ᄆ -ᄇ -ᄉ -ᄊ -ᄋ -ᄌ -ᄎ -ᄏ -ᄐ -ᄑ -ᄒ -ᅡ -ᅢ -ᅥ -ᅦ -ᅧ -ᅩ -ᅪ -ᅭ -ᅮ -ᅯ -ᅲ -ᅳ -ᅴ -ᅵ -ᆨ -ᆫ -ᆯ -ᆷ -ᆸ -ᆼ -ᴬ -ᴮ -ᴰ -ᴵ -ᴺ -ᵀ -ᵃ -ᵇ -ᵈ -ᵉ -ᵍ -ᵏ -ᵐ -ᵒ -ᵖ -ᵗ -ᵘ -ᵢ -ᵣ -ᵤ -ᵥ -ᶜ -ᶠ -‐ -‑ -‒ -– -— -― -‖ -‘ -’ -‚ -“ -” -„ -† -‡ -• -… -‰ -′ -″ -› -‿ -⁄ -⁰ -ⁱ -⁴ -⁵ -⁶ -⁷ -⁸ -⁹ -⁺ -⁻ -ⁿ -₀ -₁ -₂ -₃ -₄ -₅ -₆ -₇ -₈ -₉ -₊ -₍ -₎ -ₐ -ₑ -ₒ -ₓ -ₕ -ₖ -ₗ -ₘ -ₙ -ₚ -ₛ -ₜ -₤ -₩ -€ -₱ -₹ -ℓ -№ -ℝ -™ -⅓ -⅔ -← -↑ -→ -↓ -↔ -↦ -⇄ -⇌ -⇒ -∂ -∅ -∆ -∇ -∈ -− -∗ -∘ -√ -∞ -∧ -∨ -∩ -∪ -≈ -≡ -≤ -≥ -⊂ -⊆ -⊕ -⊗ -⋅ -─ -│ -■ -▪ -● -★ -☆ -☉ -♠ -♣ -♥ -♦ -♭ -♯ -⟨ -⟩ -ⱼ -⺩ -⺼ -⽥ -、 -。 -〈 -〉 -《 -》 -「 -」 -『 -』 -〜 -あ -い -う -え -お -か -き -く -け -こ -さ -し -す -せ -そ -た -ち -っ -つ -て -と -な -に -ぬ -ね -の -は -ひ -ふ -へ -ほ -ま -み -む -め -も -や -ゆ -よ -ら -り -る -れ -ろ -を -ん -ァ -ア -ィ -イ -ウ -ェ -エ -オ -カ -キ -ク -ケ -コ -サ -シ -ス -セ -タ -チ -ッ -ツ -テ -ト -ナ -ニ -ノ -ハ -ヒ -フ -ヘ -ホ -マ -ミ -ム -メ -モ -ャ -ュ -ョ -ラ -リ -ル -レ -ロ -ワ -ン -・ -ー -一 -三 -上 -下 -不 -世 -中 -主 -久 -之 -也 -事 -二 -五 -井 -京 -人 -亻 -仁 -介 -代 -仮 -伊 -会 -佐 -侍 -保 -信 -健 -元 -光 -八 -公 -内 -出 -分 -前 -劉 -力 -加 -勝 -北 -区 -十 -千 -南 -博 -原 -口 -古 -史 -司 -合 -吉 -同 -名 -和 -囗 -四 -国 -國 -土 -地 -坂 -城 -堂 -場 -士 -夏 -外 -大 -天 -太 -夫 -奈 -女 -子 -学 -宀 -宇 -安 -宗 -定 -宣 -宮 -家 -宿 -寺 -將 -小 -尚 -山 -岡 -島 -崎 -川 -州 -巿 -帝 -平 -年 -幸 -广 -弘 -張 -彳 -後 -御 -德 -心 -忄 -志 -忠 -愛 -成 -我 -戦 -戸 -手 -扌 -政 -文 -新 -方 -日 -明 -星 -春 -昭 -智 -曲 -書 -月 -有 -朝 -木 -本 -李 -村 -東 -松 -林 -森 -楊 -樹 -橋 -歌 -止 -正 -武 -比 -氏 -民 -水 -氵 -氷 -永 -江 -沢 -河 -治 -法 -海 -清 -漢 -瀬 -火 -版 -犬 -王 -生 -田 -男 -疒 -発 -白 -的 -皇 -目 -相 -省 -真 -石 -示 -社 -神 -福 -禾 -秀 -秋 -空 -立 -章 -竹 -糹 -美 -義 -耳 -良 -艹 -花 -英 -華 -葉 -藤 -行 -街 -西 -見 -訁 -語 -谷 -貝 -貴 -車 -軍 -辶 -道 -郎 -郡 -部 -都 -里 -野 -金 -鈴 -镇 -長 -門 -間 -阝 -阿 -陳 -陽 -雄 -青 -面 -風 -食 -香 -馬 -高 -龍 -龸 -fi -fl -! -( -) -, -- -. -/ -: -? -~ -the -of -and -in -to -was -he -is -as -for -on -with -that -it -his -by -at -from -her -##s -she -you -had -an -were -but -be -this -are -not -my -they -one -which -or -have -him -me -first -all -also -their -has -up -who -out -been -when -after -there -into -new -two -its -##a -time -would -no -what -about -said -we -over -then -other -so -more -##e -can -if -like -back -them -only -some -could -##i -where -just -##ing -during -before -##n -do -##o -made -school -through -than -now -years -most -world -may -between -down -well -three -##d -year -while -will -##ed -##r -##y -later -##t -city -under -around -did -such -being -used -state -people -part -know -against -your -many -second -university -both -national -##er -these -don -known -off -way -until -re -how -even -get -head -... -didn -##ly -team -american -because -de -##l -born -united -film -since -still -long -work -south -us -became -any -high -again -day -family -see -right -man -eyes -house -season -war -states -including -took -life -north -same -each -called -name -much -place -however -go -four -group -another -found -won -area -here -going -10 -away -series -left -home -music -best -make -hand -number -company -several -never -last -john -000 -very -album -take -end -good -too -following -released -game -played -little -began -district -##m -old -want -those -side -held -own -early -county -ll -league -use -west -##u -face -think -##es -2010 -government -##h -march -came -small -general -town -june -##on -line -based -something -##k -september -thought -looked -along -international -2011 -air -july -club -went -january -october -our -august -april -york -12 -few -2012 -2008 -east -show -member -college -2009 -father -public -##us -come -men -five -set -station -church -##c -next -former -november -room -party -located -december -2013 -age -got -2007 -##g -system -let -love -2006 -though -every -2014 -look -song -water -century -without -body -black -night -within -great -women -single -ve -building -large -population -river -named -band -white -started -##an -once -15 -20 -should -18 -2015 -service -top -built -british -open -death -king -moved -local -times -children -february -book -why -11 -door -need -president -order -final -road -wasn -although -due -major -died -village -third -knew -2016 -asked -turned -st -wanted -say -##p -together -received -main -son -served -different -##en -behind -himself -felt -members -power -football -law -voice -play -##in -near -park -history -30 -having -2005 -16 -##man -saw -mother -##al -army -point -front -help -english -street -art -late -hands -games -award -##ia -young -14 -put -published -country -division -across -told -13 -often -ever -french -london -center -six -red -2017 -led -days -include -light -25 -find -tell -among -species -really -according -central -half -2004 -form -original -gave -office -making -enough -lost -full -opened -must -included -live -given -german -player -run -business -woman -community -cup -might -million -land -2000 -court -development -17 -short -round -ii -km -seen -class -story -always -become -sure -research -almost -director -council -la -##2 -career -things -using -island -##z -couldn -car -##is -24 -close -force -##1 -better -free -support -control -field -students -2003 -education -married -##b -nothing -worked -others -record -big -inside -level -anything -continued -give -james -##3 -military -established -non -returned -feel -does -title -written -thing -feet -william -far -co -association -hard -already -2002 -##ra -championship -human -western -100 -##na -department -hall -role -various -production -21 -19 -heart -2001 -living -fire -version -##ers -##f -television -royal -##4 -produced -working -act -case -society -region -present -radio -period -looking -least -total -keep -england -wife -program -per -brother -mind -special -22 -##le -am -works -soon -##6 -political -george -services -taken -created -##7 -further -able -reached -david -union -joined -upon -done -important -social -information -either -##ic -##x -appeared -position -ground -lead -rock -dark -election -23 -board -france -hair -course -arms -site -police -girl -instead -real -sound -##v -words -moment -##te -someone -##8 -summer -project -announced -san -less -wrote -past -followed -##5 -blue -founded -al -finally -india -taking -records -america -##ne -1999 -design -considered -northern -god -stop -battle -toward -european -outside -described -track -today -playing -language -28 -call -26 -heard -professional -low -australia -miles -california -win -yet -green -##ie -trying -blood -##ton -southern -science -maybe -everything -match -square -27 -mouth -video -race -recorded -leave -above -##9 -daughter -points -space -1998 -museum -change -middle -common -##0 -move -tv -post -##ta -lake -seven -tried -elected -closed -ten -paul -minister -##th -months -start -chief -return -canada -person -sea -release -similar -modern -brought -rest -hit -formed -mr -##la -1997 -floor -event -doing -thomas -1996 -robert -care -killed -training -star -week -needed -turn -finished -railway -rather -news -health -sent -example -ran -term -michael -coming -currently -yes -forces -despite -gold -areas -50 -stage -fact -29 -dead -says -popular -2018 -originally -germany -probably -developed -result -pulled -friend -stood -money -running -mi -signed -word -songs -child -eventually -met -tour -average -teams -minutes -festival -current -deep -kind -1995 -decided -usually -eastern -seemed -##ness -episode -bed -added -table -indian -private -charles -route -available -idea -throughout -centre -addition -appointed -style -1994 -books -eight -construction -press -mean -wall -friends -remained -schools -study -##ch -##um -institute -oh -chinese -sometimes -events -possible -1992 -australian -type -brown -forward -talk -process -food -debut -seat -performance -committee -features -character -arts -herself -else -lot -strong -russian -range -hours -peter -arm -##da -morning -dr -sold -##ry -quickly -directed -1993 -guitar -china -##w -31 -list -##ma -performed -media -uk -players -smile -##rs -myself -40 -placed -coach -province -towards -wouldn -leading -whole -boy -official -designed -grand -census -##el -europe -attack -japanese -henry -1991 -##re -##os -cross -getting -alone -action -lower -network -wide -washington -japan -1990 -hospital -believe -changed -sister -##ar -hold -gone -sir -hadn -ship -##ka -studies -academy -shot -rights -below -base -bad -involved -kept -largest -##ist -bank -future -especially -beginning -mark -movement -section -female -magazine -plan -professor -lord -longer -##ian -sat -walked -hill -actually -civil -energy -model -families -size -thus -aircraft -completed -includes -data -captain -##or -fight -vocals -featured -richard -bridge -fourth -1989 -officer -stone -hear -##ism -means -medical -groups -management -self -lips -competition -entire -lived -technology -leaving -federal -tournament -bit -passed -hot -independent -awards -kingdom -mary -spent -fine -doesn -reported -##ling -jack -fall -raised -itself -stay -true -studio -1988 -sports -replaced -paris -systems -saint -leader -theatre -whose -market -capital -parents -spanish -canadian -earth -##ity -cut -degree -writing -bay -christian -awarded -natural -higher -bill -##as -coast -provided -previous -senior -ft -valley -organization -stopped -onto -countries -parts -conference -queen -security -interest -saying -allowed -master -earlier -phone -matter -smith -winning -try -happened -moving -campaign -los -##ley -breath -nearly -mid -1987 -certain -girls -date -italian -african -standing -fell -artist -##ted -shows -deal -mine -industry -1986 -##ng -everyone -republic -provide -collection -library -student -##ville -primary -owned -older -via -heavy -1st -makes -##able -attention -anyone -africa -##ri -stated -length -ended -fingers -command -staff -skin -foreign -opening -governor -okay -medal -kill -sun -cover -job -1985 -introduced -chest -hell -feeling -##ies -success -meet -reason -standard -meeting -novel -1984 -trade -source -buildings -##land -rose -guy -goal -##ur -chapter -native -husband -previously -unit -limited -entered -weeks -producer -operations -mountain -takes -covered -forced -related -roman -complete -successful -key -texas -cold -##ya -channel -1980 -traditional -films -dance -clear -approximately -500 -nine -van -prince -question -active -tracks -ireland -regional -silver -author -personal -sense -operation -##ine -economic -1983 -holding -twenty -isbn -additional -speed -hour -edition -regular -historic -places -whom -shook -movie -km² -secretary -prior -report -chicago -read -foundation -view -engine -scored -1982 -units -ask -airport -property -ready -immediately -lady -month -listed -contract -##de -manager -themselves -lines -##ki -navy -writer -meant -##ts -runs -##ro -practice -championships -singer -glass -commission -required -forest -starting -culture -generally -giving -access -attended -test -couple -stand -catholic -martin -caught -executive -##less -eye -##ey -thinking -chair -quite -shoulder -1979 -hope -decision -plays -defeated -municipality -whether -structure -offered -slowly -pain -ice -direction -##ion -paper -mission -1981 -mostly -200 -noted -individual -managed -nature -lives -plant -##ha -helped -except -studied -computer -figure -relationship -issue -significant -loss -die -smiled -gun -ago -highest -1972 -##am -male -bring -goals -mexico -problem -distance -commercial -completely -location -annual -famous -drive -1976 -neck -1978 -surface -caused -italy -understand -greek -highway -wrong -hotel -comes -appearance -joseph -double -issues -musical -companies -castle -income -review -assembly -bass -initially -parliament -artists -experience -1974 -particular -walk -foot -engineering -talking -window -dropped -##ter -miss -baby -boys -break -1975 -stars -edge -remember -policy -carried -train -stadium -bar -sex -angeles -evidence -##ge -becoming -assistant -soviet -1977 -upper -step -wing -1970 -youth -financial -reach -##ll -actor -numerous -##se -##st -nodded -arrived -##ation -minute -##nt -believed -sorry -complex -beautiful -victory -associated -temple -1968 -1973 -chance -perhaps -metal -##son -1945 -bishop -##et -lee -launched -particularly -tree -le -retired -subject -prize -contains -yeah -theory -empire -##ce -suddenly -waiting -trust -recording -##to -happy -terms -camp -champion -1971 -religious -pass -zealand -names -2nd -port -ancient -tom -corner -represented -watch -legal -anti -justice -cause -watched -brothers -45 -material -changes -simply -response -louis -fast -##ting -answer -60 -historical -1969 -stories -straight -create -feature -increased -rate -administration -virginia -el -activities -cultural -overall -winner -programs -basketball -legs -guard -beyond -cast -doctor -mm -flight -results -remains -cost -effect -winter -##ble -larger -islands -problems -chairman -grew -commander -isn -1967 -pay -failed -selected -hurt -fort -box -regiment -majority -journal -35 -edward -plans -##ke -##ni -shown -pretty -irish -characters -directly -scene -likely -operated -allow -spring -##j -junior -matches -looks -mike -houses -fellow -##tion -beach -marriage -##ham -##ive -rules -oil -65 -florida -expected -nearby -congress -sam -peace -recent -iii -wait -subsequently -cell -##do -variety -serving -agreed -please -poor -joe -pacific -attempt -wood -democratic -piece -prime -##ca -rural -mile -touch -appears -township -1964 -1966 -soldiers -##men -##ized -1965 -pennsylvania -closer -fighting -claimed -score -jones -physical -editor -##ous -filled -genus -specific -sitting -super -mom -##va -therefore -supported -status -fear -cases -store -meaning -wales -minor -spain -tower -focus -vice -frank -follow -parish -separate -golden -horse -fifth -remaining -branch -32 -presented -stared -##id -uses -secret -forms -##co -baseball -exactly -##ck -choice -note -discovered -travel -composed -truth -russia -ball -color -kiss -dad -wind -continue -ring -referred -numbers -digital -greater -##ns -metres -slightly -direct -increase -1960 -responsible -crew -rule -trees -troops -##no -broke -goes -individuals -hundred -weight -creek -sleep -memory -defense -provides -ordered -code -value -jewish -windows -1944 -safe -judge -whatever -corps -realized -growing -pre -##ga -cities -alexander -gaze -lies -spread -scott -letter -showed -situation -mayor -transport -watching -workers -extended -##li -expression -normal -##ment -chart -multiple -border -##ba -host -##ner -daily -mrs -walls -piano -##ko -heat -cannot -##ate -earned -products -drama -era -authority -seasons -join -grade -##io -sign -difficult -machine -1963 -territory -mainly -##wood -stations -squadron -1962 -stepped -iron -19th -##led -serve -appear -sky -speak -broken -charge -knowledge -kilometres -removed -ships -article -campus -simple -##ty -pushed -britain -##ve -leaves -recently -cd -soft -boston -latter -easy -acquired -poland -##sa -quality -officers -presence -planned -nations -mass -broadcast -jean -share -image -influence -wild -offer -emperor -electric -reading -headed -ability -promoted -yellow -ministry -1942 -throat -smaller -politician -##by -latin -spoke -cars -williams -males -lack -pop -80 -##ier -acting -seeing -consists -##ti -estate -1961 -pressure -johnson -newspaper -jr -chris -olympics -online -conditions -beat -elements -walking -vote -##field -needs -carolina -text -featuring -global -block -shirt -levels -francisco -purpose -females -et -dutch -duke -ahead -gas -twice -safety -serious -turning -highly -lieutenant -firm -maria -amount -mixed -daniel -proposed -perfect -agreement -affairs -3rd -seconds -contemporary -paid -1943 -prison -save -kitchen -label -administrative -intended -constructed -academic -nice -teacher -races -1956 -formerly -corporation -ben -nation -issued -shut -1958 -drums -housing -victoria -seems -opera -1959 -graduated -function -von -mentioned -picked -build -recognized -shortly -protection -picture -notable -exchange -elections -1980s -loved -percent -racing -fish -elizabeth -garden -volume -hockey -1941 -beside -settled -##ford -1940 -competed -replied -drew -1948 -actress -marine -scotland -steel -glanced -farm -steve -1957 -risk -tonight -positive -magic -singles -effects -gray -screen -dog -##ja -residents -bus -sides -none -secondary -literature -polish -destroyed -flying -founder -households -1939 -lay -reserve -usa -gallery -##ler -1946 -industrial -younger -approach -appearances -urban -ones -1950 -finish -avenue -powerful -fully -growth -page -honor -jersey -projects -advanced -revealed -basic -90 -infantry -pair -equipment -visit -33 -evening -search -grant -effort -solo -treatment -buried -republican -primarily -bottom -owner -1970s -israel -gives -jim -dream -bob -remain -spot -70 -notes -produce -champions -contact -ed -soul -accepted -ways -del -##ally -losing -split -price -capacity -basis -trial -questions -##ina -1955 -20th -guess -officially -memorial -naval -initial -##ization -whispered -median -engineer -##ful -sydney -##go -columbia -strength -300 -1952 -tears -senate -00 -card -asian -agent -1947 -software -44 -draw -warm -supposed -com -pro -##il -transferred -leaned -##at -candidate -escape -mountains -asia -potential -activity -entertainment -seem -traffic -jackson -murder -36 -slow -product -orchestra -haven -agency -bbc -taught -website -comedy -unable -storm -planning -albums -rugby -environment -scientific -grabbed -protect -##hi -boat -typically -1954 -1953 -damage -principal -divided -dedicated -mount -ohio -##berg -pick -fought -driver -##der -empty -shoulders -sort -thank -berlin -prominent -account -freedom -necessary -efforts -alex -headquarters -follows -alongside -des -simon -andrew -suggested -operating -learning -steps -1949 -sweet -technical -begin -easily -34 -teeth -speaking -settlement -scale -##sh -renamed -ray -max -enemy -semi -joint -compared -##rd -scottish -leadership -analysis -offers -georgia -pieces -captured -animal -deputy -guest -organized -##lin -tony -combined -method -challenge -1960s -huge -wants -battalion -sons -rise -crime -types -facilities -telling -path -1951 -platform -sit -1990s -##lo -tells -assigned -rich -pull -##ot -commonly -alive -##za -letters -concept -conducted -wearing -happen -bought -becomes -holy -gets -ocean -defeat -languages -purchased -coffee -occurred -titled -##q -declared -applied -sciences -concert -sounds -jazz -brain -##me -painting -fleet -tax -nick -##ius -michigan -count -animals -leaders -episodes -##line -content -##den -birth -##it -clubs -64 -palace -critical -refused -fair -leg -laughed -returning -surrounding -participated -formation -lifted -pointed -connected -rome -medicine -laid -taylor -santa -powers -adam -tall -shared -focused -knowing -yards -entrance -falls -##wa -calling -##ad -sources -chosen -beneath -resources -yard -##ite -nominated -silence -zone -defined -##que -gained -thirty -38 -bodies -moon -##ard -adopted -christmas -widely -register -apart -iran -premier -serves -du -unknown -parties -##les -generation -##ff -continues -quick -fields -brigade -quiet -teaching -clothes -impact -weapons -partner -flat -theater -supreme -1938 -37 -relations -##tor -plants -suffered -1936 -wilson -kids -begins -##age -1918 -seats -armed -internet -models -worth -laws -400 -communities -classes -background -knows -thanks -quarter -reaching -humans -carry -killing -format -kong -hong -setting -75 -architecture -disease -railroad -inc -possibly -wish -arthur -thoughts -harry -doors -density -##di -crowd -illinois -stomach -tone -unique -reports -anyway -##ir -liberal -der -vehicle -thick -dry -drug -faced -largely -facility -theme -holds -creation -strange -colonel -##mi -revolution -bell -politics -turns -silent -rail -relief -independence -combat -shape -write -determined -sales -learned -4th -finger -oxford -providing -1937 -heritage -fiction -situated -designated -allowing -distribution -hosted -##est -sight -interview -estimated -reduced -##ria -toronto -footballer -keeping -guys -damn -claim -motion -sport -sixth -stayed -##ze -en -rear -receive -handed -twelve -dress -audience -granted -brazil -##well -spirit -##ated -noticed -etc -olympic -representative -eric -tight -trouble -reviews -drink -vampire -missing -roles -ranked -newly -household -finals -wave -critics -##ee -phase -massachusetts -pilot -unlike -philadelphia -bright -guns -crown -organizations -roof -42 -respectively -clearly -tongue -marked -circle -fox -korea -bronze -brian -expanded -sexual -supply -yourself -inspired -labour -fc -##ah -reference -vision -draft -connection -brand -reasons -1935 -classic -driving -trip -jesus -cells -entry -1920 -neither -trail -claims -atlantic -orders -labor -nose -afraid -identified -intelligence -calls -cancer -attacked -passing -stephen -positions -imperial -grey -jason -39 -sunday -48 -swedish -avoid -extra -uncle -message -covers -allows -surprise -materials -fame -hunter -##ji -1930 -citizens -figures -davis -environmental -confirmed -shit -titles -di -performing -difference -acts -attacks -##ov -existing -votes -opportunity -nor -shop -entirely -trains -opposite -pakistan -##pa -develop -resulted -representatives -actions -reality -pressed -##ish -barely -wine -conversation -faculty -northwest -ends -documentary -nuclear -stock -grace -sets -eat -alternative -##ps -bag -resulting -creating -surprised -cemetery -1919 -drop -finding -sarah -cricket -streets -tradition -ride -1933 -exhibition -target -ear -explained -rain -composer -injury -apartment -municipal -educational -occupied -netherlands -clean -billion -constitution -learn -1914 -maximum -classical -francis -lose -opposition -jose -ontario -bear -core -hills -rolled -ending -drawn -permanent -fun -##tes -##lla -lewis -sites -chamber -ryan -##way -scoring -height -1934 -##house -lyrics -staring -55 -officials -1917 -snow -oldest -##tic -orange -##ger -qualified -interior -apparently -succeeded -thousand -dinner -lights -existence -fans -heavily -41 -greatest -conservative -send -bowl -plus -enter -catch -##un -economy -duty -1929 -speech -authorities -princess -performances -versions -shall -graduate -pictures -effective -remembered -poetry -desk -crossed -starring -starts -passenger -sharp -##ant -acres -ass -weather -falling -rank -fund -supporting -check -adult -publishing -heads -cm -southeast -lane -##burg -application -bc -##ura -les -condition -transfer -prevent -display -ex -regions -earl -federation -cool -relatively -answered -besides -1928 -obtained -portion -##town -mix -##ding -reaction -liked -dean -express -peak -1932 -##tte -counter -religion -chain -rare -miller -convention -aid -lie -vehicles -mobile -perform -squad -wonder -lying -crazy -sword -##ping -attempted -centuries -weren -philosophy -category -##ize -anna -interested -47 -sweden -wolf -frequently -abandoned -kg -literary -alliance -task -entitled -##ay -threw -promotion -factory -tiny -soccer -visited -matt -fm -achieved -52 -defence -internal -persian -43 -methods -##ging -arrested -otherwise -cambridge -programming -villages -elementary -districts -rooms -criminal -conflict -worry -trained -1931 -attempts -waited -signal -bird -truck -subsequent -programme -##ol -ad -49 -communist -details -faith -sector -patrick -carrying -laugh -##ss -controlled -korean -showing -origin -fuel -evil -1927 -##ent -brief -identity -darkness -address -pool -missed -publication -web -planet -ian -anne -wings -invited -##tt -briefly -standards -kissed -##be -ideas -climate -causing -walter -worse -albert -articles -winners -desire -aged -northeast -dangerous -gate -doubt -1922 -wooden -multi -##ky -poet -rising -funding -46 -communications -communication -violence -copies -prepared -ford -investigation -skills -1924 -pulling -electronic -##ak -##ial -##han -containing -ultimately -offices -singing -understanding -restaurant -tomorrow -fashion -christ -ward -da -pope -stands -5th -flow -studios -aired -commissioned -contained -exist -fresh -americans -##per -wrestling -approved -kid -employed -respect -suit -1925 -angel -asking -increasing -frame -angry -selling -1950s -thin -finds -##nd -temperature -statement -ali -explain -inhabitants -towns -extensive -narrow -51 -jane -flowers -images -promise -somewhere -object -fly -closely -##ls -1912 -bureau -cape -1926 -weekly -presidential -legislative -1921 -##ai -##au -launch -founding -##ny -978 -##ring -artillery -strike -un -institutions -roll -writers -landing -chose -kevin -anymore -pp -##ut -attorney -fit -dan -billboard -receiving -agricultural -breaking -sought -dave -admitted -lands -mexican -##bury -charlie -specifically -hole -iv -howard -credit -moscow -roads -accident -1923 -proved -wear -struck -hey -guards -stuff -slid -expansion -1915 -cat -anthony -##kin -melbourne -opposed -sub -southwest -architect -failure -plane -1916 -##ron -map -camera -tank -listen -regarding -wet -introduction -metropolitan -link -ep -fighter -inch -grown -gene -anger -fixed -buy -dvd -khan -domestic -worldwide -chapel -mill -functions -examples -##head -developing -1910 -turkey -hits -pocket -antonio -papers -grow -unless -circuit -18th -concerned -attached -journalist -selection -journey -converted -provincial -painted -hearing -aren -bands -negative -aside -wondered -knight -lap -survey -ma -##ow -noise -billy -##ium -shooting -guide -bedroom -priest -resistance -motor -homes -sounded -giant -##mer -150 -scenes -equal -comic -patients -hidden -solid -actual -bringing -afternoon -touched -funds -wedding -consisted -marie -canal -sr -kim -treaty -turkish -recognition -residence -cathedral -broad -knees -incident -shaped -fired -norwegian -handle -cheek -contest -represent -##pe -representing -beauty -##sen -birds -advantage -emergency -wrapped -drawing -notice -pink -broadcasting -##ong -somehow -bachelor -seventh -collected -registered -establishment -alan -assumed -chemical -personnel -roger -retirement -jeff -portuguese -wore -tied -device -threat -progress -advance -##ised -banks -hired -manchester -nfl -teachers -structures -forever -##bo -tennis -helping -saturday -sale -applications -junction -hip -incorporated -neighborhood -dressed -ceremony -##ds -influenced -hers -visual -stairs -decades -inner -kansas -hung -hoped -gain -scheduled -downtown -engaged -austria -clock -norway -certainly -pale -protected -1913 -victor -employees -plate -putting -surrounded -##ists -finishing -blues -tropical -##ries -minnesota -consider -philippines -accept -54 -retrieved -1900 -concern -anderson -properties -institution -gordon -successfully -vietnam -##dy -backing -outstanding -muslim -crossing -folk -producing -usual -demand -occurs -observed -lawyer -educated -##ana -kelly -string -pleasure -budget -items -quietly -colorado -philip -typical -##worth -derived -600 -survived -asks -mental -##ide -56 -jake -jews -distinguished -ltd -1911 -sri -extremely -53 -athletic -loud -thousands -worried -shadow -transportation -horses -weapon -arena -importance -users -tim -objects -contributed -dragon -douglas -aware -senator -johnny -jordan -sisters -engines -flag -investment -samuel -shock -capable -clark -row -wheel -refers -session -familiar -biggest -wins -hate -maintained -drove -hamilton -request -expressed -injured -underground -churches -walker -wars -tunnel -passes -stupid -agriculture -softly -cabinet -regarded -joining -indiana -##ea -##ms -push -dates -spend -behavior -woods -protein -gently -chase -morgan -mention -burning -wake -combination -occur -mirror -leads -jimmy -indeed -impossible -singapore -paintings -covering -##nes -soldier -locations -attendance -sell -historian -wisconsin -invasion -argued -painter -diego -changing -egypt -##don -experienced -inches -##ku -missouri -vol -grounds -spoken -switzerland -##gan -reform -rolling -ha -forget -massive -resigned -burned -allen -tennessee -locked -values -improved -##mo -wounded -universe -sick -dating -facing -pack -purchase -user -##pur -moments -##ul -merged -anniversary -1908 -coal -brick -understood -causes -dynasty -queensland -establish -stores -crisis -promote -hoping -views -cards -referee -extension -##si -raise -arizona -improve -colonial -formal -charged -##rt -palm -lucky -hide -rescue -faces -95 -feelings -candidates -juan -##ell -goods -6th -courses -weekend -59 -luke -cash -fallen -##om -delivered -affected -installed -carefully -tries -swiss -hollywood -costs -lincoln -responsibility -##he -shore -file -proper -normally -maryland -assistance -jump -constant -offering -friendly -waters -persons -realize -contain -trophy -800 -partnership -factor -58 -musicians -cry -bound -oregon -indicated -hero -houston -medium -##ure -consisting -somewhat -##ara -57 -cycle -##che -beer -moore -frederick -gotten -eleven -worst -weak -approached -arranged -chin -loan -universal -bond -fifteen -pattern -disappeared -##ney -translated -##zed -lip -arab -capture -interests -insurance -##chi -shifted -cave -prix -warning -sections -courts -coat -plot -smell -feed -golf -favorite -maintain -knife -vs -voted -degrees -finance -quebec -opinion -translation -manner -ruled -operate -productions -choose -musician -discovery -confused -tired -separated -stream -techniques -committed -attend -ranking -kings -throw -passengers -measure -horror -fan -mining -sand -danger -salt -calm -decade -dam -require -runner -##ik -rush -associate -greece -##ker -rivers -consecutive -matthew -##ski -sighed -sq -documents -steam -edited -closing -tie -accused -1905 -##ini -islamic -distributed -directors -organisation -bruce -7th -breathing -mad -lit -arrival -concrete -taste -08 -composition -shaking -faster -amateur -adjacent -stating -1906 -twin -flew -##ran -tokyo -publications -##tone -obviously -ridge -storage -1907 -carl -pages -concluded -desert -driven -universities -ages -terminal -sequence -borough -250 -constituency -creative -cousin -economics -dreams -margaret -notably -reduce -montreal -mode -17th -ears -saved -jan -vocal -##ica -1909 -andy -##jo -riding -roughly -threatened -##ise -meters -meanwhile -landed -compete -repeated -grass -czech -regularly -charges -tea -sudden -appeal -##ung -solution -describes -pierre -classification -glad -parking -##ning -belt -physics -99 -rachel -add -hungarian -participate -expedition -damaged -gift -childhood -85 -fifty -##red -mathematics -jumped -letting -defensive -mph -##ux -##gh -testing -##hip -hundreds -shoot -owners -matters -smoke -israeli -kentucky -dancing -mounted -grandfather -emma -designs -profit -argentina -##gs -truly -li -lawrence -cole -begun -detroit -willing -branches -smiling -decide -miami -enjoyed -recordings -##dale -poverty -ethnic -gay -##bi -gary -arabic -09 -accompanied -##one -##ons -fishing -determine -residential -acid -##ary -alice -returns -starred -mail -##ang -jonathan -strategy -##ue -net -forty -cook -businesses -equivalent -commonwealth -distinct -ill -##cy -seriously -##ors -##ped -shift -harris -replace -rio -imagine -formula -ensure -##ber -additionally -scheme -conservation -occasionally -purposes -feels -favor -##and -##ore -1930s -contrast -hanging -hunt -movies -1904 -instruments -victims -danish -christopher -busy -demon -sugar -earliest -colony -studying -balance -duties -##ks -belgium -slipped -carter -05 -visible -stages -iraq -fifa -##im -commune -forming -zero -07 -continuing -talked -counties -legend -bathroom -option -tail -clay -daughters -afterwards -severe -jaw -visitors -##ded -devices -aviation -russell -kate -##vi -entering -subjects -##ino -temporary -swimming -forth -smooth -ghost -audio -bush -operates -rocks -movements -signs -eddie -##tz -ann -voices -honorary -06 -memories -dallas -pure -measures -racial -promised -66 -harvard -ceo -16th -parliamentary -indicate -benefit -flesh -dublin -louisiana -1902 -1901 -patient -sleeping -1903 -membership -coastal -medieval -wanting -element -scholars -rice -62 -limit -survive -makeup -rating -definitely -collaboration -obvious -##tan -boss -ms -baron -birthday -linked -soil -diocese -##lan -ncaa -##mann -offensive -shell -shouldn -waist -##tus -plain -ross -organ -resolution -manufacturing -adding -relative -kennedy -98 -whilst -moth -marketing -gardens -crash -72 -heading -partners -credited -carlos -moves -cable -##zi -marshall -##out -depending -bottle -represents -rejected -responded -existed -04 -jobs -denmark -lock -##ating -treated -graham -routes -talent -commissioner -drugs -secure -tests -reign -restored -photography -##gi -contributions -oklahoma -designer -disc -grin -seattle -robin -paused -atlanta -unusual -##gate -praised -las -laughing -satellite -hungary -visiting -##sky -interesting -factors -deck -poems -norman -##water -stuck -speaker -rifle -domain -premiered -##her -dc -comics -actors -01 -reputation -eliminated -8th -ceiling -prisoners -script -##nce -leather -austin -mississippi -rapidly -admiral -parallel -charlotte -guilty -tools -gender -divisions -fruit -##bs -laboratory -nelson -fantasy -marry -rapid -aunt -tribe -requirements -aspects -suicide -amongst -adams -bone -ukraine -abc -kick -sees -edinburgh -clothing -column -rough -gods -hunting -broadway -gathered -concerns -##ek -spending -ty -12th -snapped -requires -solar -bones -cavalry -##tta -iowa -drinking -waste -index -franklin -charity -thompson -stewart -tip -flash -landscape -friday -enjoy -singh -poem -listening -##back -eighth -fred -differences -adapted -bomb -ukrainian -surgery -corporate -masters -anywhere -##more -waves -odd -sean -portugal -orleans -dick -debate -kent -eating -puerto -cleared -96 -expect -cinema -97 -guitarist -blocks -electrical -agree -involving -depth -dying -panel -struggle -##ged -peninsula -adults -novels -emerged -vienna -metro -debuted -shoes -tamil -songwriter -meets -prove -beating -instance -heaven -scared -sending -marks -artistic -passage -superior -03 -significantly -shopping -##tive -retained -##izing -malaysia -technique -cheeks -##ola -warren -maintenance -destroy -extreme -allied -120 -appearing -##yn -fill -advice -alabama -qualifying -policies -cleveland -hat -battery -smart -authors -10th -soundtrack -acted -dated -lb -glance -equipped -coalition -funny -outer -ambassador -roy -possibility -couples -campbell -dna -loose -ethan -supplies -1898 -gonna -88 -monster -##res -shake -agents -frequency -springs -dogs -practices -61 -gang -plastic -easier -suggests -gulf -blade -exposed -colors -industries -markets -pan -nervous -electoral -charts -legislation -ownership -##idae -mac -appointment -shield -copy -assault -socialist -abbey -monument -license -throne -employment -jay -93 -replacement -charter -cloud -powered -suffering -accounts -oak -connecticut -strongly -wright -colour -crystal -13th -context -welsh -networks -voiced -gabriel -jerry -##cing -forehead -mp -##ens -manage -schedule -totally -remix -##ii -forests -occupation -print -nicholas -brazilian -strategic -vampires -engineers -76 -roots -seek -correct -instrumental -und -alfred -backed -hop -##des -stanley -robinson -traveled -wayne -welcome -austrian -achieve -67 -exit -rates -1899 -strip -whereas -##cs -sing -deeply -adventure -bobby -rick -jamie -careful -components -cap -useful -personality -knee -##shi -pushing -hosts -02 -protest -ca -ottoman -symphony -##sis -63 -boundary -1890 -processes -considering -considerable -tons -##work -##ft -##nia -cooper -trading -dear -conduct -91 -illegal -apple -revolutionary -holiday -definition -harder -##van -jacob -circumstances -destruction -##lle -popularity -grip -classified -liverpool -donald -baltimore -flows -seeking -honour -approval -92 -mechanical -till -happening -statue -critic -increasingly -immediate -describe -commerce -stare -##ster -indonesia -meat -rounds -boats -baker -orthodox -depression -formally -worn -naked -claire -muttered -sentence -11th -emily -document -77 -criticism -wished -vessel -spiritual -bent -virgin -parker -minimum -murray -lunch -danny -printed -compilation -keyboards -false -blow -belonged -68 -raising -78 -cutting -##board -pittsburgh -##up -9th -shadows -81 -hated -indigenous -jon -15th -barry -scholar -ah -##zer -oliver -##gy -stick -susan -meetings -attracted -spell -romantic -##ver -ye -1895 -photo -demanded -customers -##ac -1896 -logan -revival -keys -modified -commanded -jeans -##ious -upset -raw -phil -detective -hiding -resident -vincent -##bly -experiences -diamond -defeating -coverage -lucas -external -parks -franchise -helen -bible -successor -percussion -celebrated -il -lift -profile -clan -romania -##ied -mills -##su -nobody -achievement -shrugged -fault -1897 -rhythm -initiative -breakfast -carbon -700 -69 -lasted -violent -74 -wound -ken -killer -gradually -filmed -°c -dollars -processing -94 -remove -criticized -guests -sang -chemistry -##vin -legislature -disney -##bridge -uniform -escaped -integrated -proposal -purple -denied -liquid -karl -influential -morris -nights -stones -intense -experimental -twisted -71 -84 -##ld -pace -nazi -mitchell -ny -blind -reporter -newspapers -14th -centers -burn -basin -forgotten -surviving -filed -collections -monastery -losses -manual -couch -description -appropriate -merely -tag -missions -sebastian -restoration -replacing -triple -73 -elder -julia -warriors -benjamin -julian -convinced -stronger -amazing -declined -versus -merchant -happens -output -finland -bare -barbara -absence -ignored -dawn -injuries -##port -producers -##ram -82 -luis -##ities -kw -admit -expensive -electricity -nba -exception -symbol -##ving -ladies -shower -sheriff -characteristics -##je -aimed -button -ratio -effectively -summit -angle -jury -bears -foster -vessels -pants -executed -evans -dozen -advertising -kicked -patrol -1889 -competitions -lifetime -principles -athletics -##logy -birmingham -sponsored -89 -rob -nomination -1893 -acoustic -##sm -creature -longest -##tra -credits -harbor -dust -josh -##so -territories -milk -infrastructure -completion -thailand -indians -leon -archbishop -##sy -assist -pitch -blake -arrangement -girlfriend -serbian -operational -hence -sad -scent -fur -dj -sessions -hp -refer -rarely -##ora -exists -1892 -##ten -scientists -dirty -penalty -burst -portrait -seed -79 -pole -limits -rival -1894 -stable -alpha -grave -constitutional -alcohol -arrest -flower -mystery -devil -architectural -relationships -greatly -habitat -##istic -larry -progressive -remote -cotton -##ics -##ok -preserved -reaches -##ming -cited -86 -vast -scholarship -decisions -cbs -joy -teach -1885 -editions -knocked -eve -searching -partly -participation -gap -animated -fate -excellent -##ett -na -87 -alternate -saints -youngest -##ily -climbed -##ita -##tors -suggest -##ct -discussion -staying -choir -lakes -jacket -revenue -nevertheless -peaked -instrument -wondering -annually -managing -neil -1891 -signing -terry -##ice -apply -clinical -brooklyn -aim -catherine -fuck -farmers -figured -ninth -pride -hugh -evolution -ordinary -involvement -comfortable -shouted -tech -encouraged -taiwan -representation -sharing -##lia -##em -panic -exact -cargo -competing -fat -cried -83 -1920s -occasions -pa -cabin -borders -utah -marcus -##isation -badly -muscles -##ance -victorian -transition -warner -bet -permission -##rin -slave -terrible -similarly -shares -seth -uefa -possession -medals -benefits -colleges -lowered -perfectly -mall -transit -##ye -##kar -publisher -##ened -harrison -deaths -elevation -##ae -asleep -machines -sigh -ash -hardly -argument -occasion -parent -leo -decline -1888 -contribution -##ua -concentration -1000 -opportunities -hispanic -guardian -extent -emotions -hips -mason -volumes -bloody -controversy -diameter -steady -mistake -phoenix -identify -violin -##sk -departure -richmond -spin -funeral -enemies -1864 -gear -literally -connor -random -sergeant -grab -confusion -1865 -transmission -informed -op -leaning -sacred -suspended -thinks -gates -portland -luck -agencies -yours -hull -expert -muscle -layer -practical -sculpture -jerusalem -latest -lloyd -statistics -deeper -recommended -warrior -arkansas -mess -supports -greg -eagle -1880 -recovered -rated -concerts -rushed -##ano -stops -eggs -files -premiere -keith -##vo -delhi -turner -pit -affair -belief -paint -##zing -mate -##ach -##ev -victim -##ology -withdrew -bonus -styles -fled -##ud -glasgow -technologies -funded -nbc -adaptation -##ata -portrayed -cooperation -supporters -judges -bernard -justin -hallway -ralph -##ick -graduating -controversial -distant -continental -spider -bite -##ho -recognize -intention -mixing -##ese -egyptian -bow -tourism -suppose -claiming -tiger -dominated -participants -vi -##ru -nurse -partially -tape -##rum -psychology -##rn -essential -touring -duo -voting -civilian -emotional -channels -##king -apparent -hebrew -1887 -tommy -carrier -intersection -beast -hudson -##gar -##zo -lab -nova -bench -discuss -costa -##ered -detailed -behalf -drivers -unfortunately -obtain -##lis -rocky -##dae -siege -friendship -honey -##rian -1861 -amy -hang -posted -governments -collins -respond -wildlife -preferred -operator -##po -laura -pregnant -videos -dennis -suspected -boots -instantly -weird -automatic -businessman -alleged -placing -throwing -ph -mood -1862 -perry -venue -jet -remainder -##lli -##ci -passion -biological -boyfriend -1863 -dirt -buffalo -ron -segment -fa -abuse -##era -genre -thrown -stroke -colored -stress -exercise -displayed -##gen -struggled -##tti -abroad -dramatic -wonderful -thereafter -madrid -component -widespread -##sed -tale -citizen -todd -monday -1886 -vancouver -overseas -forcing -crying -descent -##ris -discussed -substantial -ranks -regime -1870 -provinces -switch -drum -zane -ted -tribes -proof -lp -cream -researchers -volunteer -manor -silk -milan -donated -allies -venture -principle -delivery -enterprise -##ves -##ans -bars -traditionally -witch -reminded -copper -##uk -pete -inter -links -colin -grinned -elsewhere -competitive -frequent -##oy -scream -##hu -tension -texts -submarine -finnish -defending -defend -pat -detail -1884 -affiliated -stuart -themes -villa -periods -tool -belgian -ruling -crimes -answers -folded -licensed -resort -demolished -hans -lucy -1881 -lion -traded -photographs -writes -craig -##fa -trials -generated -beth -noble -debt -percentage -yorkshire -erected -ss -viewed -grades -confidence -ceased -islam -telephone -retail -##ible -chile -m² -roberts -sixteen -##ich -commented -hampshire -innocent -dual -pounds -checked -regulations -afghanistan -sung -rico -liberty -assets -bigger -options -angels -relegated -tribute -wells -attending -leaf -##yan -butler -romanian -forum -monthly -lisa -patterns -gmina -##tory -madison -hurricane -rev -##ians -bristol -##ula -elite -valuable -disaster -democracy -awareness -germans -freyja -##ins -loop -absolutely -paying -populations -maine -sole -prayer -spencer -releases -doorway -bull -##ani -lover -midnight -conclusion -##sson -thirteen -lily -mediterranean -##lt -nhl -proud -sample -##hill -drummer -guinea -##ova -murphy -climb -##ston -instant -attributed -horn -ain -railways -steven -##ao -autumn -ferry -opponent -root -traveling -secured -corridor -stretched -tales -sheet -trinity -cattle -helps -indicates -manhattan -murdered -fitted -1882 -gentle -grandmother -mines -shocked -vegas -produces -##light -caribbean -##ou -belong -continuous -desperate -drunk -historically -trio -waved -raf -dealing -nathan -bat -murmured -interrupted -residing -scientist -pioneer -harold -aaron -##net -delta -attempting -minority -mini -believes -chorus -tend -lots -eyed -indoor -load -shots -updated -jail -##llo -concerning -connecting -wealth -##ved -slaves -arrive -rangers -sufficient -rebuilt -##wick -cardinal -flood -muhammad -whenever -relation -runners -moral -repair -viewers -arriving -revenge -punk -assisted -bath -fairly -breathe -lists -innings -illustrated -whisper -nearest -voters -clinton -ties -ultimate -screamed -beijing -lions -andre -fictional -gathering -comfort -radar -suitable -dismissed -hms -ban -pine -wrist -atmosphere -voivodeship -bid -timber -##ned -##nan -giants -##ane -cameron -recovery -uss -identical -categories -switched -serbia -laughter -noah -ensemble -therapy -peoples -touching -##off -locally -pearl -platforms -everywhere -ballet -tables -lanka -herbert -outdoor -toured -derek -1883 -spaces -contested -swept -1878 -exclusive -slight -connections -##dra -winds -prisoner -collective -bangladesh -tube -publicly -wealthy -thai -##ys -isolated -select -##ric -insisted -pen -fortune -ticket -spotted -reportedly -animation -enforcement -tanks -110 -decides -wider -lowest -owen -##time -nod -hitting -##hn -gregory -furthermore -magazines -fighters -solutions -##ery -pointing -requested -peru -reed -chancellor -knights -mask -worker -eldest -flames -reduction -1860 -volunteers -##tis -reporting -##hl -wire -advisory -endemic -origins -settlers -pursue -knock -consumer -1876 -eu -compound -creatures -mansion -sentenced -ivan -deployed -guitars -frowned -involves -mechanism -kilometers -perspective -shops -maps -terminus -duncan -alien -fist -bridges -##pers -heroes -fed -derby -swallowed -##ros -patent -sara -illness -characterized -adventures -slide -hawaii -jurisdiction -##op -organised -##side -adelaide -walks -biology -se -##ties -rogers -swing -tightly -boundaries -##rie -prepare -implementation -stolen -##sha -certified -colombia -edwards -garage -##mm -recalled -##ball -rage -harm -nigeria -breast -##ren -furniture -pupils -settle -##lus -cuba -balls -client -alaska -21st -linear -thrust -celebration -latino -genetic -terror -##cia -##ening -lightning -fee -witness -lodge -establishing -skull -##ique -earning -hood -##ei -rebellion -wang -sporting -warned -missile -devoted -activist -porch -worship -fourteen -package -1871 -decorated -##shire -housed -##ock -chess -sailed -doctors -oscar -joan -treat -garcia -harbour -jeremy -##ire -traditions -dominant -jacques -##gon -##wan -relocated -1879 -amendment -sized -companion -simultaneously -volleyball -spun -acre -increases -stopping -loves -belongs -affect -drafted -tossed -scout -battles -1875 -filming -shoved -munich -tenure -vertical -romance -pc -##cher -argue -##ical -craft -ranging -www -opens -honest -tyler -yesterday -virtual -##let -muslims -reveal -snake -immigrants -radical -screaming -speakers -firing -saving -belonging -ease -lighting -prefecture -blame -farmer -hungry -grows -rubbed -beam -sur -subsidiary -##cha -armenian -sao -dropping -conventional -##fer -microsoft -reply -qualify -spots -1867 -sweat -festivals -##ken -immigration -physician -discover -exposure -sandy -explanation -isaac -implemented -##fish -hart -initiated -connect -stakes -presents -heights -householder -pleased -tourist -regardless -slip -closest -##ction -surely -sultan -brings -riley -preparation -aboard -slammed -baptist -experiment -ongoing -interstate -organic -playoffs -##ika -1877 -130 -##tar -hindu -error -tours -tier -plenty -arrangements -talks -trapped -excited -sank -ho -athens -1872 -denver -welfare -suburb -athletes -trick -diverse -belly -exclusively -yelled -1868 -##med -conversion -##ette -1874 -internationally -computers -conductor -abilities -sensitive -hello -dispute -measured -globe -rocket -prices -amsterdam -flights -tigers -inn -municipalities -emotion -references -3d -##mus -explains -airlines -manufactured -pm -archaeological -1873 -interpretation -devon -comment -##ites -settlements -kissing -absolute -improvement -suite -impressed -barcelona -sullivan -jefferson -towers -jesse -julie -##tin -##lu -grandson -hi -gauge -regard -rings -interviews -trace -raymond -thumb -departments -burns -serial -bulgarian -scores -demonstrated -##ix -1866 -kyle -alberta -underneath -romanized -##ward -relieved -acquisition -phrase -cliff -reveals -han -cuts -merger -custom -##dar -nee -gilbert -graduation -##nts -assessment -cafe -difficulty -demands -swung -democrat -jennifer -commons -1940s -grove -##yo -completing -focuses -sum -substitute -bearing -stretch -reception -##py -reflected -essentially -destination -pairs -##ched -survival -resource -##bach -promoting -doubles -messages -tear -##down -##fully -parade -florence -harvey -incumbent -partial -framework -900 -pedro -frozen -procedure -olivia -controls -##mic -shelter -personally -temperatures -##od -brisbane -tested -sits -marble -comprehensive -oxygen -leonard -##kov -inaugural -iranian -referring -quarters -attitude -##ivity -mainstream -lined -mars -dakota -norfolk -unsuccessful -##° -explosion -helicopter -congressional -##sing -inspector -bitch -seal -departed -divine -##ters -coaching -examination -punishment -manufacturer -sink -columns -unincorporated -signals -nevada -squeezed -dylan -dining -photos -martial -manuel -eighteen -elevator -brushed -plates -ministers -ivy -congregation -##len -slept -specialized -taxes -curve -restricted -negotiations -likes -statistical -arnold -inspiration -execution -bold -intermediate -significance -margin -ruler -wheels -gothic -intellectual -dependent -listened -eligible -buses -widow -syria -earn -cincinnati -collapsed -recipient -secrets -accessible -philippine -maritime -goddess -clerk -surrender -breaks -playoff -database -##ified -##lon -ideal -beetle -aspect -soap -regulation -strings -expand -anglo -shorter -crosses -retreat -tough -coins -wallace -directions -pressing -##oon -shipping -locomotives -comparison -topics -nephew -##mes -distinction -honors -travelled -sierra -ibn -##over -fortress -sa -recognised -carved -1869 -clients -##dan -intent -##mar -coaches -describing -bread -##ington -beaten -northwestern -##ona -merit -youtube -collapse -challenges -em -historians -objective -submitted -virus -attacking -drake -assume -##ere -diseases -marc -stem -leeds -##cus -##ab -farming -glasses -##lock -visits -nowhere -fellowship -relevant -carries -restaurants -experiments -101 -constantly -bases -targets -shah -tenth -opponents -verse -territorial -##ira -writings -corruption -##hs -instruction -inherited -reverse -emphasis -##vic -employee -arch -keeps -rabbi -watson -payment -uh -##ala -nancy -##tre -venice -fastest -sexy -banned -adrian -properly -ruth -touchdown -dollar -boards -metre -circles -edges -favour -comments -ok -travels -liberation -scattered -firmly -##ular -holland -permitted -diesel -kenya -den -originated -##ral -demons -resumed -dragged -rider -##rus -servant -blinked -extend -torn -##ias -##sey -input -meal -everybody -cylinder -kinds -camps -##fe -bullet -logic -##wn -croatian -evolved -healthy -fool -chocolate -wise -preserve -pradesh -##ess -respective -1850 -##ew -chicken -artificial -gross -corresponding -convicted -cage -caroline -dialogue -##dor -narrative -stranger -mario -br -christianity -failing -trent -commanding -buddhist -1848 -maurice -focusing -yale -bike -altitude -##ering -mouse -revised -##sley -veteran -##ig -pulls -theology -crashed -campaigns -legion -##ability -drag -excellence -customer -cancelled -intensity -excuse -##lar -liga -participating -contributing -printing -##burn -variable -##rk -curious -bin -legacy -renaissance -##my -symptoms -binding -vocalist -dancer -##nie -grammar -gospel -democrats -ya -enters -sc -diplomatic -hitler -##ser -clouds -mathematical -quit -defended -oriented -##heim -fundamental -hardware -impressive -equally -convince -confederate -guilt -chuck -sliding -##ware -magnetic -narrowed -petersburg -bulgaria -otto -phd -skill -##ama -reader -hopes -pitcher -reservoir -hearts -automatically -expecting -mysterious -bennett -extensively -imagined -seeds -monitor -fix -##ative -journalism -struggling -signature -ranch -encounter -photographer -observation -protests -##pin -influences -##hr -calendar -##all -cruz -croatia -locomotive -hughes -naturally -shakespeare -basement -hook -uncredited -faded -theories -approaches -dare -phillips -filling -fury -obama -##ain -efficient -arc -deliver -min -raid -breeding -inducted -leagues -efficiency -axis -montana -eagles -##ked -supplied -instructions -karen -picking -indicating -trap -anchor -practically -christians -tomb -vary -occasional -electronics -lords -readers -newcastle -faint -innovation -collect -situations -engagement -160 -claude -mixture -##feld -peer -tissue -logo -lean -##ration -°f -floors -##ven -architects -reducing -##our -##ments -rope -1859 -ottawa -##har -samples -banking -declaration -proteins -resignation -francois -saudi -advocate -exhibited -armor -twins -divorce -##ras -abraham -reviewed -jo -temporarily -matrix -physically -pulse -curled -##ena -difficulties -bengal -usage -##ban -annie -riders -certificate -##pi -holes -warsaw -distinctive -jessica -##mon -mutual -1857 -customs -circular -eugene -removal -loaded -mere -vulnerable -depicted -generations -dame -heir -enormous -lightly -climbing -pitched -lessons -pilots -nepal -ram -google -preparing -brad -louise -renowned -##₂ -liam -##ably -plaza -shaw -sophie -brilliant -bills -##bar -##nik -fucking -mainland -server -pleasant -seized -veterans -jerked -fail -beta -brush -radiation -stored -warmth -southeastern -nate -sin -raced -berkeley -joke -athlete -designation -trunk -##low -roland -qualification -archives -heels -artwork -receives -judicial -reserves -##bed -woke -installation -abu -floating -fake -lesser -excitement -interface -concentrated -addressed -characteristic -amanda -saxophone -monk -auto -##bus -releasing -egg -dies -interaction -defender -ce -outbreak -glory -loving -##bert -sequel -consciousness -http -awake -ski -enrolled -##ress -handling -rookie -brow -somebody -biography -warfare -amounts -contracts -presentation -fabric -dissolved -challenged -meter -psychological -lt -elevated -rally -accurate -##tha -hospitals -undergraduate -specialist -venezuela -exhibit -shed -nursing -protestant -fluid -structural -footage -jared -consistent -prey -##ska -succession -reflect -exile -lebanon -wiped -suspect -shanghai -resting -integration -preservation -marvel -variant -pirates -sheep -rounded -capita -sailing -colonies -manuscript -deemed -variations -clarke -functional -emerging -boxing -relaxed -curse -azerbaijan -heavyweight -nickname -editorial -rang -grid -tightened -earthquake -flashed -miguel -rushing -##ches -improvements -boxes -brooks -180 -consumption -molecular -felix -societies -repeatedly -variation -aids -civic -graphics -professionals -realm -autonomous -receiver -delayed -workshop -militia -chairs -trump -canyon -##point -harsh -extending -lovely -happiness -##jan -stake -eyebrows -embassy -wellington -hannah -##ella -sony -corners -bishops -swear -cloth -contents -xi -namely -commenced -1854 -stanford -nashville -courage -graphic -commitment -garrison -##bin -hamlet -clearing -rebels -attraction -literacy -cooking -ruins -temples -jenny -humanity -celebrate -hasn -freight -sixty -rebel -bastard -##art -newton -##ada -deer -##ges -##ching -smiles -delaware -singers -##ets -approaching -assists -flame -##ph -boulevard -barrel -planted -##ome -pursuit -##sia -consequences -posts -shallow -invitation -rode -depot -ernest -kane -rod -concepts -preston -topic -chambers -striking -blast -arrives -descendants -montgomery -ranges -worlds -##lay -##ari -span -chaos -praise -##ag -fewer -1855 -sanctuary -mud -fbi -##ions -programmes -maintaining -unity -harper -bore -handsome -closure -tournaments -thunder -nebraska -linda -facade -puts -satisfied -argentine -dale -cork -dome -panama -##yl -1858 -tasks -experts -##ates -feeding -equation -##las -##ida -##tu -engage -bryan -##ax -um -quartet -melody -disbanded -sheffield -blocked -gasped -delay -kisses -maggie -connects -##non -sts -poured -creator -publishers -##we -guided -ellis -extinct -hug -gaining -##ord -complicated -##bility -poll -clenched -investigate -##use -thereby -quantum -spine -cdp -humor -kills -administered -semifinals -##du -encountered -ignore -##bu -commentary -##maker -bother -roosevelt -140 -plains -halfway -flowing -cultures -crack -imprisoned -neighboring -airline -##ses -##view -##mate -##ec -gather -wolves -marathon -transformed -##ill -cruise -organisations -carol -punch -exhibitions -numbered -alarm -ratings -daddy -silently -##stein -queens -colours -impression -guidance -liu -tactical -##rat -marshal -della -arrow -##ings -rested -feared -tender -owns -bitter -advisor -escort -##ides -spare -farms -grants -##ene -dragons -encourage -colleagues -cameras -##und -sucked -pile -spirits -prague -statements -suspension -landmark -fence -torture -recreation -bags -permanently -survivors -pond -spy -predecessor -bombing -coup -##og -protecting -transformation -glow -##lands -##book -dug -priests -andrea -feat -barn -jumping -##chen -##ologist -##con -casualties -stern -auckland -pipe -serie -revealing -ba -##bel -trevor -mercy -spectrum -yang -consist -governing -collaborated -possessed -epic -comprises -blew -shane -##ack -lopez -honored -magical -sacrifice -judgment -perceived -hammer -mtv -baronet -tune -das -missionary -sheets -350 -neutral -oral -threatening -attractive -shade -aims -seminary -##master -estates -1856 -michel -wounds -refugees -manufacturers -##nic -mercury -syndrome -porter -##iya -##din -hamburg -identification -upstairs -purse -widened -pause -cared -breathed -affiliate -santiago -prevented -celtic -fisher -125 -recruited -byzantine -reconstruction -farther -##mp -diet -sake -au -spite -sensation -##ert -blank -separation -105 -##hon -vladimir -armies -anime -##lie -accommodate -orbit -cult -sofia -archive -##ify -##box -founders -sustained -disorder -honours -northeastern -mia -crops -violet -threats -blanket -fires -canton -followers -southwestern -prototype -voyage -assignment -altered -moderate -protocol -pistol -##eo -questioned -brass -lifting -1852 -math -authored -##ual -doug -dimensional -dynamic -##san -1851 -pronounced -grateful -quest -uncomfortable -boom -presidency -stevens -relating -politicians -chen -barrier -quinn -diana -mosque -tribal -cheese -palmer -portions -sometime -chester -treasure -wu -bend -download -millions -reforms -registration -##osa -consequently -monitoring -ate -preliminary -brandon -invented -ps -eaten -exterior -intervention -ports -documented -log -displays -lecture -sally -favourite -##itz -vermont -lo -invisible -isle -breed -##ator -journalists -relay -speaks -backward -explore -midfielder -actively -stefan -procedures -cannon -blond -kenneth -centered -servants -chains -libraries -malcolm -essex -henri -slavery -##hal -facts -fairy -coached -cassie -cats -washed -cop -##fi -announcement -item -2000s -vinyl -activated -marco -frontier -growled -curriculum -##das -loyal -accomplished -leslie -ritual -kenny -##00 -vii -napoleon -hollow -hybrid -jungle -stationed -friedrich -counted -##ulated -platinum -theatrical -seated -col -rubber -glen -1840 -diversity -healing -extends -id -provisions -administrator -columbus -##oe -tributary -te -assured -org -##uous -prestigious -examined -lectures -grammy -ronald -associations -bailey -allan -essays -flute -believing -consultant -proceedings -travelling -1853 -kit -kerala -yugoslavia -buddy -methodist -##ith -burial -centres -batman -##nda -discontinued -bo -dock -stockholm -lungs -severely -##nk -citing -manga -##ugh -steal -mumbai -iraqi -robot -celebrity -bride -broadcasts -abolished -pot -joel -overhead -franz -packed -reconnaissance -johann -acknowledged -introduce -handled -doctorate -developments -drinks -alley -palestine -##nis -##aki -proceeded -recover -bradley -grain -patch -afford -infection -nationalist -legendary -##ath -interchange -virtually -gen -gravity -exploration -amber -vital -wishes -powell -doctrine -elbow -screenplay -##bird -contribute -indonesian -pet -creates -##com -enzyme -kylie -discipline -drops -manila -hunger -##ien -layers -suffer -fever -bits -monica -keyboard -manages -##hood -searched -appeals -##bad -testament -grande -reid -##war -beliefs -congo -##ification -##dia -si -requiring -##via -casey -1849 -regret -streak -rape -depends -syrian -sprint -pound -tourists -upcoming -pub -##xi -tense -##els -practiced -echo -nationwide -guild -motorcycle -liz -##zar -chiefs -desired -elena -bye -precious -absorbed -relatives -booth -pianist -##mal -citizenship -exhausted -wilhelm -##ceae -##hed -noting -quarterback -urge -hectares -##gue -ace -holly -##tal -blonde -davies -parked -sustainable -stepping -twentieth -airfield -galaxy -nest -chip -##nell -tan -shaft -paulo -requirement -##zy -paradise -tobacco -trans -renewed -vietnamese -##cker -##ju -suggesting -catching -holmes -enjoying -md -trips -colt -holder -butterfly -nerve -reformed -cherry -bowling -trailer -carriage -goodbye -appreciate -toy -joshua -interactive -enabled -involve -##kan -collar -determination -bunch -facebook -recall -shorts -superintendent -episcopal -frustration -giovanni -nineteenth -laser -privately -array -circulation -##ovic -armstrong -deals -painful -permit -discrimination -##wi -aires -retiring -cottage -ni -##sta -horizon -ellen -jamaica -ripped -fernando -chapters -playstation -patron -lecturer -navigation -behaviour -genes -georgian -export -solomon -rivals -swift -seventeen -rodriguez -princeton -independently -sox -1847 -arguing -entity -casting -hank -criteria -oakland -geographic -milwaukee -reflection -expanding -conquest -dubbed -##tv -halt -brave -brunswick -doi -arched -curtis -divorced -predominantly -somerset -streams -ugly -zoo -horrible -curved -buenos -fierce -dictionary -vector -theological -unions -handful -stability -chan -punjab -segments -##lly -altar -ignoring -gesture -monsters -pastor -##stone -thighs -unexpected -operators -abruptly -coin -compiled -associates -improving -migration -pin -##ose -compact -collegiate -reserved -##urs -quarterfinals -roster -restore -assembled -hurry -oval -##cies -1846 -flags -martha -##del -victories -sharply -##rated -argues -deadly -neo -drawings -symbols -performer -##iel -griffin -restrictions -editing -andrews -java -journals -arabia -compositions -dee -pierce -removing -hindi -casino -runway -civilians -minds -nasa -hotels -##zation -refuge -rent -retain -potentially -conferences -suburban -conducting -##tto -##tions -##tle -descended -massacre -##cal -ammunition -terrain -fork -souls -counts -chelsea -durham -drives -cab -##bank -perth -realizing -palestinian -finn -simpson -##dal -betty -##ule -moreover -particles -cardinals -tent -evaluation -extraordinary -##oid -inscription -##works -wednesday -chloe -maintains -panels -ashley -trucks -##nation -cluster -sunlight -strikes -zhang -##wing -dialect -canon -##ap -tucked -##ws -collecting -##mas -##can -##sville -maker -quoted -evan -franco -aria -buying -cleaning -eva -closet -provision -apollo -clinic -rat -##ez -necessarily -ac -##gle -##ising -venues -flipped -cent -spreading -trustees -checking -authorized -##sco -disappointed -##ado -notion -duration -trumpet -hesitated -topped -brussels -rolls -theoretical -hint -define -aggressive -repeat -wash -peaceful -optical -width -allegedly -mcdonald -strict -copyright -##illa -investors -mar -jam -witnesses -sounding -miranda -michelle -privacy -hugo -harmony -##pp -valid -lynn -glared -nina -102 -headquartered -diving -boarding -gibson -##ncy -albanian -marsh -routine -dealt -enhanced -er -intelligent -substance -targeted -enlisted -discovers -spinning -observations -pissed -smoking -rebecca -capitol -visa -varied -costume -seemingly -indies -compensation -surgeon -thursday -arsenal -westminster -suburbs -rid -anglican -##ridge -knots -foods -alumni -lighter -fraser -whoever -portal -scandal -##ray -gavin -advised -instructor -flooding -terrorist -##ale -teenage -interim -senses -duck -teen -thesis -abby -eager -overcome -##ile -newport -glenn -rises -shame -##cc -prompted -priority -forgot -bomber -nicolas -protective -360 -cartoon -katherine -breeze -lonely -trusted -henderson -richardson -relax -banner -candy -palms -remarkable -##rio -legends -cricketer -essay -ordained -edmund -rifles -trigger -##uri -##away -sail -alert -1830 -audiences -penn -sussex -siblings -pursued -indianapolis -resist -rosa -consequence -succeed -avoided -1845 -##ulation -inland -##tie -##nna -counsel -profession -chronicle -hurried -##una -eyebrow -eventual -bleeding -innovative -cure -##dom -committees -accounting -con -scope -hardy -heather -tenor -gut -herald -codes -tore -scales -wagon -##oo -luxury -tin -prefer -fountain -triangle -bonds -darling -convoy -dried -traced -beings -troy -accidentally -slam -findings -smelled -joey -lawyers -outcome -steep -bosnia -configuration -shifting -toll -brook -performers -lobby -philosophical -construct -shrine -aggregate -boot -cox -phenomenon -savage -insane -solely -reynolds -lifestyle -##ima -nationally -holdings -consideration -enable -edgar -mo -mama -##tein -fights -relegation -chances -atomic -hub -conjunction -awkward -reactions -currency -finale -kumar -underwent -steering -elaborate -gifts -comprising -melissa -veins -reasonable -sunshine -chi -solve -trails -inhabited -elimination -ethics -huh -ana -molly -consent -apartments -layout -marines -##ces -hunters -bulk -##oma -hometown -##wall -##mont -cracked -reads -neighbouring -withdrawn -admission -wingspan -damned -anthology -lancashire -brands -batting -forgive -cuban -awful -##lyn -104 -dimensions -imagination -##ade -dante -##ship -tracking -desperately -goalkeeper -##yne -groaned -workshops -confident -burton -gerald -milton -circus -uncertain -slope -copenhagen -sophia -fog -philosopher -portraits -accent -cycling -varying -gripped -larvae -garrett -specified -scotia -mature -luther -kurt -rap -##kes -aerial -750 -ferdinand -heated -es -transported -##shan -safely -nonetheless -##orn -##gal -motors -demanding -##sburg -startled -##brook -ally -generate -caps -ghana -stained -demo -mentions -beds -ap -afterward -diary -##bling -utility -##iro -richards -1837 -conspiracy -conscious -shining -footsteps -observer -cyprus -urged -loyalty -developer -probability -olive -upgraded -gym -miracle -insects -graves -1844 -ourselves -hydrogen -amazon -katie -tickets -poets -##pm -planes -##pan -prevention -witnessed -dense -jin -randy -tang -warehouse -monroe -bang -archived -elderly -investigations -alec -granite -mineral -conflicts -controlling -aboriginal -carlo -##zu -mechanics -stan -stark -rhode -skirt -est -##berry -bombs -respected -##horn -imposed -limestone -deny -nominee -memphis -grabbing -disabled -##als -amusement -aa -frankfurt -corn -referendum -varies -slowed -disk -firms -unconscious -incredible -clue -sue -##zhou -twist -##cio -joins -idaho -chad -developers -computing -destroyer -103 -mortal -tucker -kingston -choices -yu -carson -1800 -os -whitney -geneva -pretend -dimension -staged -plateau -maya -##une -freestyle -##bc -rovers -hiv -##ids -tristan -classroom -prospect -##hus -honestly -diploma -lied -thermal -auxiliary -feast -unlikely -iata -##tel -morocco -pounding -treasury -lithuania -considerably -1841 -dish -1812 -geological -matching -stumbled -destroying -marched -brien -advances -cake -nicole -belle -settling -measuring -directing -##mie -tuesday -bassist -capabilities -stunned -fraud -torpedo -##list -##phone -anton -wisdom -surveillance -ruined -##ulate -lawsuit -healthcare -theorem -halls -trend -aka -horizontal -dozens -acquire -lasting -swim -hawk -gorgeous -fees -vicinity -decrease -adoption -tactics -##ography -pakistani -##ole -draws -##hall -willie -burke -heath -algorithm -integral -powder -elliott -brigadier -jackie -tate -varieties -darker -##cho -lately -cigarette -specimens -adds -##ree -##ensis -##inger -exploded -finalist -cia -murders -wilderness -arguments -nicknamed -acceptance -onwards -manufacture -robertson -jets -tampa -enterprises -blog -loudly -composers -nominations -1838 -ai -malta -inquiry -automobile -hosting -viii -rays -tilted -grief -museums -strategies -furious -euro -equality -cohen -poison -surrey -wireless -governed -ridiculous -moses -##esh -##room -vanished -##ito -barnes -attract -morrison -istanbul -##iness -absent -rotation -petition -janet -##logical -satisfaction -custody -deliberately -observatory -comedian -surfaces -pinyin -novelist -strictly -canterbury -oslo -monks -embrace -ibm -jealous -photograph -continent -dorothy -marina -doc -excess -holden -allegations -explaining -stack -avoiding -lance -storyline -majesty -poorly -spike -dos -bradford -raven -travis -classics -proven -voltage -pillow -fists -butt -1842 -interpreted -##car -1839 -gage -telegraph -lens -promising -expelled -casual -collector -zones -##min -silly -nintendo -##kh -##bra -downstairs -chef -suspicious -afl -flies -vacant -uganda -pregnancy -condemned -lutheran -estimates -cheap -decree -saxon -proximity -stripped -idiot -deposits -contrary -presenter -magnus -glacier -im -offense -edwin -##ori -upright -##long -bolt -##ois -toss -geographical -##izes -environments -delicate -marking -abstract -xavier -nails -windsor -plantation -occurring -equity -saskatchewan -fears -drifted -sequences -vegetation -revolt -##stic -1843 -sooner -fusion -opposing -nato -skating -1836 -secretly -ruin -lease -##oc -edit -##nne -flora -anxiety -ruby -##ological -##mia -tel -bout -taxi -emmy -frost -rainbow -compounds -foundations -rainfall -assassination -nightmare -dominican -##win -achievements -deserve -orlando -intact -armenia -##nte -calgary -valentine -106 -marion -proclaimed -theodore -bells -courtyard -thigh -gonzalez -console -troop -minimal -monte -everyday -##ence -##if -supporter -terrorism -buck -openly -presbyterian -activists -carpet -##iers -rubbing -uprising -##yi -cute -conceived -legally -##cht -millennium -cello -velocity -ji -rescued -cardiff -1835 -rex -concentrate -senators -beard -rendered -glowing -battalions -scouts -competitors -sculptor -catalogue -arctic -ion -raja -bicycle -wow -glancing -lawn -##woman -gentleman -lighthouse -publish -predicted -calculated -##val -variants -##gne -strain -##ui -winston -deceased -##nus -touchdowns -brady -caleb -sinking -echoed -crush -hon -blessed -protagonist -hayes -endangered -magnitude -editors -##tine -estimate -responsibilities -##mel -backup -laying -consumed -sealed -zurich -lovers -frustrated -##eau -ahmed -kicking -mit -treasurer -1832 -biblical -refuse -terrified -pump -agrees -genuine -imprisonment -refuses -plymouth -##hen -lou -##nen -tara -trembling -antarctic -ton -learns -##tas -crap -crucial -faction -atop -##borough -wrap -lancaster -odds -hopkins -erik -lyon -##eon -bros -##ode -snap -locality -tips -empress -crowned -cal -acclaimed -chuckled -##ory -clara -sends -mild -towel -##fl -##day -##а -wishing -assuming -interviewed -##bal -##die -interactions -eden -cups -helena -##lf -indie -beck -##fire -batteries -filipino -wizard -parted -##lam -traces -##born -rows -idol -albany -delegates -##ees -##sar -discussions -##ex -notre -instructed -belgrade -highways -suggestion -lauren -possess -orientation -alexandria -abdul -beats -salary -reunion -ludwig -alright -wagner -intimate -pockets -slovenia -hugged -brighton -merchants -cruel -stole -trek -slopes -repairs -enrollment -politically -underlying -promotional -counting -boeing -##bb -isabella -naming -##и -keen -bacteria -listing -separately -belfast -ussr -450 -lithuanian -anybody -ribs -sphere -martinez -cock -embarrassed -proposals -fragments -nationals -##fs -##wski -premises -fin -1500 -alpine -matched -freely -bounded -jace -sleeve -##af -gaming -pier -populated -evident -##like -frances -flooded -##dle -frightened -pour -trainer -framed -visitor -challenging -pig -wickets -##fold -infected -email -##pes -arose -##aw -reward -ecuador -oblast -vale -ch -shuttle -##usa -bach -rankings -forbidden -cornwall -accordance -salem -consumers -bruno -fantastic -toes -machinery -resolved -julius -remembering -propaganda -iceland -bombardment -tide -contacts -wives -##rah -concerto -macdonald -albania -implement -daisy -tapped -sudan -helmet -angela -mistress -##lic -crop -sunk -finest -##craft -hostile -##ute -##tsu -boxer -fr -paths -adjusted -habit -ballot -supervision -soprano -##zen -bullets -wicked -sunset -regiments -disappear -lamp -performs -app -##gia -##oa -rabbit -digging -incidents -entries -##cion -dishes -##oi -introducing -##ati -##fied -freshman -slot -jill -tackles -baroque -backs -##iest -lone -sponsor -destiny -altogether -convert -##aro -consensus -shapes -demonstration -basically -feminist -auction -artifacts -##bing -strongest -twitter -halifax -2019 -allmusic -mighty -smallest -precise -alexandra -viola -##los -##ille -manuscripts -##illo -dancers -ari -managers -monuments -blades -barracks -springfield -maiden -consolidated -electron -##end -berry -airing -wheat -nobel -inclusion -blair -payments -geography -bee -cc -eleanor -react -##hurst -afc -manitoba -##yu -su -lineup -fitness -recreational -investments -airborne -disappointment -##dis -edmonton -viewing -##row -renovation -##cast -infant -bankruptcy -roses -aftermath -pavilion -##yer -carpenter -withdrawal -ladder -##hy -discussing -popped -reliable -agreements -rochester -##abad -curves -bombers -220 -rao -reverend -decreased -choosing -107 -stiff -consulting -naples -crawford -tracy -ka -ribbon -cops -##lee -crushed -deciding -unified -teenager -accepting -flagship -explorer -poles -sanchez -inspection -revived -skilled -induced -exchanged -flee -locals -tragedy -swallow -loading -hanna -demonstrate -##ela -salvador -flown -contestants -civilization -##ines -wanna -rhodes -fletcher -hector -knocking -considers -##ough -nash -mechanisms -sensed -mentally -walt -unclear -##eus -renovated -madame -##cks -crews -governmental -##hin -undertaken -monkey -##ben -##ato -fatal -armored -copa -caves -governance -grasp -perception -certification -froze -damp -tugged -wyoming -##rg -##ero -newman -##lor -nerves -curiosity -graph -115 -##ami -withdraw -tunnels -dull -meredith -moss -exhibits -neighbors -communicate -accuracy -explored -raiders -republicans -secular -kat -superman -penny -criticised -##tch -freed -update -conviction -wade -ham -likewise -delegation -gotta -doll -promises -technological -myth -nationality -resolve -convent -##mark -sharon -dig -sip -coordinator -entrepreneur -fold -##dine -capability -councillor -synonym -blown -swan -cursed -1815 -jonas -haired -sofa -canvas -keeper -rivalry -##hart -rapper -speedway -swords -postal -maxwell -estonia -potter -recurring -##nn -##ave -errors -##oni -cognitive -1834 -##² -claws -nadu -roberto -bce -wrestler -ellie -##ations -infinite -ink -##tia -presumably -finite -staircase -108 -noel -patricia -nacional -##cation -chill -eternal -tu -preventing -prussia -fossil -limbs -##logist -ernst -frog -perez -rene -##ace -pizza -prussian -##ios -##vy -molecules -regulatory -answering -opinions -sworn -lengths -supposedly -hypothesis -upward -habitats -seating -ancestors -drank -yield -hd -synthesis -researcher -modest -##var -mothers -peered -voluntary -homeland -##the -acclaim -##igan -static -valve -luxembourg -alto -carroll -fe -receptor -norton -ambulance -##tian -johnston -catholics -depicting -jointly -elephant -gloria -mentor -badge -ahmad -distinguish -remarked -councils -precisely -allison -advancing -detection -crowded -##10 -cooperative -ankle -mercedes -dagger -surrendered -pollution -commit -subway -jeffrey -lesson -sculptures -provider -##fication -membrane -timothy -rectangular -fiscal -heating -teammate -basket -particle -anonymous -deployment -##ple -missiles -courthouse -proportion -shoe -sec -##ller -complaints -forbes -blacks -abandon -remind -sizes -overwhelming -autobiography -natalie -##awa -risks -contestant -countryside -babies -scorer -invaded -enclosed -proceed -hurling -disorders -##cu -reflecting -continuously -cruiser -graduates -freeway -investigated -ore -deserved -maid -blocking -phillip -jorge -shakes -dove -mann -variables -lacked -burden -accompanying -que -consistently -organizing -provisional -complained -endless -##rm -tubes -juice -georges -krishna -mick -labels -thriller -##uch -laps -arcade -sage -snail -##table -shannon -fi -laurence -seoul -vacation -presenting -hire -churchill -surprisingly -prohibited -savannah -technically -##oli -170 -##lessly -testimony -suited -speeds -toys -romans -mlb -flowering -measurement -talented -kay -settings -charleston -expectations -shattered -achieving -triumph -ceremonies -portsmouth -lanes -mandatory -loser -stretching -cologne -realizes -seventy -cornell -careers -webb -##ulating -americas -budapest -ava -suspicion -##ison -yo -conrad -##hai -sterling -jessie -rector -##az -1831 -transform -organize -loans -christine -volcanic -warrant -slender -summers -subfamily -newer -danced -dynamics -rhine -proceeds -heinrich -gastropod -commands -sings -facilitate -easter -ra -positioned -responses -expense -fruits -yanked -imported -25th -velvet -vic -primitive -tribune -baldwin -neighbourhood -donna -rip -hay -pr -##uro -1814 -espn -welcomed -##aria -qualifier -glare -highland -timing -##cted -shells -eased -geometry -louder -exciting -slovakia -##sion -##iz -##lot -savings -prairie -##ques -marching -rafael -tonnes -##lled -curtain -preceding -shy -heal -greene -worthy -##pot -detachment -bury -sherman -##eck -reinforced -seeks -bottles -contracted -duchess -outfit -walsh -##sc -mickey -##ase -geoffrey -archer -squeeze -dawson -eliminate -invention -##enberg -neal -##eth -stance -dealer -coral -maple -retire -polo -simplified -##ht -1833 -hid -watts -backwards -jules -##oke -genesis -mt -frames -rebounds -burma -woodland -moist -santos -whispers -drained -subspecies -##aa -streaming -ulster -burnt -correspondence -maternal -gerard -denis -stealing -##load -genius -duchy -##oria -inaugurated -momentum -suits -placement -sovereign -clause -thames -##hara -confederation -reservation -sketch -yankees -lets -rotten -charm -hal -verses -ultra -commercially -dot -salon -citation -adopt -winnipeg -mist -allocated -cairo -##boy -jenkins -interference -objectives -##wind -1820 -portfolio -armoured -sectors -##eh -initiatives -##world -integrity -exercises -robe -tap -ab -gazed -##tones -distracted -rulers -111 -favorable -jerome -tended -cart -factories -##eri -diplomat -valued -gravel -charitable -##try -calvin -exploring -chang -shepherd -terrace -pdf -pupil -##ural -reflects -ups -##rch -governors -shelf -depths -##nberg -trailed -crest -tackle -##nian -##ats -hatred -##kai -clare -makers -ethiopia -longtime -detected -embedded -lacking -slapped -rely -thomson -anticipation -iso -morton -successive -agnes -screenwriter -straightened -philippe -playwright -haunted -licence -iris -intentions -sutton -112 -logical -correctly -##weight -branded -licked -tipped -silva -ricky -narrator -requests -##ents -greeted -supernatural -cow -##wald -lung -refusing -employer -strait -gaelic -liner -##piece -zoe -sabha -##mba -driveway -harvest -prints -bates -reluctantly -threshold -algebra -ira -wherever -coupled -240 -assumption -picks -##air -designers -raids -gentlemen -##ean -roller -blowing -leipzig -locks -screw -dressing -strand -##lings -scar -dwarf -depicts -##nu -nods -##mine -differ -boris -##eur -yuan -flip -##gie -mob -invested -questioning -applying -##ture -shout -##sel -gameplay -blamed -illustrations -bothered -weakness -rehabilitation -##of -##zes -envelope -rumors -miners -leicester -subtle -kerry -##ico -ferguson -##fu -premiership -ne -##cat -bengali -prof -catches -remnants -dana -##rily -shouting -presidents -baltic -ought -ghosts -dances -sailors -shirley -fancy -dominic -##bie -madonna -##rick -bark -buttons -gymnasium -ashes -liver -toby -oath -providence -doyle -evangelical -nixon -cement -carnegie -embarked -hatch -surroundings -guarantee -needing -pirate -essence -##bee -filter -crane -hammond -projected -immune -percy -twelfth -##ult -regent -doctoral -damon -mikhail -##ichi -lu -critically -elect -realised -abortion -acute -screening -mythology -steadily -##fc -frown -nottingham -kirk -wa -minneapolis -##rra -module -algeria -mc -nautical -encounters -surprising -statues -availability -shirts -pie -alma -brows -munster -mack -soup -crater -tornado -sanskrit -cedar -explosive -bordered -dixon -planets -stamp -exam -happily -##bble -carriers -kidnapped -##vis -accommodation -emigrated -##met -knockout -correspondent -violation -profits -peaks -lang -specimen -agenda -ancestry -pottery -spelling -equations -obtaining -ki -linking -1825 -debris -asylum -##20 -buddhism -teddy -##ants -gazette -##nger -##sse -dental -eligibility -utc -fathers -averaged -zimbabwe -francesco -coloured -hissed -translator -lynch -mandate -humanities -mackenzie -uniforms -lin -##iana -##gio -asset -mhz -fitting -samantha -genera -wei -rim -beloved -shark -riot -entities -expressions -indo -carmen -slipping -owing -abbot -neighbor -sidney -##av -rats -recommendations -encouraging -squadrons -anticipated -commanders -conquered -##oto -donations -diagnosed -##mond -divide -##iva -guessed -decoration -vernon -auditorium -revelation -conversations -##kers -##power -herzegovina -dash -alike -protested -lateral -herman -accredited -mg -##gent -freeman -mel -fiji -crow -crimson -##rine -livestock -##pped -humanitarian -bored -oz -whip -##lene -##ali -legitimate -alter -grinning -spelled -anxious -oriental -wesley -##nin -##hole -carnival -controller -detect -##ssa -bowed -educator -kosovo -macedonia -##sin -occupy -mastering -stephanie -janeiro -para -unaware -nurses -noon -135 -cam -hopefully -ranger -combine -sociology -polar -rica -##eer -neill -##sman -holocaust -##ip -doubled -lust -1828 -109 -decent -cooling -unveiled -##card -1829 -nsw -homer -chapman -meyer -##gin -dive -mae -reagan -expertise -##gled -darwin -brooke -sided -prosecution -investigating -comprised -petroleum -genres -reluctant -differently -trilogy -johns -vegetables -corpse -highlighted -lounge -pension -unsuccessfully -elegant -aided -ivory -beatles -amelia -cain -dubai -sunny -immigrant -babe -click -##nder -underwater -pepper -combining -mumbled -atlas -horns -accessed -ballad -physicians -homeless -gestured -rpm -freak -louisville -corporations -patriots -prizes -rational -warn -modes -decorative -overnight -din -troubled -phantom -##ort -monarch -sheer -##dorf -generals -guidelines -organs -addresses -##zon -enhance -curling -parishes -cord -##kie -linux -caesar -deutsche -bavaria -##bia -coleman -cyclone -##eria -bacon -petty -##yama -##old -hampton -diagnosis -1824 -throws -complexity -rita -disputed -##₃ -pablo -##sch -marketed -trafficking -##ulus -examine -plague -formats -##oh -vault -faithful -##bourne -webster -##ox -highlights -##ient -##ann -phones -vacuum -sandwich -modeling -##gated -bolivia -clergy -qualities -isabel -##nas -##ars -wears -screams -reunited -annoyed -bra -##ancy -##rate -differential -transmitter -tattoo -container -poker -##och -excessive -resides -cowboys -##tum -augustus -trash -providers -statute -retreated -balcony -reversed -void -storey -preceded -masses -leap -laughs -neighborhoods -wards -schemes -falcon -santo -battlefield -pad -ronnie -thread -lesbian -venus -##dian -beg -sandstone -daylight -punched -gwen -analog -stroked -wwe -acceptable -measurements -dec -toxic -##kel -adequate -surgical -economist -parameters -varsity -##sberg -quantity -ella -##chy -##rton -countess -generating -precision -diamonds -expressway -ga -##ı -1821 -uruguay -talents -galleries -expenses -scanned -colleague -outlets -ryder -lucien -##ila -paramount -##bon -syracuse -dim -fangs -gown -sweep -##sie -toyota -missionaries -websites -##nsis -sentences -adviser -val -trademark -spells -##plane -patience -starter -slim -##borg -toe -incredibly -shoots -elliot -nobility -##wyn -cowboy -endorsed -gardner -tendency -persuaded -organisms -emissions -kazakhstan -amused -boring -chips -themed -##hand -llc -constantinople -chasing -systematic -guatemala -borrowed -erin -carey -##hard -highlands -struggles -1810 -##ifying -##ced -wong -exceptions -develops -enlarged -kindergarten -castro -##ern -##rina -leigh -zombie -juvenile -##most -consul -##nar -sailor -hyde -clarence -intensive -pinned -nasty -useless -jung -clayton -stuffed -exceptional -ix -apostolic -230 -transactions -##dge -exempt -swinging -cove -religions -##ash -shields -dairy -bypass -190 -pursuing -bug -joyce -bombay -chassis -southampton -chat -interact -redesignated -##pen -nascar -pray -salmon -rigid -regained -malaysian -grim -publicity -constituted -capturing -toilet -delegate -purely -tray -drift -loosely -striker -weakened -trinidad -mitch -itv -defines -transmitted -ming -scarlet -nodding -fitzgerald -fu -narrowly -sp -tooth -standings -virtue -##₁ -##wara -##cting -chateau -gloves -lid -##nel -hurting -conservatory -##pel -sinclair -reopened -sympathy -nigerian -strode -advocated -optional -chronic -discharge -##rc -suck -compatible -laurel -stella -shi -fails -wage -dodge -128 -informal -sorts -levi -buddha -villagers -##aka -chronicles -heavier -summoned -gateway -3000 -eleventh -jewelry -translations -accordingly -seas -##ency -fiber -pyramid -cubic -dragging -##ista -caring -##ops -android -contacted -lunar -##dt -kai -lisbon -patted -1826 -sacramento -theft -madagascar -subtropical -disputes -ta -holidays -piper -willow -mare -cane -itunes -newfoundland -benny -companions -dong -raj -observe -roar -charming -plaque -tibetan -fossils -enacted -manning -bubble -tina -tanzania -##eda -##hir -funk -swamp -deputies -cloak -ufc -scenario -par -scratch -metals -anthem -guru -engaging -specially -##boat -dialects -nineteen -cecil -duet -disability -messenger -unofficial -##lies -defunct -eds -moonlight -drainage -surname -puzzle -honda -switching -conservatives -mammals -knox -broadcaster -sidewalk -cope -##ried -benson -princes -peterson -##sal -bedford -sharks -eli -wreck -alberto -gasp -archaeology -lgbt -teaches -securities -madness -compromise -waving -coordination -davidson -visions -leased -possibilities -eighty -jun -fernandez -enthusiasm -assassin -sponsorship -reviewer -kingdoms -estonian -laboratories -##fy -##nal -applies -verb -celebrations -##zzo -rowing -lightweight -sadness -submit -mvp -balanced -dude -##vas -explicitly -metric -magnificent -mound -brett -mohammad -mistakes -irregular -##hing -##ass -sanders -betrayed -shipped -surge -##enburg -reporters -termed -georg -pity -verbal -bulls -abbreviated -enabling -appealed -##are -##atic -sicily -sting -heel -sweetheart -bart -spacecraft -brutal -monarchy -##tter -aberdeen -cameo -diane -##ub -survivor -clyde -##aries -complaint -##makers -clarinet -delicious -chilean -karnataka -coordinates -1818 -panties -##rst -pretending -ar -dramatically -kiev -bella -tends -distances -113 -catalog -launching -instances -telecommunications -portable -lindsay -vatican -##eim -angles -aliens -marker -stint -screens -bolton -##rne -judy -wool -benedict -plasma -europa -spark -imaging -filmmaker -swiftly -##een -contributor -##nor -opted -stamps -apologize -financing -butter -gideon -sophisticated -alignment -avery -chemicals -yearly -speculation -prominence -professionally -##ils -immortal -institutional -inception -wrists -identifying -tribunal -derives -gains -##wo -papal -preference -linguistic -vince -operative -brewery -##ont -unemployment -boyd -##ured -##outs -albeit -prophet -1813 -bi -##rr -##face -##rad -quarterly -asteroid -cleaned -radius -temper -##llen -telugu -jerk -viscount -menu -##ote -glimpse -##aya -yacht -hawaiian -baden -##rl -laptop -readily -##gu -monetary -offshore -scots -watches -##yang -##arian -upgrade -needle -xbox -lea -encyclopedia -flank -fingertips -##pus -delight -teachings -confirm -roth -beaches -midway -winters -##iah -teasing -daytime -beverly -gambling -bonnie -##backs -regulated -clement -hermann -tricks -knot -##shing -##uring -##vre -detached -ecological -owed -specialty -byron -inventor -bats -stays -screened -unesco -midland -trim -affection -##ander -##rry -jess -thoroughly -feedback -##uma -chennai -strained -heartbeat -wrapping -overtime -pleaded -##sworth -mon -leisure -oclc -##tate -##ele -feathers -angelo -thirds -nuts -surveys -clever -gill -commentator -##dos -darren -rides -gibraltar -##nc -##mu -dissolution -dedication -shin -meals -saddle -elvis -reds -chaired -taller -appreciation -functioning -niece -favored -advocacy -robbie -criminals -suffolk -yugoslav -passport -constable -congressman -hastings -vera -##rov -consecrated -sparks -ecclesiastical -confined -##ovich -muller -floyd -nora -1822 -paved -1827 -cumberland -ned -saga -spiral -##flow -appreciated -yi -collaborative -treating -similarities -feminine -finishes -##ib -jade -import -##nse -##hot -champagne -mice -securing -celebrities -helsinki -attributes -##gos -cousins -phases -ache -lucia -gandhi -submission -vicar -spear -shine -tasmania -biting -detention -constitute -tighter -seasonal -##gus -terrestrial -matthews -##oka -effectiveness -parody -philharmonic -##onic -1816 -strangers -encoded -consortium -guaranteed -regards -shifts -tortured -collision -supervisor -inform -broader -insight -theaters -armour -emeritus -blink -incorporates -mapping -##50 -##ein -handball -flexible -##nta -substantially -generous -thief -##own -carr -loses -1793 -prose -ucla -romeo -generic -metallic -realization -damages -mk -commissioners -zach -default -##ther -helicopters -lengthy -stems -spa -partnered -spectators -rogue -indication -penalties -teresa -1801 -sen -##tric -dalton -##wich -irving -photographic -##vey -dell -deaf -peters -excluded -unsure -##vable -patterson -crawled -##zio -resided -whipped -latvia -slower -ecole -pipes -employers -maharashtra -comparable -va -textile -pageant -##gel -alphabet -binary -irrigation -chartered -choked -antoine -offs -waking -supplement -##wen -quantities -demolition -regain -locate -urdu -folks -alt -114 -##mc -scary -andreas -whites -##ava -classrooms -mw -aesthetic -publishes -valleys -guides -cubs -johannes -bryant -conventions -affecting -##itt -drain -awesome -isolation -prosecutor -ambitious -apology -captive -downs -atmospheric -lorenzo -aisle -beef -foul -##onia -kidding -composite -disturbed -illusion -natives -##ffer -emi -rockets -riverside -wartime -painters -adolf -melted -##ail -uncertainty -simulation -hawks -progressed -meantime -builder -spray -breach -unhappy -regina -russians -##urg -determining -##tation -tram -1806 -##quin -aging -##12 -1823 -garion -rented -mister -diaz -terminated -clip -1817 -depend -nervously -disco -owe -defenders -shiva -notorious -disbelief -shiny -worcester -##gation -##yr -trailing -undertook -islander -belarus -limitations -watershed -fuller -overlooking -utilized -raphael -1819 -synthetic -breakdown -klein -##nate -moaned -memoir -lamb -practicing -##erly -cellular -arrows -exotic -##graphy -witches -117 -charted -rey -hut -hierarchy -subdivision -freshwater -giuseppe -aloud -reyes -qatar -marty -sideways -utterly -sexually -jude -prayers -mccarthy -softball -blend -damien -##gging -##metric -wholly -erupted -lebanese -negro -revenues -tasted -comparative -teamed -transaction -labeled -maori -sovereignty -parkway -trauma -gran -malay -121 -advancement -descendant -2020 -buzz -salvation -inventory -symbolic -##making -antarctica -mps -##gas -##bro -mohammed -myanmar -holt -submarines -tones -##lman -locker -patriarch -bangkok -emerson -remarks -predators -kin -afghan -confession -norwich -rental -emerge -advantages -##zel -rca -##hold -shortened -storms -aidan -##matic -autonomy -compliance -##quet -dudley -atp -##osis -1803 -motto -documentation -summary -professors -spectacular -christina -archdiocese -flashing -innocence -remake -##dell -psychic -reef -scare -employ -rs -sticks -meg -gus -leans -##ude -accompany -bergen -tomas -##iko -doom -wages -pools -##nch -##bes -breasts -scholarly -alison -outline -brittany -breakthrough -willis -realistic -##cut -##boro -competitor -##stan -pike -picnic -icon -designing -commercials -washing -villain -skiing -micro -costumes -auburn -halted -executives -##hat -logistics -cycles -vowel -applicable -barrett -exclaimed -eurovision -eternity -ramon -##umi -##lls -modifications -sweeping -disgust -##uck -torch -aviv -ensuring -rude -dusty -sonic -donovan -outskirts -cu -pathway -##band -##gun -##lines -disciplines -acids -cadet -paired -##40 -sketches -##sive -marriages -##⁺ -folding -peers -slovak -implies -admired -##beck -1880s -leopold -instinct -attained -weston -megan -horace -##ination -dorsal -ingredients -evolutionary -##its -complications -deity -lethal -brushing -levy -deserted -institutes -posthumously -delivering -telescope -coronation -motivated -rapids -luc -flicked -pays -volcano -tanner -weighed -##nica -crowds -frankie -gifted -addressing -granddaughter -winding -##rna -constantine -gomez -##front -landscapes -rudolf -anthropology -slate -werewolf -##lio -astronomy -circa -rouge -dreaming -sack -knelt -drowned -naomi -prolific -tracked -freezing -herb -##dium -agony -randall -twisting -wendy -deposit -touches -vein -wheeler -##bbled -##bor -batted -retaining -tire -presently -compare -specification -daemon -nigel -##grave -merry -recommendation -czechoslovakia -sandra -ng -roma -##sts -lambert -inheritance -sheikh -winchester -cries -examining -##yle -comeback -cuisine -nave -##iv -ko -retrieve -tomatoes -barker -polished -defining -irene -lantern -personalities -begging -tract -swore -1809 -175 -##gic -omaha -brotherhood -##rley -haiti -##ots -exeter -##ete -##zia -steele -dumb -pearson -210 -surveyed -elisabeth -trends -##ef -fritz -##rf -premium -bugs -fraction -calmly -viking -##birds -tug -inserted -unusually -##ield -confronted -distress -crashing -brent -turks -resign -##olo -cambodia -gabe -sauce -##kal -evelyn -116 -extant -clusters -quarry -teenagers -luna -##lers -##ister -affiliation -drill -##ashi -panthers -scenic -libya -anita -strengthen -inscriptions -##cated -lace -sued -judith -riots -##uted -mint -##eta -preparations -midst -dub -challenger -##vich -mock -cf -displaced -wicket -breaths -enables -schmidt -analyst -##lum -ag -highlight -automotive -axe -josef -newark -sufficiently -resembles -50th -##pal -flushed -mum -traits -##ante -commodore -incomplete -warming -titular -ceremonial -ethical -118 -celebrating -eighteenth -cao -lima -medalist -mobility -strips -snakes -##city -miniature -zagreb -barton -escapes -umbrella -automated -doubted -differs -cooled -georgetown -dresden -cooked -fade -wyatt -rna -jacobs -carlton -abundant -stereo -boost -madras -inning -##hia -spur -ip -malayalam -begged -osaka -groan -escaping -charging -dose -vista -##aj -bud -papa -communists -advocates -edged -tri -##cent -resemble -peaking -necklace -fried -montenegro -saxony -goose -glances -stuttgart -curator -recruit -grocery -sympathetic -##tting -##fort -127 -lotus -randolph -ancestor -##rand -succeeding -jupiter -1798 -macedonian -##heads -hiking -1808 -handing -fischer -##itive -garbage -node -##pies -prone -singular -papua -inclined -attractions -italia -pouring -motioned -grandma -garnered -jacksonville -corp -ego -ringing -aluminum -##hausen -ordering -##foot -drawer -traders -synagogue -##play -##kawa -resistant -wandering -fragile -fiona -teased -var -hardcore -soaked -jubilee -decisive -exposition -mercer -poster -valencia -hale -kuwait -1811 -##ises -##wr -##eed -tavern -gamma -122 -johan -##uer -airways -amino -gil -##ury -vocational -domains -torres -##sp -generator -folklore -outcomes -##keeper -canberra -shooter -fl -beams -confrontation -##lling -##gram -feb -aligned -forestry -pipeline -jax -motorway -conception -decay -##tos -coffin -##cott -stalin -1805 -escorted -minded -##nam -sitcom -purchasing -twilight -veronica -additions -passive -tensions -straw -123 -frequencies -1804 -refugee -cultivation -##iate -christie -clary -bulletin -crept -disposal -##rich -##zong -processor -crescent -##rol -bmw -emphasized -whale -nazis -aurora -##eng -dwelling -hauled -sponsors -toledo -mega -ideology -theatres -tessa -cerambycidae -saves -turtle -cone -suspects -kara -rusty -yelling -greeks -mozart -shades -cocked -participant -##tro -shire -spit -freeze -necessity -##cos -inmates -nielsen -councillors -loaned -uncommon -omar -peasants -botanical -offspring -daniels -formations -jokes -1794 -pioneers -sigma -licensing -##sus -wheelchair -polite -1807 -liquor -pratt -trustee -##uta -forewings -balloon -##zz -kilometre -camping -explicit -casually -shawn -foolish -teammates -nm -hassan -carrie -judged -satisfy -vanessa -knives -selective -cnn -flowed -##lice -eclipse -stressed -eliza -mathematician -cease -cultivated -##roy -commissions -browns -##ania -destroyers -sheridan -meadow -##rius -minerals -##cial -downstream -clash -gram -memoirs -ventures -baha -seymour -archie -midlands -edith -fare -flynn -invite -canceled -tiles -stabbed -boulder -incorporate -amended -camden -facial -mollusk -unreleased -descriptions -yoga -grabs -550 -raises -ramp -shiver -##rose -coined -pioneering -tunes -qing -warwick -tops -119 -melanie -giles -##rous -wandered -##inal -annexed -nov -30th -unnamed -##ished -organizational -airplane -normandy -stoke -whistle -blessing -violations -chased -holders -shotgun -##ctic -outlet -reactor -##vik -tires -tearing -shores -fortified -mascot -constituencies -nc -columnist -productive -tibet -##rta -lineage -hooked -oct -tapes -judging -cody -##gger -hansen -kashmir -triggered -##eva -solved -cliffs -##tree -resisted -anatomy -protesters -transparent -implied -##iga -injection -mattress -excluding -##mbo -defenses -helpless -devotion -##elli -growl -liberals -weber -phenomena -atoms -plug -##iff -mortality -apprentice -howe -convincing -aaa -swimmer -barber -leone -promptly -sodium -def -nowadays -arise -##oning -gloucester -corrected -dignity -norm -erie -##ders -elders -evacuated -sylvia -compression -##yar -hartford -pose -backpack -reasoning -accepts -24th -wipe -millimetres -marcel -##oda -dodgers -albion -1790 -overwhelmed -aerospace -oaks -1795 -showcase -acknowledge -recovering -nolan -ashe -hurts -geology -fashioned -disappearance -farewell -swollen -shrug -marquis -wimbledon -124 -rue -1792 -commemorate -reduces -experiencing -inevitable -calcutta -intel -##court -murderer -sticking -fisheries -imagery -bloom -280 -brake -##inus -gustav -hesitation -memorable -po -viral -beans -accidents -tunisia -antenna -spilled -consort -treatments -aye -perimeter -##gard -donation -hostage -migrated -banker -addiction -apex -lil -trout -##ously -conscience -##nova -rams -sands -genome -passionate -troubles -##lets -##set -amid -##ibility -##ret -higgins -exceed -vikings -##vie -payne -##zan -muscular -##ste -defendant -sucking -##wal -ibrahim -fuselage -claudia -vfl -europeans -snails -interval -##garh -preparatory -statewide -tasked -lacrosse -viktor -##lation -angola -##hra -flint -implications -employs -teens -patrons -stall -weekends -barriers -scrambled -nucleus -tehran -jenna -parsons -lifelong -robots -displacement -5000 -##bles -precipitation -##gt -knuckles -clutched -1802 -marrying -ecology -marx -accusations -declare -scars -kolkata -mat -meadows -bermuda -skeleton -finalists -vintage -crawl -coordinate -affects -subjected -orchestral -mistaken -##tc -mirrors -dipped -relied -260 -arches -candle -##nick -incorporating -wildly -fond -basilica -owl -fringe -rituals -whispering -stirred -feud -tertiary -slick -goat -honorable -whereby -skip -ricardo -stripes -parachute -adjoining -submerged -synthesizer -##gren -intend -positively -ninety -phi -beaver -partition -fellows -alexis -prohibition -carlisle -bizarre -fraternity -##bre -doubts -icy -cbc -aquatic -sneak -sonny -combines -airports -crude -supervised -spatial -merge -alfonso -##bic -corrupt -scan -undergo -##ams -disabilities -colombian -comparing -dolphins -perkins -##lish -reprinted -unanimous -bounced -hairs -underworld -midwest -semester -bucket -paperback -miniseries -coventry -demise -##leigh -demonstrations -sensor -rotating -yan -##hler -arrange -soils -##idge -hyderabad -labs -##dr -brakes -grandchildren -##nde -negotiated -rover -ferrari -continuation -directorate -augusta -stevenson -counterpart -gore -##rda -nursery -rican -ave -collectively -broadly -pastoral -repertoire -asserted -discovering -nordic -styled -fiba -cunningham -harley -middlesex -survives -tumor -tempo -zack -aiming -lok -urgent -##rade -##nto -devils -##ement -contractor -turin -##wl -##ool -bliss -repaired -simmons -moan -astronomical -cr -negotiate -lyric -1890s -lara -bred -clad -angus -pbs -##ience -engineered -posed -##lk -hernandez -possessions -elbows -psychiatric -strokes -confluence -electorate -lifts -campuses -lava -alps -##ep -##ution -##date -physicist -woody -##page -##ographic -##itis -juliet -reformation -sparhawk -320 -complement -suppressed -jewel -##½ -floated -##kas -continuity -sadly -##ische -inability -melting -scanning -paula -flour -judaism -safer -vague -##lm -solving -curb -##stown -financially -gable -bees -expired -miserable -cassidy -dominion -1789 -cupped -145 -robbery -facto -amos -warden -resume -tallest -marvin -ing -pounded -usd -declaring -gasoline -##aux -darkened -270 -650 -sophomore -##mere -erection -gossip -televised -risen -dial -##eu -pillars -##link -passages -profound -##tina -arabian -ashton -silicon -nail -##ead -##lated -##wer -##hardt -fleming -firearms -ducked -circuits -blows -waterloo -titans -##lina -atom -fireplace -cheshire -financed -activation -algorithms -##zzi -constituent -catcher -cherokee -partnerships -sexuality -platoon -tragic -vivian -guarded -whiskey -meditation -poetic -##late -##nga -##ake -porto -listeners -dominance -kendra -mona -chandler -factions -22nd -salisbury -attitudes -derivative -##ido -##haus -intake -paced -javier -illustrator -barrels -bias -cockpit -burnett -dreamed -ensuing -##anda -receptors -someday -hawkins -mattered -##lal -slavic -1799 -jesuit -cameroon -wasted -tai -wax -lowering -victorious -freaking -outright -hancock -librarian -sensing -bald -calcium -myers -tablet -announcing -barack -shipyard -pharmaceutical -##uan -greenwich -flush -medley -patches -wolfgang -pt -speeches -acquiring -exams -nikolai -##gg -hayden -kannada -##type -reilly -##pt -waitress -abdomen -devastated -capped -pseudonym -pharmacy -fulfill -paraguay -1796 -clicked -##trom -archipelago -syndicated -##hman -lumber -orgasm -rejection -clifford -lorraine -advent -mafia -rodney -brock -##ght -##used -##elia -cassette -chamberlain -despair -mongolia -sensors -developmental -upstream -##eg -##alis -spanning -165 -trombone -basque -seeded -interred -renewable -rhys -leapt -revision -molecule -##ages -chord -vicious -nord -shivered -23rd -arlington -debts -corpus -sunrise -bays -blackburn -centimetres -##uded -shuddered -gm -strangely -gripping -cartoons -isabelle -orbital -##ppa -seals -proving -##lton -refusal -strengthened -bust -assisting -baghdad -batsman -portrayal -mara -pushes -spears -og -##cock -reside -nathaniel -brennan -1776 -confirmation -caucus -##worthy -markings -yemen -nobles -ku -lazy -viewer -catalan -encompasses -sawyer -##fall -sparked -substances -patents -braves -arranger -evacuation -sergio -persuade -dover -tolerance -penguin -cum -jockey -insufficient -townships -occupying -declining -plural -processed -projection -puppet -flanders -introduces -liability -##yon -gymnastics -antwerp -taipei -hobart -candles -jeep -wes -observers -126 -chaplain -bundle -glorious -##hine -hazel -flung -sol -excavations -dumped -stares -sh -bangalore -triangular -icelandic -intervals -expressing -turbine -##vers -songwriting -crafts -##igo -jasmine -ditch -rite -##ways -entertaining -comply -sorrow -wrestlers -basel -emirates -marian -rivera -helpful -##some -caution -downward -networking -##atory -##tered -darted -genocide -emergence -replies -specializing -spokesman -convenient -unlocked -fading -augustine -concentrations -resemblance -elijah -investigator -andhra -##uda -promotes -bean -##rrell -fleeing -wan -simone -announcer -##ame -##bby -lydia -weaver -132 -residency -modification -##fest -stretches -##ast -alternatively -nat -lowe -lacks -##ented -pam -tile -concealed -inferior -abdullah -residences -tissues -vengeance -##ided -moisture -peculiar -groove -zip -bologna -jennings -ninja -oversaw -zombies -pumping -batch -livingston -emerald -installations -1797 -peel -nitrogen -rama -##fying -##star -schooling -strands -responding -werner -##ost -lime -casa -accurately -targeting -##rod -underway -##uru -hemisphere -lester -##yard -occupies -2d -griffith -angrily -reorganized -##owing -courtney -deposited -##dd -##30 -estadio -##ifies -dunn -exiled -##ying -checks -##combe -##о -##fly -successes -unexpectedly -blu -assessed -##flower -##ه -observing -sacked -spiders -kn -##tail -mu -nodes -prosperity -audrey -divisional -155 -broncos -tangled -adjust -feeds -erosion -paolo -surf -directory -snatched -humid -admiralty -screwed -gt -reddish -##nese -modules -trench -lamps -bind -leah -bucks -competes -##nz -##form -transcription -##uc -isles -violently -clutching -pga -cyclist -inflation -flats -ragged -unnecessary -##hian -stubborn -coordinated -harriet -baba -disqualified -330 -insect -wolfe -##fies -reinforcements -rocked -duel -winked -embraced -bricks -##raj -hiatus -defeats -pending -brightly -jealousy -##xton -##hm -##uki -lena -gdp -colorful -##dley -stein -kidney -##shu -underwear -wanderers -##haw -##icus -guardians -m³ -roared -habits -##wise -permits -gp -uranium -punished -disguise -bundesliga -elise -dundee -erotic -partisan -pi -collectors -float -individually -rendering -behavioral -bucharest -ser -hare -valerie -corporal -nutrition -proportional -##isa -immense -##kis -pavement -##zie -##eld -sutherland -crouched -1775 -##lp -suzuki -trades -endurance -operas -crosby -prayed -priory -rory -socially -##urn -gujarat -##pu -walton -cube -pasha -privilege -lennon -floods -thorne -waterfall -nipple -scouting -approve -##lov -minorities -voter -dwight -extensions -assure -ballroom -slap -dripping -privileges -rejoined -confessed -demonstrating -patriotic -yell -investor -##uth -pagan -slumped -squares -##cle -##kins -confront -bert -embarrassment -##aid -aston -urging -sweater -starr -yuri -brains -williamson -commuter -mortar -structured -selfish -exports -##jon -cds -##him -unfinished -##rre -mortgage -destinations -##nagar -canoe -solitary -buchanan -delays -magistrate -fk -##pling -motivation -##lier -##vier -recruiting -assess -##mouth -malik -antique -1791 -pius -rahman -reich -tub -zhou -smashed -airs -galway -xii -conditioning -honduras -discharged -dexter -##pf -lionel -129 -debates -lemon -tiffany -volunteered -dom -dioxide -procession -devi -sic -tremendous -advertisements -colts -transferring -verdict -hanover -decommissioned -utter -relate -pac -racism -##top -beacon -limp -similarity -terra -occurrence -ant -##how -becky -capt -updates -armament -richie -pal -##graph -halloween -mayo -##ssen -##bone -cara -serena -fcc -dolls -obligations -##dling -violated -lafayette -jakarta -exploitation -##ime -infamous -iconic -##lah -##park -kitty -moody -reginald -dread -spill -crystals -olivier -modeled -bluff -equilibrium -separating -notices -ordnance -extinction -onset -cosmic -attachment -sammy -expose -privy -anchored -##bil -abbott -admits -bending -baritone -emmanuel -policeman -vaughan -winged -climax -dresses -denny -polytechnic -mohamed -burmese -authentic -nikki -genetics -grandparents -homestead -gaza -postponed -metacritic -una -##sby -##bat -unstable -dissertation -##rial -##cian -curls -obscure -uncovered -bronx -praying -disappearing -##hoe -prehistoric -coke -turret -mutations -nonprofit -pits -monaco -##ي -##usion -prominently -dispatched -podium -##mir -uci -##uation -133 -fortifications -birthplace -kendall -##lby -##oll -preacher -rack -goodman -##rman -persistent -##ott -countless -jaime -recorder -lexington -persecution -jumps -renewal -wagons -##11 -crushing -##holder -decorations -##lake -abundance -wrath -laundry -£1 -garde -##rp -jeanne -beetles -peasant -##sl -splitting -caste -sergei -##rer -##ema -scripts -##ively -rub -satellites -##vor -inscribed -verlag -scrapped -gale -packages -chick -potato -slogan -kathleen -arabs -##culture -counterparts -reminiscent -choral -##tead -rand -retains -bushes -dane -accomplish -courtesy -closes -##oth -slaughter -hague -krakow -lawson -tailed -elias -ginger -##ttes -canopy -betrayal -rebuilding -turf -##hof -frowning -allegiance -brigades -kicks -rebuild -polls -alias -nationalism -td -rowan -audition -bowie -fortunately -recognizes -harp -dillon -horrified -##oro -renault -##tics -ropes -##α -presumed -rewarded -infrared -wiping -accelerated -illustration -##rid -presses -practitioners -badminton -##iard -detained -##tera -recognizing -relates -misery -##sies -##tly -reproduction -piercing -potatoes -thornton -esther -manners -hbo -##aan -ours -bullshit -ernie -perennial -sensitivity -illuminated -rupert -##jin -##iss -##ear -rfc -nassau -##dock -staggered -socialism -##haven -appointments -nonsense -prestige -sharma -haul -##tical -solidarity -gps -##ook -##rata -igor -pedestrian -##uit -baxter -tenants -wires -medication -unlimited -guiding -impacts -diabetes -##rama -sasha -pas -clive -extraction -131 -continually -constraints -##bilities -sonata -hunted -sixteenth -chu -planting -quote -mayer -pretended -abs -spat -##hua -ceramic -##cci -curtains -pigs -pitching -##dad -latvian -sore -dayton -##sted -##qi -patrols -slice -playground -##nted -shone -stool -apparatus -inadequate -mates -treason -##ija -desires -##liga -##croft -somalia -laurent -mir -leonardo -oracle -grape -obliged -chevrolet -thirteenth -stunning -enthusiastic -##ede -accounted -concludes -currents -basil -##kovic -drought -##rica -mai -##aire -shove -posting -##shed -pilgrimage -humorous -packing -fry -pencil -wines -smells -144 -marilyn -aching -newest -clung -bon -neighbours -sanctioned -##pie -mug -##stock -drowning -##mma -hydraulic -##vil -hiring -reminder -lilly -investigators -##ncies -sour -##eous -compulsory -packet -##rion -##graphic -##elle -cannes -##inate -depressed -##rit -heroic -importantly -theresa -##tled -conway -saturn -marginal -rae -##xia -corresponds -royce -pact -jasper -explosives -packaging -aluminium -##ttered -denotes -rhythmic -spans -assignments -hereditary -outlined -originating -sundays -lad -reissued -greeting -beatrice -##dic -pillar -marcos -plots -handbook -alcoholic -judiciary -avant -slides -extract -masculine -blur -##eum -##force -homage -trembled -owens -hymn -trey -omega -signaling -socks -accumulated -reacted -attic -theo -lining -angie -distraction -primera -talbot -##key -1200 -ti -creativity -billed -##hey -deacon -eduardo -identifies -proposition -dizzy -gunner -hogan -##yam -##pping -##hol -ja -##chan -jensen -reconstructed -##berger -clearance -darius -##nier -abe -harlem -plea -dei -circled -emotionally -notation -fascist -neville -exceeded -upwards -viable -ducks -##fo -workforce -racer -limiting -shri -##lson -possesses -1600 -kerr -moths -devastating -laden -disturbing -locking -##cture -gal -fearing -accreditation -flavor -aide -1870s -mountainous -##baum -melt -##ures -motel -texture -servers -soda -##mb -herd -##nium -erect -puzzled -hum -peggy -examinations -gould -testified -geoff -ren -devised -sacks -##law -denial -posters -grunted -cesar -tutor -ec -gerry -offerings -byrne -falcons -combinations -ct -incoming -pardon -rocking -26th -avengers -flared -mankind -seller -uttar -loch -nadia -stroking -exposing -##hd -fertile -ancestral -instituted -##has -noises -prophecy -taxation -eminent -vivid -pol -##bol -dart -indirect -multimedia -notebook -upside -displaying -adrenaline -referenced -geometric -##iving -progression -##ddy -blunt -announce -##far -implementing -##lav -aggression -liaison -cooler -cares -headache -plantations -gorge -dots -impulse -thickness -ashamed -averaging -kathy -obligation -precursor -137 -fowler -symmetry -thee -225 -hears -##rai -undergoing -ads -butcher -bowler -##lip -cigarettes -subscription -goodness -##ically -browne -##hos -##tech -kyoto -donor -##erty -damaging -friction -drifting -expeditions -hardened -prostitution -152 -fauna -blankets -claw -tossing -snarled -butterflies -recruits -investigative -coated -healed -138 -communal -hai -xiii -academics -boone -psychologist -restless -lahore -stephens -mba -brendan -foreigners -printer -##pc -ached -explode -27th -deed -scratched -dared -##pole -cardiac -1780 -okinawa -proto -commando -compelled -oddly -electrons -##base -replica -thanksgiving -##rist -sheila -deliberate -stafford -tidal -representations -hercules -ou -##path -##iated -kidnapping -lenses -##tling -deficit -samoa -mouths -consuming -computational -maze -granting -smirk -razor -fixture -ideals -inviting -aiden -nominal -##vs -issuing -julio -pitt -ramsey -docks -##oss -exhaust -##owed -bavarian -draped -anterior -mating -ethiopian -explores -noticing -##nton -discarded -convenience -hoffman -endowment -beasts -cartridge -mormon -paternal -probe -sleeves -interfere -lump -deadline -##rail -jenks -bulldogs -scrap -alternating -justified -reproductive -nam -seize -descending -secretariat -kirby -coupe -grouped -smash -panther -sedan -tapping -##18 -lola -cheer -germanic -unfortunate -##eter -unrelated -##fan -subordinate -##sdale -suzanne -advertisement -##ility -horsepower -##lda -cautiously -discourse -luigi -##mans -##fields -noun -prevalent -mao -schneider -everett -surround -governorate -kira -##avia -westward -##take -misty -rails -sustainability -134 -unused -##rating -packs -toast -unwilling -regulate -thy -suffrage -nile -awe -assam -definitions -travelers -affordable -##rb -conferred -sells -undefeated -beneficial -torso -basal -repeating -remixes -##pass -bahrain -cables -fang -##itated -excavated -numbering -statutory -##rey -deluxe -##lian -forested -ramirez -derbyshire -zeus -slamming -transfers -astronomer -banana -lottery -berg -histories -bamboo -##uchi -resurrection -posterior -bowls -vaguely -##thi -thou -preserving -tensed -offence -##inas -meyrick -callum -ridden -watt -langdon -tying -lowland -snorted -daring -truman -##hale -##girl -aura -overly -filing -weighing -goa -infections -philanthropist -saunders -eponymous -##owski -latitude -perspectives -reviewing -mets -commandant -radial -##kha -flashlight -reliability -koch -vowels -amazed -ada -elaine -supper -##rth -##encies -predator -debated -soviets -cola -##boards -##nah -compartment -crooked -arbitrary -fourteenth -##ctive -havana -majors -steelers -clips -profitable -ambush -exited -packers -##tile -nude -cracks -fungi -##е -limb -trousers -josie -shelby -tens -frederic -##ος -definite -smoothly -constellation -insult -baton -discs -lingering -##nco -conclusions -lent -staging -becker -grandpa -shaky -##tron -einstein -obstacles -sk -adverse -elle -economically -##moto -mccartney -thor -dismissal -motions -readings -nostrils -treatise -##pace -squeezing -evidently -prolonged -1783 -venezuelan -je -marguerite -beirut -takeover -shareholders -##vent -denise -digit -airplay -norse -##bbling -imaginary -pills -hubert -blaze -vacated -eliminating -##ello -vine -mansfield -##tty -retrospective -barrow -borne -clutch -bail -forensic -weaving -##nett -##witz -desktop -citadel -promotions -worrying -dorset -ieee -subdivided -##iating -manned -expeditionary -pickup -synod -chuckle -185 -barney -##rz -##ffin -functionality -karachi -litigation -meanings -uc -lick -turbo -anders -##ffed -execute -curl -oppose -ankles -typhoon -##د -##ache -##asia -linguistics -compassion -pressures -grazing -perfection -##iting -immunity -monopoly -muddy -backgrounds -136 -namibia -francesca -monitors -attracting -stunt -tuition -##ии -vegetable -##mates -##quent -mgm -jen -complexes -forts -##ond -cellar -bites -seventeenth -royals -flemish -failures -mast -charities -##cular -peruvian -capitals -macmillan -ipswich -outward -frigate -postgraduate -folds -employing -##ouse -concurrently -fiery -##tai -contingent -nightmares -monumental -nicaragua -##kowski -lizard -mal -fielding -gig -reject -##pad -harding -##ipe -coastline -##cin -##nos -beethoven -humphrey -innovations -##tam -##nge -norris -doris -solicitor -huang -obey -141 -##lc -niagara -##tton -shelves -aug -bourbon -curry -nightclub -specifications -hilton -##ndo -centennial -dispersed -worm -neglected -briggs -sm -font -kuala -uneasy -plc -##nstein -##bound -##aking -##burgh -awaiting -pronunciation -##bbed -##quest -eh -optimal -zhu -raped -greens -presided -brenda -worries -##life -venetian -marxist -turnout -##lius -refined -braced -sins -grasped -sunderland -nickel -speculated -lowell -cyrillic -communism -fundraising -resembling -colonists -mutant -freddie -usc -##mos -gratitude -##run -mural -##lous -chemist -wi -reminds -28th -steals -tess -pietro -##ingen -promoter -ri -microphone -honoured -rai -sant -##qui -feather -##nson -burlington -kurdish -terrorists -deborah -sickness -##wed -##eet -hazard -irritated -desperation -veil -clarity -##rik -jewels -xv -##gged -##ows -##cup -berkshire -unfair -mysteries -orchid -winced -exhaustion -renovations -stranded -obe -infinity -##nies -adapt -redevelopment -thanked -registry -olga -domingo -noir -tudor -ole -##atus -commenting -behaviors -##ais -crisp -pauline -probable -stirling -wigan -##bian -paralympics -panting -surpassed -##rew -luca -barred -pony -famed -##sters -cassandra -waiter -carolyn -exported -##orted -andres -destructive -deeds -jonah -castles -vacancy -suv -##glass -1788 -orchard -yep -famine -belarusian -sprang -##forth -skinny -##mis -administrators -rotterdam -zambia -zhao -boiler -discoveries -##ride -##physics -lucius -disappointing -outreach -spoon -##frame -qualifications -unanimously -enjoys -regency -##iidae -stade -realism -veterinary -rodgers -dump -alain -chestnut -castile -censorship -rumble -gibbs -##itor -communion -reggae -inactivated -logs -loads -##houses -homosexual -##iano -ale -informs -##cas -phrases -plaster -linebacker -ambrose -kaiser -fascinated -850 -limerick -recruitment -forge -mastered -##nding -leinster -rooted -threaten -##strom -borneo -##hes -suggestions -scholarships -propeller -documentaries -patronage -coats -constructing -invest -neurons -comet -entirety -shouts -identities -annoying -unchanged -wary -##antly -##ogy -neat -oversight -##kos -phillies -replay -constance -##kka -incarnation -humble -skies -minus -##acy -smithsonian -##chel -guerrilla -jar -cadets -##plate -surplus -audit -##aru -cracking -joanna -louisa -pacing -##lights -intentionally -##iri -diner -nwa -imprint -australians -tong -unprecedented -bunker -naive -specialists -ark -nichols -railing -leaked -pedal -##uka -shrub -longing -roofs -v8 -captains -neural -tuned -##ntal -##jet -emission -medina -frantic -codex -definitive -sid -abolition -intensified -stocks -enrique -sustain -genoa -oxide -##written -clues -cha -##gers -tributaries -fragment -venom -##rity -##ente -##sca -muffled -vain -sire -laos -##ingly -##hana -hastily -snapping -surfaced -sentiment -motive -##oft -contests -approximate -mesa -luckily -dinosaur -exchanges -propelled -accord -bourne -relieve -tow -masks -offended -##ues -cynthia -##mmer -rains -bartender -zinc -reviewers -lois -##sai -legged -arrogant -rafe -rosie -comprise -handicap -blockade -inlet -lagoon -copied -drilling -shelley -petals -##inian -mandarin -obsolete -##inated -onward -arguably -productivity -cindy -praising -seldom -busch -discusses -raleigh -shortage -ranged -stanton -encouragement -firstly -conceded -overs -temporal -##uke -cbe -##bos -woo -certainty -pumps -##pton -stalked -##uli -lizzie -periodic -thieves -weaker -##night -gases -shoving -chooses -wc -##chemical -prompting -weights -##kill -robust -flanked -sticky -hu -tuberculosis -##eb -##eal -christchurch -resembled -wallet -reese -inappropriate -pictured -distract -fixing -fiddle -giggled -burger -heirs -hairy -mechanic -torque -apache -obsessed -chiefly -cheng -logging -##tag -extracted -meaningful -numb -##vsky -gloucestershire -reminding -##bay -unite -##lit -breeds -diminished -clown -glove -1860s -##ن -##ug -archibald -focal -freelance -sliced -depiction -##yk -organism -switches -sights -stray -crawling -##ril -lever -leningrad -interpretations -loops -anytime -reel -alicia -delighted -##ech -inhaled -xiv -suitcase -bernie -vega -licenses -northampton -exclusion -induction -monasteries -racecourse -homosexuality -##right -##sfield -##rky -dimitri -michele -alternatives -ions -commentators -genuinely -objected -pork -hospitality -fencing -stephan -warships -peripheral -wit -drunken -wrinkled -quentin -spends -departing -chung -numerical -spokesperson -##zone -johannesburg -caliber -killers -##udge -assumes -neatly -demographic -abigail -bloc -##vel -mounting -##lain -bentley -slightest -xu -recipients -##jk -merlin -##writer -seniors -prisons -blinking -hindwings -flickered -kappa -##hel -80s -strengthening -appealing -brewing -gypsy -mali -lashes -hulk -unpleasant -harassment -bio -treaties -predict -instrumentation -pulp -troupe -boiling -mantle -##ffe -ins -##vn -dividing -handles -verbs -##onal -coconut -senegal -340 -thorough -gum -momentarily -##sto -cocaine -panicked -destined -##turing -teatro -denying -weary -captained -mans -##hawks -##code -wakefield -bollywood -thankfully -##16 -cyril -##wu -amendments -##bahn -consultation -stud -reflections -kindness -1787 -internally -##ovo -tex -mosaic -distribute -paddy -seeming -143 -##hic -piers -##15 -##mura -##verse -popularly -winger -kang -sentinel -mccoy -##anza -covenant -##bag -verge -fireworks -suppress -thrilled -dominate -##jar -swansea -##60 -142 -reconciliation -##ndi -stiffened -cue -dorian -##uf -damascus -amor -ida -foremost -##aga -porsche -unseen -dir -##had -##azi -stony -lexi -melodies -##nko -angular -integer -podcast -ants -inherent -jaws -justify -persona -##olved -josephine -##nr -##ressed -customary -flashes -gala -cyrus -glaring -backyard -ariel -physiology -greenland -html -stir -avon -atletico -finch -methodology -ked -##lent -mas -catholicism -townsend -branding -quincy -fits -containers -1777 -ashore -aragon -##19 -forearm -poisoning -##sd -adopting -conquer -grinding -amnesty -keller -finances -evaluate -forged -lankan -instincts -##uto -guam -bosnian -photographed -workplace -desirable -protector -##dog -allocation -intently -encourages -willy -##sten -bodyguard -electro -brighter -##ν -bihar -##chev -lasts -opener -amphibious -sal -verde -arte -##cope -captivity -vocabulary -yields -##tted -agreeing -desmond -pioneered -##chus -strap -campaigned -railroads -##ович -emblem -##dre -stormed -501 -##ulous -marijuana -northumberland -##gn -##nath -bowen -landmarks -beaumont -##qua -danube -##bler -attorneys -th -ge -flyers -critique -villains -cass -mutation -acc -##0s -colombo -mckay -motif -sampling -concluding -syndicate -##rell -neon -stables -ds -warnings -clint -mourning -wilkinson -##tated -merrill -leopard -evenings -exhaled -emil -sonia -ezra -discrete -stove -farrell -fifteenth -prescribed -superhero -##rier -worms -helm -wren -##duction -##hc -expo -##rator -hq -unfamiliar -antony -prevents -acceleration -fiercely -mari -painfully -calculations -cheaper -ign -clifton -irvine -davenport -mozambique -##np -pierced -##evich -wonders -##wig -##cate -##iling -crusade -ware -##uel -enzymes -reasonably -mls -##coe -mater -ambition -bunny -eliot -kernel -##fin -asphalt -headmaster -torah -aden -lush -pins -waived -##care -##yas -joao -substrate -enforce -##grad -##ules -alvarez -selections -epidemic -tempted -##bit -bremen -translates -ensured -waterfront -29th -forrest -manny -malone -kramer -reigning -cookies -simpler -absorption -205 -engraved -##ffy -evaluated -1778 -haze -146 -comforting -crossover -##abe -thorn -##rift -##imo -##pop -suppression -fatigue -cutter -##tr -201 -wurttemberg -##orf -enforced -hovering -proprietary -gb -samurai -syllable -ascent -lacey -tick -lars -tractor -merchandise -rep -bouncing -defendants -##yre -huntington -##ground -##oko -standardized -##hor -##hima -assassinated -nu -predecessors -rainy -liar -assurance -lyrical -##uga -secondly -flattened -ios -parameter -undercover -##mity -bordeaux -punish -ridges -markers -exodus -inactive -hesitate -debbie -nyc -pledge -savoy -nagar -offset -organist -##tium -hesse -marin -converting -##iver -diagram -propulsion -pu -validity -reverted -supportive -##dc -ministries -clans -responds -proclamation -##inae -##ø -##rea -ein -pleading -patriot -sf -birch -islanders -strauss -hates -##dh -brandenburg -concession -rd -##ob -1900s -killings -textbook -antiquity -cinematography -wharf -embarrassing -setup -creed -farmland -inequality -centred -signatures -fallon -370 -##ingham -##uts -ceylon -gazing -directive -laurie -##tern -globally -##uated -##dent -allah -excavation -threads -##cross -148 -frantically -icc -utilize -determines -respiratory -thoughtful -receptions -##dicate -merging -chandra -seine -147 -builders -builds -diagnostic -dev -visibility -goddamn -analyses -dhaka -cho -proves -chancel -concurrent -curiously -canadians -pumped -restoring -1850s -turtles -jaguar -sinister -spinal -traction -declan -vows -1784 -glowed -capitalism -swirling -install -universidad -##lder -##oat -soloist -##genic -##oor -coincidence -beginnings -nissan -dip -resorts -caucasus -combustion -infectious -##eno -pigeon -serpent -##itating -conclude -masked -salad -jew -##gr -surreal -toni -##wc -harmonica -151 -##gins -##etic -##coat -fishermen -intending -bravery -##wave -klaus -titan -wembley -taiwanese -ransom -40th -incorrect -hussein -eyelids -jp -cooke -dramas -utilities -##etta -##print -eisenhower -principally -granada -lana -##rak -openings -concord -##bl -bethany -connie -morality -sega -##mons -##nard -earnings -##kara -##cine -wii -communes -##rel -coma -composing -softened -severed -grapes -##17 -nguyen -analyzed -warlord -hubbard -heavenly -behave -slovenian -##hit -##ony -hailed -filmmakers -trance -caldwell -skye -unrest -coward -likelihood -##aging -bern -sci -taliban -honolulu -propose -##wang -1700 -browser -imagining -cobra -contributes -dukes -instinctively -conan -violinist -##ores -accessories -gradual -##amp -quotes -sioux -##dating -undertake -intercepted -sparkling -compressed -139 -fungus -tombs -haley -imposing -rests -degradation -lincolnshire -retailers -wetlands -tulsa -distributor -dungeon -nun -greenhouse -convey -atlantis -aft -exits -oman -dresser -lyons -##sti -joking -eddy -judgement -omitted -digits -##cts -##game -juniors -##rae -cents -stricken -une -##ngo -wizards -weir -breton -nan -technician -fibers -liking -royalty -##cca -154 -persia -terribly -magician -##rable -##unt -vance -cafeteria -booker -camille -warmer -##static -consume -cavern -gaps -compass -contemporaries -foyer -soothing -graveyard -maj -plunged -blush -##wear -cascade -demonstrates -ordinance -##nov -boyle -##lana -rockefeller -shaken -banjo -izzy -##ense -breathless -vines -##32 -##eman -alterations -chromosome -dwellings -feudal -mole -153 -catalonia -relics -tenant -mandated -##fm -fridge -hats -honesty -patented -raul -heap -cruisers -accusing -enlightenment -infants -wherein -chatham -contractors -zen -affinity -hc -osborne -piston -156 -traps -maturity -##rana -lagos -##zal -peering -##nay -attendant -dealers -protocols -subset -prospects -biographical -##cre -artery -##zers -insignia -nuns -endured -##eration -recommend -schwartz -serbs -berger -cromwell -crossroads -##ctor -enduring -clasped -grounded -##bine -marseille -twitched -abel -choke -https -catalyst -moldova -italians -##tist -disastrous -wee -##oured -##nti -wwf -nope -##piration -##asa -expresses -thumbs -167 -##nza -coca -1781 -cheating -##ption -skipped -sensory -heidelberg -spies -satan -dangers -semifinal -202 -bohemia -whitish -confusing -shipbuilding -relies -surgeons -landings -ravi -baku -moor -suffix -alejandro -##yana -litre -upheld -##unk -rajasthan -##rek -coaster -insists -posture -scenarios -etienne -favoured -appoint -transgender -elephants -poked -greenwood -defences -fulfilled -militant -somali -1758 -chalk -potent -##ucci -migrants -wink -assistants -nos -restriction -activism -niger -##ario -colon -shaun -##sat -daphne -##erated -swam -congregations -reprise -considerations -magnet -playable -xvi -##р -overthrow -tobias -knob -chavez -coding -##mers -propped -katrina -orient -newcomer -##suke -temperate -##pool -farmhouse -interrogation -##vd -committing -##vert -forthcoming -strawberry -joaquin -macau -ponds -shocking -siberia -##cellular -chant -contributors -##nant -##ologists -sped -absorb -hail -1782 -spared -##hore -barbados -karate -opus -originates -saul -##xie -evergreen -leaped -##rock -correlation -exaggerated -weekday -unification -bump -tracing -brig -afb -pathways -utilizing -##ners -mod -mb -disturbance -kneeling -##stad -##guchi -100th -pune -##thy -decreasing -168 -manipulation -miriam -academia -ecosystem -occupational -rbi -##lem -rift -##14 -rotary -stacked -incorporation -awakening -generators -guerrero -racist -##omy -cyber -derivatives -culminated -allie -annals -panzer -sainte -wikipedia -pops -zu -austro -##vate -algerian -politely -nicholson -mornings -educate -tastes -thrill -dartmouth -##gating -db -##jee -regan -differing -concentrating -choreography -divinity -##media -pledged -alexandre -routing -gregor -madeline -##idal -apocalypse -##hora -gunfire -culminating -elves -fined -liang -lam -programmed -tar -guessing -transparency -gabrielle -##gna -cancellation -flexibility -##lining -accession -shea -stronghold -nets -specializes -##rgan -abused -hasan -sgt -ling -exceeding -##₄ -admiration -supermarket -##ark -photographers -specialised -tilt -resonance -hmm -perfume -380 -sami -threatens -garland -botany -guarding -boiled -greet -puppy -russo -supplier -wilmington -vibrant -vijay -##bius -paralympic -grumbled -paige -faa -licking -margins -hurricanes -##gong -fest -grenade -ripping -##uz -counseling -weigh -##sian -needles -wiltshire -edison -costly -##not -fulton -tramway -redesigned -staffordshire -cache -gasping -watkins -sleepy -candidacy -##group -monkeys -timeline -throbbing -##bid -##sos -berth -uzbekistan -vanderbilt -bothering -overturned -ballots -gem -##iger -sunglasses -subscribers -hooker -compelling -ang -exceptionally -saloon -stab -##rdi -carla -terrifying -rom -##vision -coil -##oids -satisfying -vendors -31st -mackay -deities -overlooked -ambient -bahamas -felipe -olympia -whirled -botanist -advertised -tugging -##dden -disciples -morales -unionist -rites -foley -morse -motives -creepy -##₀ -soo -##sz -bargain -highness -frightening -turnpike -tory -reorganization -##cer -depict -biographer -##walk -unopposed -manifesto -##gles -institut -emile -accidental -kapoor -##dam -kilkenny -cortex -lively -##13 -romanesque -jain -shan -cannons -##ood -##ske -petrol -echoing -amalgamated -disappears -cautious -proposes -sanctions -trenton -##ر -flotilla -aus -contempt -tor -canary -cote -theirs -##hun -conceptual -deleted -fascinating -paso -blazing -elf -honourable -hutchinson -##eiro -##outh -##zin -surveyor -tee -amidst -wooded -reissue -intro -##ono -cobb -shelters -newsletter -hanson -brace -encoding -confiscated -dem -caravan -marino -scroll -melodic -cows -imam -##adi -##aneous -northward -searches -biodiversity -cora -310 -roaring -##bers -connell -theologian -halo -compose -pathetic -unmarried -dynamo -##oot -az -calculation -toulouse -deserves -humour -nr -forgiveness -tam -undergone -martyr -pamela -myths -whore -counselor -hicks -290 -heavens -battleship -electromagnetic -##bbs -stellar -establishments -presley -hopped -##chin -temptation -90s -wills -nas -##yuan -nhs -##nya -seminars -##yev -adaptations -gong -asher -lex -indicator -sikh -tobago -cites -goin -##yte -satirical -##gies -characterised -correspond -bubbles -lure -participates -##vid -eruption -skate -therapeutic -1785 -canals -wholesale -defaulted -sac -460 -petit -##zzled -virgil -leak -ravens -256 -portraying -##yx -ghetto -creators -dams -portray -vicente -##rington -fae -namesake -bounty -##arium -joachim -##ota -##iser -aforementioned -axle -snout -depended -dismantled -reuben -480 -##ibly -gallagher -##lau -##pd -earnest -##ieu -##iary -inflicted -objections -##llar -asa -gritted -##athy -jericho -##sea -##was -flick -underside -ceramics -undead -substituted -195 -eastward -undoubtedly -wheeled -chimney -##iche -guinness -cb -##ager -siding -##bell -traitor -baptiste -disguised -inauguration -149 -tipperary -choreographer -perched -warmed -stationary -eco -##ike -##ntes -bacterial -##aurus -flores -phosphate -##core -attacker -invaders -alvin -intersects -a1 -indirectly -immigrated -businessmen -cornelius -valves -narrated -pill -sober -ul -nationale -monastic -applicants -scenery -##jack -161 -motifs -constitutes -cpu -##osh -jurisdictions -sd -tuning -irritation -woven -##uddin -fertility -gao -##erie -antagonist -impatient -glacial -hides -boarded -denominations -interception -##jas -cookie -nicola -##tee -algebraic -marquess -bahn -parole -buyers -bait -turbines -paperwork -bestowed -natasha -renee -oceans -purchases -157 -vaccine -215 -##tock -fixtures -playhouse -integrate -jai -oswald -intellectuals -##cky -booked -nests -mortimer -##isi -obsession -sept -##gler -##sum -440 -scrutiny -simultaneous -squinted -##shin -collects -oven -shankar -penned -remarkably -##я -slips -luggage -spectral -1786 -collaborations -louie -consolidation -##ailed -##ivating -420 -hoover -blackpool -harness -ignition -vest -tails -belmont -mongol -skinner -##nae -visually -mage -derry -##tism -##unce -stevie -transitional -##rdy -redskins -drying -prep -prospective -##21 -annoyance -oversee -##loaded -fills -##books -##iki -announces -fda -scowled -respects -prasad -mystic -tucson -##vale -revue -springer -bankrupt -1772 -aristotle -salvatore -habsburg -##geny -dal -natal -nut -pod -chewing -darts -moroccan -walkover -rosario -lenin -punjabi -##ße -grossed -scattering -wired -invasive -hui -polynomial -corridors -wakes -gina -portrays -##cratic -arid -retreating -erich -irwin -sniper -##dha -linen -lindsey -maneuver -butch -shutting -socio -bounce -commemorative -postseason -jeremiah -pines -275 -mystical -beads -bp -abbas -furnace -bidding -consulted -assaulted -empirical -rubble -enclosure -sob -weakly -cancel -polly -yielded -##emann -curly -prediction -battered -70s -vhs -jacqueline -render -sails -barked -detailing -grayson -riga -sloane -raging -##yah -herbs -bravo -##athlon -alloy -giggle -imminent -suffers -assumptions -waltz -##itate -accomplishments -##ited -bathing -remixed -deception -prefix -##emia -deepest -##tier -##eis -balkan -frogs -##rong -slab -##pate -philosophers -peterborough -grains -imports -dickinson -rwanda -##atics -1774 -dirk -lan -tablets -##rove -clone -##rice -caretaker -hostilities -mclean -##gre -regimental -treasures -norms -impose -tsar -tango -diplomacy -variously -complain -192 -recognise -arrests -1779 -celestial -pulitzer -##dus -bing -libretto -##moor -adele -splash -##rite -expectation -lds -confronts -##izer -spontaneous -harmful -wedge -entrepreneurs -buyer -##ope -bilingual -translate -rugged -conner -circulated -uae -eaton -##gra -##zzle -lingered -lockheed -vishnu -reelection -alonso -##oom -joints -yankee -headline -cooperate -heinz -laureate -invading -##sford -echoes -scandinavian -##dham -hugging -vitamin -salute -micah -hind -trader -##sper -radioactive -##ndra -militants -poisoned -ratified -remark -campeonato -deprived -wander -prop -##dong -outlook -##tani -##rix -##eye -chiang -darcy -##oping -mandolin -spice -statesman -babylon -182 -walled -forgetting -afro -##cap -158 -giorgio -buffer -##polis -planetary -##gis -overlap -terminals -kinda -centenary -##bir -arising -manipulate -elm -ke -1770 -ak -##tad -chrysler -mapped -moose -pomeranian -quad -macarthur -assemblies -shoreline -recalls -stratford -##rted -noticeable -##evic -imp -##rita -##sque -accustomed -supplying -tents -disgusted -vogue -sipped -filters -khz -reno -selecting -luftwaffe -mcmahon -tyne -masterpiece -carriages -collided -dunes -exercised -flare -remembers -muzzle -##mobile -heck -##rson -burgess -lunged -middleton -boycott -bilateral -##sity -hazardous -lumpur -multiplayer -spotlight -jackets -goldman -liege -porcelain -rag -waterford -benz -attracts -hopeful -battling -ottomans -kensington -baked -hymns -cheyenne -lattice -levine -borrow -polymer -clashes -michaels -monitored -commitments -denounced -##25 -##von -cavity -##oney -hobby -akin -##holders -futures -intricate -cornish -patty -##oned -illegally -dolphin -##lag -barlow -yellowish -maddie -apologized -luton -plagued -##puram -nana -##rds -sway -fanny -łodz -##rino -psi -suspicions -hanged -##eding -initiate -charlton -##por -nak -competent -235 -analytical -annex -wardrobe -reservations -##rma -sect -162 -fairfax -hedge -piled -buckingham -uneven -bauer -simplicity -snyder -interpret -accountability -donors -moderately -byrd -continents -##cite -##max -disciple -hr -jamaican -ping -nominees -##uss -mongolian -diver -attackers -eagerly -ideological -pillows -miracles -apartheid -revolver -sulfur -clinics -moran -163 -##enko -ile -katy -rhetoric -##icated -chronology -recycling -##hrer -elongated -mughal -pascal -profiles -vibration -databases -domination -##fare -##rant -matthias -digest -rehearsal -polling -weiss -initiation -reeves -clinging -flourished -impress -ngo -##hoff -##ume -buckley -symposium -rhythms -weed -emphasize -transforming -##taking -##gence -##yman -accountant -analyze -flicker -foil -priesthood -voluntarily -decreases -##80 -##hya -slater -sv -charting -mcgill -##lde -moreno -##iu -besieged -zur -robes -##phic -admitting -api -deported -turmoil -peyton -earthquakes -##ares -nationalists -beau -clair -brethren -interrupt -welch -curated -galerie -requesting -164 -##ested -impending -steward -viper -##vina -complaining -beautifully -brandy -foam -nl -1660 -##cake -alessandro -punches -laced -explanations -##lim -attribute -clit -reggie -discomfort -##cards -smoothed -whales -##cene -adler -countered -duffy -disciplinary -widening -recipe -reliance -conducts -goats -gradient -preaching -##shaw -matilda -quasi -striped -meridian -cannabis -cordoba -certificates -##agh -##tering -graffiti -hangs -pilgrims -repeats -##ych -revive -urine -etat -##hawk -fueled -belts -fuzzy -susceptible -##hang -mauritius -salle -sincere -beers -hooks -##cki -arbitration -entrusted -advise -sniffed -seminar -junk -donnell -processors -principality -strapped -celia -mendoza -everton -fortunes -prejudice -starving -reassigned -steamer -##lund -tuck -evenly -foreman -##ffen -dans -375 -envisioned -slit -##xy -baseman -liberia -rosemary -##weed -electrified -periodically -potassium -stride -contexts -sperm -slade -mariners -influx -bianca -subcommittee -##rane -spilling -icao -estuary -##nock -delivers -iphone -##ulata -isa -mira -bohemian -dessert -##sbury -welcoming -proudly -slowing -##chs -musee -ascension -russ -##vian -waits -##psy -africans -exploit -##morphic -gov -eccentric -crab -peck -##ull -entrances -formidable -marketplace -groom -bolted -metabolism -patton -robbins -courier -payload -endure -##ifier -andes -refrigerator -##pr -ornate -##uca -ruthless -illegitimate -masonry -strasbourg -bikes -adobe -##³ -apples -quintet -willingly -niche -bakery -corpses -energetic -##cliffe -##sser -##ards -177 -centimeters -centro -fuscous -cretaceous -rancho -##yde -andrei -telecom -tottenham -oasis -ordination -vulnerability -presiding -corey -cp -penguins -sims -##pis -malawi -piss -##48 -correction -##cked -##ffle -##ryn -countdown -detectives -psychiatrist -psychedelic -dinosaurs -blouse -##get -choi -vowed -##oz -randomly -##pol -49ers -scrub -blanche -bruins -dusseldorf -##using -unwanted -##ums -212 -dominique -elevations -headlights -om -laguna -##oga -1750 -famously -ignorance -shrewsbury -##aine -ajax -breuning -che -confederacy -greco -overhaul -##screen -paz -skirts -disagreement -cruelty -jagged -phoebe -shifter -hovered -viruses -##wes -mandy -##lined -##gc -landlord -squirrel -dashed -##ι -ornamental -gag -wally -grange -literal -spurs -undisclosed -proceeding -yin -##text -billie -orphan -spanned -humidity -indy -weighted -presentations -explosions -lucian -##tary -vaughn -hindus -##anga -##hell -psycho -171 -daytona -protects -efficiently -rematch -sly -tandem -##oya -rebranded -impaired -hee -metropolis -peach -godfrey -diaspora -ethnicity -prosperous -gleaming -dar -grossing -playback -##rden -stripe -pistols -##tain -births -labelled -##cating -172 -rudy -alba -##onne -aquarium -hostility -##gb -##tase -shudder -sumatra -hardest -lakers -consonant -creeping -demos -homicide -capsule -zeke -liberties -expulsion -pueblo -##comb -trait -transporting -##ddin -##neck -##yna -depart -gregg -mold -ledge -hangar -oldham -playboy -termination -analysts -gmbh -romero -##itic -insist -cradle -filthy -brightness -slash -shootout -deposed -bordering -##truct -isis -microwave -tumbled -sheltered -cathy -werewolves -messy -andersen -convex -clapped -clinched -satire -wasting -edo -vc -rufus -##jak -mont -##etti -poznan -##keeping -restructuring -transverse -##rland -azerbaijani -slovene -gestures -roommate -choking -shear -##quist -vanguard -oblivious -##hiro -disagreed -baptism -##lich -coliseum -##aceae -salvage -societe -cory -locke -relocation -relying -versailles -ahl -swelling -##elo -cheerful -##word -##edes -gin -sarajevo -obstacle -diverted -##nac -messed -thoroughbred -fluttered -utrecht -chewed -acquaintance -assassins -dispatch -mirza -##wart -nike -salzburg -swell -yen -##gee -idle -ligue -samson -##nds -##igh -playful -spawned -##cise -tease -##case -burgundy -##bot -stirring -skeptical -interceptions -marathi -##dies -bedrooms -aroused -pinch -##lik -preferences -tattoos -buster -digitally -projecting -rust -##ital -kitten -priorities -addison -pseudo -##guard -dusk -icons -sermon -##psis -##iba -bt -##lift -##xt -ju -truce -rink -##dah -##wy -defects -psychiatry -offences -calculate -glucose -##iful -##rized -##unda -francaise -##hari -richest -warwickshire -carly -1763 -purity -redemption -lending -##cious -muse -bruises -cerebral -aero -carving -##name -preface -terminology -invade -monty -##int -anarchist -blurred -##iled -rossi -treats -guts -shu -foothills -ballads -undertaking -premise -cecilia -affiliates -blasted -conditional -wilder -minors -drone -rudolph -buffy -swallowing -horton -attested -##hop -rutherford -howell -primetime -livery -penal -##bis -minimize -hydro -wrecked -wrought -palazzo -##gling -cans -vernacular -friedman -nobleman -shale -walnut -danielle -##ection -##tley -sears -##kumar -chords -lend -flipping -streamed -por -dracula -gallons -sacrifices -gamble -orphanage -##iman -mckenzie -##gible -boxers -daly -##balls -##ان -208 -##ific -##rative -##iq -exploited -slated -##uity -circling -hillary -pinched -goldberg -provost -campaigning -lim -piles -ironically -jong -mohan -successors -usaf -##tem -##ught -autobiographical -haute -preserves -##ending -acquitted -comparisons -203 -hydroelectric -gangs -cypriot -torpedoes -rushes -chrome -derive -bumps -instability -fiat -pets -##mbe -silas -dye -reckless -settler -##itation -info -heats -##writing -176 -canonical -maltese -fins -mushroom -stacy -aspen -avid -##kur -##loading -vickers -gaston -hillside -statutes -wilde -gail -kung -sabine -comfortably -motorcycles -##rgo -169 -pneumonia -fetch -##sonic -axel -faintly -parallels -##oop -mclaren -spouse -compton -interdisciplinary -miner -##eni -181 -clamped -##chal -##llah -separates -versa -##mler -scarborough -labrador -##lity -##osing -rutgers -hurdles -como -166 -burt -divers -##100 -wichita -cade -coincided -##erson -bruised -mla -##pper -vineyard -##ili -##brush -notch -mentioning -jase -hearted -kits -doe -##acle -pomerania -##ady -ronan -seizure -pavel -problematic -##zaki -domenico -##ulin -catering -penelope -dependence -parental -emilio -ministerial -atkinson -##bolic -clarkson -chargers -colby -grill -peeked -arises -summon -##aged -fools -##grapher -faculties -qaeda -##vial -garner -refurbished -##hwa -geelong -disasters -nudged -bs -shareholder -lori -algae -reinstated -rot -##ades -##nous -invites -stainless -183 -inclusive -##itude -diocesan -til -##icz -denomination -##xa -benton -floral -registers -##ider -##erman -##kell -absurd -brunei -guangzhou -hitter -retaliation -##uled -##eve -blanc -nh -consistency -contamination -##eres -##rner -dire -palermo -broadcasters -diaries -inspire -vols -brewer -tightening -ky -mixtape -hormone -##tok -stokes -##color -##dly -##ssi -pg -##ometer -##lington -sanitation -##tility -intercontinental -apps -##adt -¹⁄₂ -cylinders -economies -favourable -unison -croix -gertrude -odyssey -vanity -dangling -##logists -upgrades -dice -middleweight -practitioner -##ight -206 -henrik -parlor -orion -angered -lac -python -blurted -##rri -sensual -intends -swings -angled -##phs -husky -attain -peerage -precinct -textiles -cheltenham -shuffled -dai -confess -tasting -bhutan -##riation -tyrone -segregation -abrupt -ruiz -##rish -smirked -blackwell -confidential -browning -amounted -##put -vase -scarce -fabulous -raided -staple -guyana -unemployed -glider -shay -##tow -carmine -troll -intervene -squash -superstar -##uce -cylindrical -len -roadway -researched -handy -##rium -##jana -meta -lao -declares -##rring -##tadt -##elin -##kova -willem -shrubs -napoleonic -realms -skater -qi -volkswagen -##ł -tad -hara -archaeologist -awkwardly -eerie -##kind -wiley -##heimer -##24 -titus -organizers -cfl -crusaders -lama -usb -vent -enraged -thankful -occupants -maximilian -##gaard -possessing -textbooks -##oran -collaborator -quaker -##ulo -avalanche -mono -silky -straits -isaiah -mustang -surged -resolutions -potomac -descend -cl -kilograms -plato -strains -saturdays -##olin -bernstein -##ype -holstein -ponytail -##watch -belize -conversely -heroine -perpetual -##ylus -charcoal -piedmont -glee -negotiating -backdrop -prologue -##jah -##mmy -pasadena -climbs -ramos -sunni -##holm -##tner -##tri -anand -deficiency -hertfordshire -stout -##avi -aperture -orioles -##irs -doncaster -intrigued -bombed -coating -otis -##mat -cocktail -##jit -##eto -amir -arousal -sar -##proof -##act -##ories -dixie -pots -##bow -whereabouts -159 -##fted -drains -bullying -cottages -scripture -coherent -fore -poe -appetite -##uration -sampled -##ators -##dp -derrick -rotor -jays -peacock -installment -##rro -advisors -##coming -rodeo -scotch -##mot -##db -##fen -##vant -ensued -rodrigo -dictatorship -martyrs -twenties -##н -towed -incidence -marta -rainforest -sai -scaled -##cles -oceanic -qualifiers -symphonic -mcbride -dislike -generalized -aubrey -colonization -##iation -##lion -##ssing -disliked -lublin -salesman -##ulates -spherical -whatsoever -sweating -avalon -contention -punt -severity -alderman -atari -##dina -##grant -##rop -scarf -seville -vertices -annexation -fairfield -fascination -inspiring -launches -palatinate -regretted -##rca -feral -##iom -elk -nap -olsen -reddy -yong -##leader -##iae -garment -transports -feng -gracie -outrage -viceroy -insides -##esis -breakup -grady -organizer -softer -grimaced -222 -murals -galicia -arranging -vectors -##rsten -bas -##sb -##cens -sloan -##eka -bitten -ara -fender -nausea -bumped -kris -banquet -comrades -detector -persisted -##llan -adjustment -endowed -cinemas -##shot -sellers -##uman -peek -epa -kindly -neglect -simpsons -talon -mausoleum -runaway -hangul -lookout -##cic -rewards -coughed -acquainted -chloride -##ald -quicker -accordion -neolithic -##qa -artemis -coefficient -lenny -pandora -tx -##xed -ecstasy -litter -segunda -chairperson -gemma -hiss -rumor -vow -nasal -antioch -compensate -patiently -transformers -##eded -judo -morrow -penis -posthumous -philips -bandits -husbands -denote -flaming -##any -##phones -langley -yorker -1760 -walters -##uo -##kle -gubernatorial -fatty -samsung -leroy -outlaw -##nine -unpublished -poole -jakob -##ᵢ -##ₙ -crete -distorted -superiority -##dhi -intercept -crust -mig -claus -crashes -positioning -188 -stallion -301 -frontal -armistice -##estinal -elton -aj -encompassing -camel -commemorated -malaria -woodward -calf -cigar -penetrate -##oso -willard -##rno -##uche -illustrate -amusing -convergence -noteworthy -##lma -##rva -journeys -realise -manfred -##sable -410 -##vocation -hearings -fiance -##posed -educators -provoked -adjusting -##cturing -modular -stockton -paterson -vlad -rejects -electors -selena -maureen -##tres -uber -##rce -swirled -##num -proportions -nanny -pawn -naturalist -parma -apostles -awoke -ethel -wen -##bey -monsoon -overview -##inating -mccain -rendition -risky -adorned -##ih -equestrian -germain -nj -conspicuous -confirming -##yoshi -shivering -##imeter -milestone -rumours -flinched -bounds -smacked -token -##bei -lectured -automobiles -##shore -impacted -##iable -nouns -nero -##leaf -ismail -prostitute -trams -##lace -bridget -sud -stimulus -impressions -reins -revolves -##oud -##gned -giro -honeymoon -##swell -criterion -##sms -##uil -libyan -prefers -##osition -211 -preview -sucks -accusation -bursts -metaphor -diffusion -tolerate -faye -betting -cinematographer -liturgical -specials -bitterly -humboldt -##ckle -flux -rattled -##itzer -archaeologists -odor -authorised -marshes -discretion -##ов -alarmed -archaic -inverse -##leton -explorers -##pine -drummond -tsunami -woodlands -##minate -##tland -booklet -insanity -owning -insert -crafted -calculus -##tore -receivers -##bt -stung -##eca -##nched -prevailing -travellers -eyeing -lila -graphs -##borne -178 -julien -##won -morale -adaptive -therapist -erica -cw -libertarian -bowman -pitches -vita -##ional -crook -##ads -##entation -caledonia -mutiny -##sible -1840s -automation -##ß -flock -##pia -ironic -pathology -##imus -remarried -##22 -joker -withstand -energies -##att -shropshire -hostages -madeleine -tentatively -conflicting -mateo -recipes -euros -ol -mercenaries -nico -##ndon -albuquerque -augmented -mythical -bel -freud -##child -cough -##lica -365 -freddy -lillian -genetically -nuremberg -calder -209 -bonn -outdoors -paste -suns -urgency -vin -restraint -tyson -##cera -##selle -barrage -bethlehem -kahn -##par -mounts -nippon -barony -happier -ryu -makeshift -sheldon -blushed -castillo -barking -listener -taped -bethel -fluent -headlines -pornography -rum -disclosure -sighing -mace -doubling -gunther -manly -##plex -rt -interventions -physiological -forwards -emerges -##tooth -##gny -compliment -rib -recession -visibly -barge -faults -connector -exquisite -prefect -##rlin -patio -##cured -elevators -brandt -italics -pena -173 -wasp -satin -ea -botswana -graceful -respectable -##jima -##rter -##oic -franciscan -generates -##dl -alfredo -disgusting -##olate -##iously -sherwood -warns -cod -promo -cheryl -sino -##ة -##escu -twitch -##zhi -brownish -thom -ortiz -##dron -densely -##beat -carmel -reinforce -##bana -187 -anastasia -downhill -vertex -contaminated -remembrance -harmonic -homework -##sol -fiancee -gears -olds -angelica -loft -ramsay -quiz -colliery -sevens -##cape -autism -##hil -walkway -##boats -ruben -abnormal -ounce -khmer -##bbe -zachary -bedside -morphology -punching -##olar -sparrow -convinces -##35 -hewitt -queer -remastered -rods -mabel -solemn -notified -lyricist -symmetric -##xide -174 -encore -passports -wildcats -##uni -baja -##pac -mildly -##ease -bleed -commodity -mounds -glossy -orchestras -##omo -damian -prelude -ambitions -##vet -awhile -remotely -##aud -asserts -imply -##iques -distinctly -modelling -remedy -##dded -windshield -dani -xiao -##endra -audible -powerplant -1300 -invalid -elemental -acquisitions -##hala -immaculate -libby -plata -smuggling -ventilation -denoted -minh -##morphism -430 -differed -dion -kelley -lore -mocking -sabbath -spikes -hygiene -drown -runoff -stylized -tally -liberated -aux -interpreter -righteous -aba -siren -reaper -pearce -millie -##cier -##yra -gaius -##iso -captures -##ttering -dorm -claudio -##sic -benches -knighted -blackness -##ored -discount -fumble -oxidation -routed -##ς -novak -perpendicular -spoiled -fracture -splits -##urt -pads -topology -##cats -axes -fortunate -offenders -protestants -esteem -221 -broadband -convened -frankly -hound -prototypes -isil -facilitated -keel -##sher -sahara -awaited -bubba -orb -prosecutors -186 -hem -520 -##xing -relaxing -remnant -romney -sorted -slalom -stefano -ulrich -##active -exemption -folder -pauses -foliage -hitchcock -epithet -204 -criticisms -##aca -ballistic -brody -hinduism -chaotic -youths -equals -##pala -pts -thicker -analogous -capitalist -improvised -overseeing -sinatra -ascended -beverage -##tl -straightforward -##kon -curran -##west -bois -325 -induce -surveying -emperors -sax -unpopular -##kk -cartoonist -fused -##mble -unto -##yuki -localities -##cko -##ln -darlington -slain -academie -lobbying -sediment -puzzles -##grass -defiance -dickens -manifest -tongues -alumnus -arbor -coincide -184 -appalachian -mustafa -examiner -cabaret -traumatic -yves -bracelet -draining -heroin -magnum -baths -odessa -consonants -mitsubishi -##gua -kellan -vaudeville -##fr -joked -null -straps -probation -##ław -ceded -interfaces -##pas -##zawa -blinding -viet -224 -rothschild -museo -640 -huddersfield -##vr -tactic -##storm -brackets -dazed -incorrectly -##vu -reg -glazed -fearful -manifold -benefited -irony -##sun -stumbling -##rte -willingness -balkans -mei -wraps -##aba -injected -##lea -gu -syed -harmless -##hammer -bray -takeoff -poppy -timor -cardboard -astronaut -purdue -weeping -southbound -cursing -stalls -diagonal -##neer -lamar -bryce -comte -weekdays -harrington -##uba -negatively -##see -lays -grouping -##cken -##henko -affirmed -halle -modernist -##lai -hodges -smelling -aristocratic -baptized -dismiss -justification -oilers -##now -coupling -qin -snack -healer -##qing -gardener -layla -battled -formulated -stephenson -gravitational -##gill -##jun -1768 -granny -coordinating -suites -##cd -##ioned -monarchs -##cote -##hips -sep -blended -apr -barrister -deposition -fia -mina -policemen -paranoid -##pressed -churchyard -covert -crumpled -creep -abandoning -tr -transmit -conceal -barr -understands -readiness -spire -##cology -##enia -##erry -610 -startling -unlock -vida -bowled -slots -##nat -##islav -spaced -trusting -admire -rig -##ink -slack -##70 -mv -207 -casualty -##wei -classmates -##odes -##rar -##rked -amherst -furnished -evolve -foundry -menace -mead -##lein -flu -wesleyan -##kled -monterey -webber -##vos -wil -##mith -##на -bartholomew -justices -restrained -##cke -amenities -191 -mediated -sewage -trenches -ml -mainz -##thus -1800s -##cula -##inski -caine -bonding -213 -converts -spheres -superseded -marianne -crypt -sweaty -ensign -historia -##br -spruce -##post -##ask -forks -thoughtfully -yukon -pamphlet -ames -##uter -karma -##yya -bryn -negotiation -sighs -incapable -##mbre -##ntial -actresses -taft -##mill -luce -prevailed -##amine -1773 -motionless -envoy -testify -investing -sculpted -instructors -provence -kali -cullen -horseback -##while -goodwin -##jos -gaa -norte -##ldon -modify -wavelength -abd -214 -skinned -sprinter -forecast -scheduling -marries -squared -tentative -##chman -boer -##isch -bolts -swap -fisherman -assyrian -impatiently -guthrie -martins -murdoch -194 -tanya -nicely -dolly -lacy -med -##45 -syn -decks -fashionable -millionaire -##ust -surfing -##ml -##ision -heaved -tammy -consulate -attendees -routinely -197 -fuse -saxophonist -backseat -malaya -##lord -scowl -tau -##ishly -193 -sighted -steaming -##rks -303 -911 -##holes -##hong -ching -##wife -bless -conserved -jurassic -stacey -unix -zion -chunk -rigorous -blaine -198 -peabody -slayer -dismay -brewers -nz -##jer -det -##glia -glover -postwar -int -penetration -sylvester -imitation -vertically -airlift -heiress -knoxville -viva -##uin -390 -macon -##rim -##fighter -##gonal -janice -##orescence -##wari -marius -belongings -leicestershire -196 -blanco -inverted -preseason -sanity -sobbing -##due -##elt -##dled -collingwood -regeneration -flickering -shortest -##mount -##osi -feminism -##lat -sherlock -cabinets -fumbled -northbound -precedent -snaps -##mme -researching -##akes -guillaume -insights -manipulated -vapor -neighbour -sap -gangster -frey -f1 -stalking -scarcely -callie -barnett -tendencies -audi -doomed -assessing -slung -panchayat -ambiguous -bartlett -##etto -distributing -violating -wolverhampton -##hetic -swami -histoire -##urus -liable -pounder -groin -hussain -larsen -popping -surprises -##atter -vie -curt -##station -mute -relocate -musicals -authorization -richter -##sef -immortality -tna -bombings -##press -deteriorated -yiddish -##acious -robbed -colchester -cs -pmid -ao -verified -balancing -apostle -swayed -recognizable -oxfordshire -retention -nottinghamshire -contender -judd -invitational -shrimp -uhf -##icient -cleaner -longitudinal -tanker -##mur -acronym -broker -koppen -sundance -suppliers -##gil -4000 -clipped -fuels -petite -##anne -landslide -helene -diversion -populous -landowners -auspices -melville -quantitative -##xes -ferries -nicky -##llus -doo -haunting -roche -carver -downed -unavailable -##pathy -approximation -hiroshima -##hue -garfield -valle -comparatively -keyboardist -traveler -##eit -congestion -calculating -subsidiaries -##bate -serb -modernization -fairies -deepened -ville -averages -##lore -inflammatory -tonga -##itch -co₂ -squads -##hea -gigantic -serum -enjoyment -retailer -verona -35th -cis -##phobic -magna -technicians -##vati -arithmetic -##sport -levin -##dation -amtrak -chow -sienna -##eyer -backstage -entrepreneurship -##otic -learnt -tao -##udy -worcestershire -formulation -baggage -hesitant -bali -sabotage -##kari -barren -enhancing -murmur -pl -freshly -putnam -syntax -aces -medicines -resentment -bandwidth -##sier -grins -chili -guido -##sei -framing -implying -gareth -lissa -genevieve -pertaining -admissions -geo -thorpe -proliferation -sato -bela -analyzing -parting -##gor -awakened -##isman -huddled -secrecy -##kling -hush -gentry -540 -dungeons -##ego -coasts -##utz -sacrificed -##chule -landowner -mutually -prevalence -programmer -adolescent -disrupted -seaside -gee -trusts -vamp -georgie -##nesian -##iol -schedules -sindh -##market -etched -hm -sparse -bey -beaux -scratching -gliding -unidentified -216 -collaborating -gems -jesuits -oro -accumulation -shaping -mbe -anal -##xin -231 -enthusiasts -newscast -##egan -janata -dewey -parkinson -179 -ankara -biennial -towering -dd -inconsistent -950 -##chet -thriving -terminate -cabins -furiously -eats -advocating -donkey -marley -muster -phyllis -leiden -##user -grassland -glittering -iucn -loneliness -217 -memorandum -armenians -##ddle -popularized -rhodesia -60s -lame -##illon -sans -bikini -header -orbits -##xx -##finger -##ulator -sharif -spines -biotechnology -strolled -naughty -yates -##wire -fremantle -milo -##mour -abducted -removes -##atin -humming -wonderland -##chrome -##ester -hume -pivotal -##rates -armand -grams -believers -elector -rte -apron -bis -scraped -##yria -endorsement -initials -##llation -eps -dotted -hints -buzzing -emigration -nearer -##tom -indicators -##ulu -coarse -neutron -protectorate -##uze -directional -exploits -pains -loire -1830s -proponents -guggenheim -rabbits -ritchie -305 -hectare -inputs -hutton -##raz -verify -##ako -boilers -longitude -##lev -skeletal -yer -emilia -citrus -compromised -##gau -pokemon -prescription -paragraph -eduard -cadillac -attire -categorized -kenyan -weddings -charley -##bourg -entertain -monmouth -##lles -nutrients -davey -mesh -incentive -practised -ecosystems -kemp -subdued -overheard -##rya -bodily -maxim -##nius -apprenticeship -ursula -##fight -lodged -rug -silesian -unconstitutional -patel -inspected -coyote -unbeaten -##hak -34th -disruption -convict -parcel -##cl -##nham -collier -implicated -mallory -##iac -##lab -susannah -winkler -##rber -shia -phelps -sediments -graphical -robotic -##sner -adulthood -mart -smoked -##isto -kathryn -clarified -##aran -divides -convictions -oppression -pausing -burying -##mt -federico -mathias -eileen -##tana -kite -hunched -##acies -189 -##atz -disadvantage -liza -kinetic -greedy -paradox -yokohama -dowager -trunks -ventured -##gement -gupta -vilnius -olaf -##thest -crimean -hopper -##ej -progressively -arturo -mouthed -arrondissement -##fusion -rubin -simulcast -oceania -##orum -##stra -##rred -busiest -intensely -navigator -cary -##vine -##hini -##bies -fife -rowe -rowland -posing -insurgents -shafts -lawsuits -activate -conor -inward -culturally -garlic -265 -##eering -eclectic -##hui -##kee -##nl -furrowed -vargas -meteorological -rendezvous -##aus -culinary -commencement -##dition -quota -##notes -mommy -salaries -overlapping -mule -##iology -##mology -sums -wentworth -##isk -##zione -mainline -subgroup -##illy -hack -plaintiff -verdi -bulb -differentiation -engagements -multinational -supplemented -bertrand -caller -regis -##naire -##sler -##arts -##imated -blossom -propagation -kilometer -viaduct -vineyards -##uate -beckett -optimization -golfer -songwriters -seminal -semitic -thud -volatile -evolving -ridley -##wley -trivial -distributions -scandinavia -jiang -##ject -wrestled -insistence -##dio -emphasizes -napkin -##ods -adjunct -rhyme -##ricted -##eti -hopeless -surrounds -tremble -32nd -smoky -##ntly -oils -medicinal -padded -steer -wilkes -219 -255 -concessions -hue -uniquely -blinded -landon -yahoo -##lane -hendrix -commemorating -dex -specify -chicks -##ggio -intercity -1400 -morley -##torm -highlighting -##oting -pang -oblique -stalled -##liner -flirting -newborn -1769 -bishopric -shaved -232 -currie -##ush -dharma -spartan -##ooped -favorites -smug -novella -sirens -abusive -creations -espana -##lage -paradigm -semiconductor -sheen -##rdo -##yen -##zak -nrl -renew -##pose -##tur -adjutant -marches -norma -##enity -ineffective -weimar -grunt -##gat -lordship -plotting -expenditure -infringement -lbs -refrain -av -mimi -mistakenly -postmaster -1771 -##bara -ras -motorsports -tito -199 -subjective -##zza -bully -stew -##kaya -prescott -1a -##raphic -##zam -bids -styling -paranormal -reeve -sneaking -exploding -katz -akbar -migrant -syllables -indefinitely -##ogical -destroys -replaces -applause -##phine -pest -##fide -218 -articulated -bertie -##thing -##cars -##ptic -courtroom -crowley -aesthetics -cummings -tehsil -hormones -titanic -dangerously -##ibe -stadion -jaenelle -auguste -ciudad -##chu -mysore -partisans -##sio -lucan -philipp -##aly -debating -henley -interiors -##rano -##tious -homecoming -beyonce -usher -henrietta -prepares -weeds -##oman -ely -plucked -##pire -##dable -luxurious -##aq -artifact -password -pasture -juno -maddy -minsk -##dder -##ologies -##rone -assessments -martian -royalist -1765 -examines -##mani -##rge -nino -223 -parry -scooped -relativity -##eli -##uting -##cao -congregational -noisy -traverse -##agawa -strikeouts -nickelodeon -obituary -transylvania -binds -depictions -polk -trolley -##yed -##lard -breeders -##under -dryly -hokkaido -1762 -strengths -stacks -bonaparte -connectivity -neared -prostitutes -stamped -anaheim -gutierrez -sinai -##zzling -bram -fresno -madhya -##86 -proton -##lena -##llum -##phon -reelected -wanda -##anus -##lb -ample -distinguishing -##yler -grasping -sermons -tomato -bland -stimulation -avenues -##eux -spreads -scarlett -fern -pentagon -assert -baird -chesapeake -ir -calmed -distortion -fatalities -##olis -correctional -pricing -##astic -##gina -prom -dammit -ying -collaborate -##chia -welterweight -33rd -pointer -substitution -bonded -umpire -communicating -multitude -paddle -##obe -federally -intimacy -##insky -betray -ssr -##lett -##lean -##lves -##therapy -airbus -##tery -functioned -ud -bearer -biomedical -netflix -##hire -##nca -condom -brink -ik -##nical -macy -##bet -flap -gma -experimented -jelly -lavender -##icles -##ulia -munro -##mian -##tial -rye -##rle -60th -gigs -hottest -rotated -predictions -fuji -bu -##erence -##omi -barangay -##fulness -##sas -clocks -##rwood -##liness -cereal -roe -wight -decker -uttered -babu -onion -xml -forcibly -##df -petra -sarcasm -hartley -peeled -storytelling -##42 -##xley -##ysis -##ffa -fibre -kiel -auditor -fig -harald -greenville -##berries -geographically -nell -quartz -##athic -cemeteries -##lr -crossings -nah -holloway -reptiles -chun -sichuan -snowy -660 -corrections -##ivo -zheng -ambassadors -blacksmith -fielded -fluids -hardcover -turnover -medications -melvin -academies -##erton -ro -roach -absorbing -spaniards -colton -##founded -outsider -espionage -kelsey -245 -edible -##ulf -dora -establishes -##sham -##tries -contracting -##tania -cinematic -costello -nesting -##uron -connolly -duff -##nology -mma -##mata -fergus -sexes -gi -optics -spectator -woodstock -banning -##hee -##fle -differentiate -outfielder -refinery -226 -312 -gerhard -horde -lair -drastically -##udi -landfall -##cheng -motorsport -odi -##achi -predominant -quay -skins -##ental -edna -harshly -complementary -murdering -##aves -wreckage -##90 -ono -outstretched -lennox -munitions -galen -reconcile -470 -scalp -bicycles -gillespie -questionable -rosenberg -guillermo -hostel -jarvis -kabul -volvo -opium -yd -##twined -abuses -decca -outpost -##cino -sensible -neutrality -##64 -ponce -anchorage -atkins -turrets -inadvertently -disagree -libre -vodka -reassuring -weighs -##yal -glide -jumper -ceilings -repertory -outs -stain -##bial -envy -##ucible -smashing -heightened -policing -hyun -mixes -lai -prima -##ples -celeste -##bina -lucrative -intervened -kc -manually -##rned -stature -staffed -bun -bastards -nairobi -priced -##auer -thatcher -##kia -tripped -comune -##ogan -##pled -brasil -incentives -emanuel -hereford -musica -##kim -benedictine -biennale -##lani -eureka -gardiner -rb -knocks -sha -##ael -##elled -##onate -efficacy -ventura -masonic -sanford -maize -leverage -##feit -capacities -santana -##aur -novelty -vanilla -##cter -##tour -benin -##oir -##rain -neptune -drafting -tallinn -##cable -humiliation -##boarding -schleswig -fabian -bernardo -liturgy -spectacle -sweeney -pont -routledge -##tment -cosmos -ut -hilt -sleek -universally -##eville -##gawa -typed -##dry -favors -allegheny -glaciers -##rly -recalling -aziz -##log -parasite -requiem -auf -##berto -##llin -illumination -##breaker -##issa -festivities -bows -govern -vibe -vp -333 -sprawled -larson -pilgrim -bwf -leaping -##rts -##ssel -alexei -greyhound -hoarse -##dler -##oration -seneca -##cule -gaping -##ulously -##pura -cinnamon -##gens -##rricular -craven -fantasies -houghton -engined -reigned -dictator -supervising -##oris -bogota -commentaries -unnatural -fingernails -spirituality -tighten -##tm -canadiens -protesting -intentional -cheers -sparta -##ytic -##iere -##zine -widen -belgarath -controllers -dodd -iaaf -navarre -##ication -defect -squire -steiner -whisky -##mins -560 -inevitably -tome -##gold -chew -##uid -##lid -elastic -##aby -streaked -alliances -jailed -regal -##ined -##phy -czechoslovak -narration -absently -##uld -bluegrass -guangdong -quran -criticizing -hose -hari -##liest -##owa -skier -streaks -deploy -##lom -raft -bose -dialed -huff -##eira -haifa -simplest -bursting -endings -ib -sultanate -##titled -franks -whitman -ensures -sven -##ggs -collaborators -forster -organising -ui -banished -napier -injustice -teller -layered -thump -##otti -roc -battleships -evidenced -fugitive -sadie -robotics -##roud -equatorial -geologist -##iza -yielding -##bron -##sr -internationale -mecca -##diment -sbs -skyline -toad -uploaded -reflective -undrafted -lal -leafs -bayern -##dai -lakshmi -shortlisted -##stick -##wicz -camouflage -donate -af -christi -lau -##acio -disclosed -nemesis -1761 -assemble -straining -northamptonshire -tal -##asi -bernardino -premature -heidi -42nd -coefficients -galactic -reproduce -buzzed -sensations -zionist -monsieur -myrtle -##eme -archery -strangled -musically -viewpoint -antiquities -bei -trailers -seahawks -cured -pee -preferring -tasmanian -lange -sul -##mail -##working -colder -overland -lucivar -massey -gatherings -haitian -##smith -disapproval -flaws -##cco -##enbach -1766 -npr -##icular -boroughs -creole -forums -techno -1755 -dent -abdominal -streetcar -##eson -##stream -procurement -gemini -predictable -##tya -acheron -christoph -feeder -fronts -vendor -bernhard -jammu -tumors -slang -##uber -goaltender -twists -curving -manson -vuelta -mer -peanut -confessions -pouch -unpredictable -allowance -theodor -vascular -##factory -bala -authenticity -metabolic -coughing -nanjing -##cea -pembroke -##bard -splendid -36th -ff -hourly -##ahu -elmer -handel -##ivate -awarding -thrusting -dl -experimentation -##hesion -##46 -caressed -entertained -steak -##rangle -biologist -orphans -baroness -oyster -stepfather -##dridge -mirage -reefs -speeding -##31 -barons -1764 -227 -inhabit -preached -repealed -##tral -honoring -boogie -captives -administer -johanna -##imate -gel -suspiciously -1767 -sobs -##dington -backbone -hayward -garry -##folding -##nesia -maxi -##oof -##ppe -ellison -galileo -##stand -crimea -frenzy -amour -bumper -matrices -natalia -baking -garth -palestinians -##grove -smack -conveyed -ensembles -gardening -##manship -##rup -##stituting -1640 -harvesting -topography -jing -shifters -dormitory -##carriage -##lston -ist -skulls -##stadt -dolores -jewellery -sarawak -##wai -##zier -fences -christy -confinement -tumbling -credibility -fir -stench -##bria -##plication -##nged -##sam -virtues -##belt -marjorie -pba -##eem -##made -celebrates -schooner -agitated -barley -fulfilling -anthropologist -##pro -restrict -novi -regulating -##nent -padres -##rani -##hesive -loyola -tabitha -milky -olson -proprietor -crambidae -guarantees -intercollegiate -ljubljana -hilda -##sko -ignorant -hooded -##lts -sardinia -##lidae -##vation -frontman -privileged -witchcraft -##gp -jammed -laude -poking -##than -bracket -amazement -yunnan -##erus -maharaja -linnaeus -264 -commissioning -milano -peacefully -##logies -akira -rani -regulator -##36 -grasses -##rance -luzon -crows -compiler -gretchen -seaman -edouard -tab -buccaneers -ellington -hamlets -whig -socialists -##anto -directorial -easton -mythological -##kr -##vary -rhineland -semantic -taut -dune -inventions -succeeds -##iter -replication -branched -##pired -jul -prosecuted -kangaroo -penetrated -##avian -middlesbrough -doses -bleak -madam -predatory -relentless -##vili -reluctance -##vir -hailey -crore -silvery -1759 -monstrous -swimmers -transmissions -hawthorn -informing -##eral -toilets -caracas -crouch -kb -##sett -295 -cartel -hadley -##aling -alexia -yvonne -##biology -cinderella -eton -superb -blizzard -stabbing -industrialist -maximus -##gm -##orus -groves -maud -clade -oversized -comedic -##bella -rosen -nomadic -fulham -montane -beverages -galaxies -redundant -swarm -##rot -##folia -##llis -buckinghamshire -fen -bearings -bahadur -##rom -gilles -phased -dynamite -faber -benoit -vip -##ount -##wd -booking -fractured -tailored -anya -spices -westwood -cairns -auditions -inflammation -steamed -##rocity -##acion -##urne -skyla -thereof -watford -torment -archdeacon -transforms -lulu -demeanor -fucked -serge -##sor -mckenna -minas -entertainer -##icide -caress -originate -residue -##sty -1740 -##ilised -##org -beech -##wana -subsidies -##ghton -emptied -gladstone -ru -firefighters -voodoo -##rcle -het -nightingale -tamara -edmond -ingredient -weaknesses -silhouette -285 -compatibility -withdrawing -hampson -##mona -anguish -giggling -##mber -bookstore -##jiang -southernmost -tilting -##vance -bai -economical -rf -briefcase -dreadful -hinted -projections -shattering -totaling -##rogate -analogue -indicted -periodical -fullback -##dman -haynes -##tenberg -##ffs -##ishment -1745 -thirst -stumble -penang -vigorous -##ddling -##kor -##lium -octave -##ove -##enstein -##inen -##ones -siberian -##uti -cbn -repeal -swaying -##vington -khalid -tanaka -unicorn -otago -plastered -lobe -riddle -##rella -perch -##ishing -croydon -filtered -graeme -tripoli -##ossa -crocodile -##chers -sufi -mined -##tung -inferno -lsu -##phi -swelled -utilizes -£2 -cale -periodicals -styx -hike -informally -coop -lund -##tidae -ala -hen -qui -transformations -disposed -sheath -chickens -##cade -fitzroy -sas -silesia -unacceptable -odisha -1650 -sabrina -pe -spokane -ratios -athena -massage -shen -dilemma -##drum -##riz -##hul -corona -doubtful -niall -##pha -##bino -fines -cite -acknowledging -bangor -ballard -bathurst -##resh -huron -mustered -alzheimer -garments -kinase -tyre -warship -##cp -flashback -pulmonary -braun -cheat -kamal -cyclists -constructions -grenades -ndp -traveller -excuses -stomped -signalling -trimmed -futsal -mosques -relevance -##wine -wta -##23 -##vah -##lter -hoc -##riding -optimistic -##´s -deco -sim -interacting -rejecting -moniker -waterways -##ieri -##oku -mayors -gdansk -outnumbered -pearls -##ended -##hampton -fairs -totals -dominating -262 -notions -stairway -compiling -pursed -commodities -grease -yeast -##jong -carthage -griffiths -residual -amc -contraction -laird -sapphire -##marine -##ivated -amalgamation -dissolve -inclination -lyle -packaged -altitudes -suez -canons -graded -lurched -narrowing -boasts -guise -wed -enrico -##ovsky -rower -scarred -bree -cub -iberian -protagonists -bargaining -proposing -trainers -voyages -vans -fishes -##aea -##ivist -##verance -encryption -artworks -kazan -sabre -cleopatra -hepburn -rotting -supremacy -mecklenburg -##brate -burrows -hazards -outgoing -flair -organizes -##ctions -scorpion -##usions -boo -234 -chevalier -dunedin -slapping -##34 -ineligible -pensions -##38 -##omic -manufactures -emails -bismarck -238 -weakening -blackish -ding -mcgee -quo -##rling -northernmost -xx -manpower -greed -sampson -clicking -##ange -##horpe -##inations -##roving -torre -##eptive -##moral -symbolism -38th -asshole -meritorious -outfits -splashed -biographies -sprung -astros -##tale -302 -737 -filly -raoul -nw -tokugawa -linden -clubhouse -##apa -tracts -romano -##pio -putin -tags -##note -chained -dickson -gunshot -moe -gunn -rashid -##tails -zipper -##bas -##nea -contrasted -##ply -##udes -plum -pharaoh -##pile -aw -comedies -ingrid -sandwiches -subdivisions -1100 -mariana -nokia -kamen -hz -delaney -veto -herring -##words -possessive -outlines -##roup -siemens -stairwell -rc -gallantry -messiah -palais -yells -233 -zeppelin -##dm -bolivar -##cede -smackdown -mckinley -##mora -##yt -muted -geologic -finely -unitary -avatar -hamas -maynard -rees -bog -contrasting -##rut -liv -chico -disposition -pixel -##erate -becca -dmitry -yeshiva -narratives -##lva -##ulton -mercenary -sharpe -tempered -navigate -stealth -amassed -keynes -##lini -untouched -##rrie -havoc -lithium -##fighting -abyss -graf -southward -wolverine -balloons -implements -ngos -transitions -##icum -ambushed -concacaf -dormant -economists -##dim -costing -csi -rana -universite -boulders -verity -##llon -collin -mellon -misses -cypress -fluorescent -lifeless -spence -##ulla -crewe -shepard -pak -revelations -##م -jolly -gibbons -paw -##dro -##quel -freeing -##test -shack -fries -palatine -##51 -##hiko -accompaniment -cruising -recycled -##aver -erwin -sorting -synthesizers -dyke -realities -sg -strides -enslaved -wetland -##ghan -competence -gunpowder -grassy -maroon -reactors -objection -##oms -carlson -gearbox -macintosh -radios -shelton -##sho -clergyman -prakash -254 -mongols -trophies -oricon -228 -stimuli -twenty20 -cantonese -cortes -mirrored -##saurus -bhp -cristina -melancholy -##lating -enjoyable -nuevo -##wny -downfall -schumacher -##ind -banging -lausanne -rumbled -paramilitary -reflex -ax -amplitude -migratory -##gall -##ups -midi -barnard -lastly -sherry -##hp -##nall -keystone -##kra -carleton -slippery -##53 -coloring -foe -socket -otter -##rgos -mats -##tose -consultants -bafta -bison -topping -##km -490 -primal -abandonment -transplant -atoll -hideous -mort -pained -reproduced -tae -howling -##turn -unlawful -billionaire -hotter -poised -lansing -##chang -dinamo -retro -messing -nfc -domesday -##mina -blitz -timed -##athing -##kley -ascending -gesturing -##izations -signaled -tis -chinatown -mermaid -savanna -jameson -##aint -catalina -##pet -##hers -cochrane -cy -chatting -##kus -alerted -computation -mused -noelle -majestic -mohawk -campo -octagonal -##sant -##hend -241 -aspiring -##mart -comprehend -iona -paralyzed -shimmering -swindon -rhone -##eley -reputed -configurations -pitchfork -agitation -francais -gillian -lipstick -##ilo -outsiders -pontifical -resisting -bitterness -sewer -rockies -##edd -##ucher -misleading -1756 -exiting -galloway -##nging -risked -##heart -246 -commemoration -schultz -##rka -integrating -##rsa -poses -shrieked -##weiler -guineas -gladys -jerking -owls -goldsmith -nightly -penetrating -##unced -lia -##33 -ignited -betsy -##aring -##thorpe -follower -vigorously -##rave -coded -kiran -knit -zoology -tbilisi -##28 -##bered -repository -govt -deciduous -dino -growling -##bba -enhancement -unleashed -chanting -pussy -biochemistry -##eric -kettle -repression -toxicity -nrhp -##arth -##kko -##bush -ernesto -commended -outspoken -242 -mca -parchment -sms -kristen -##aton -bisexual -raked -glamour -navajo -a2 -conditioned -showcased -##hma -spacious -youthful -##esa -usl -appliances -junta -brest -layne -conglomerate -enchanted -chao -loosened -picasso -circulating -inspect -montevideo -##centric -##kti -piazza -spurred -##aith -bari -freedoms -poultry -stamford -lieu -##ect -indigo -sarcastic -bahia -stump -attach -dvds -frankenstein -lille -approx -scriptures -pollen -##script -nmi -overseen -##ivism -tides -proponent -newmarket -inherit -milling -##erland -centralized -##rou -distributors -credentials -drawers -abbreviation -##lco -##xon -downing -uncomfortably -ripe -##oes -erase -franchises -##ever -populace -##bery -##khar -decomposition -pleas -##tet -daryl -sabah -##stle -##wide -fearless -genie -lesions -annette -##ogist -oboe -appendix -nair -dripped -petitioned -maclean -mosquito -parrot -rpg -hampered -1648 -operatic -reservoirs -##tham -irrelevant -jolt -summarized -##fp -medallion -##taff -##− -clawed -harlow -narrower -goddard -marcia -bodied -fremont -suarez -altering -tempest -mussolini -porn -##isms -sweetly -oversees -walkers -solitude -grimly -shrines -hk -ich -supervisors -hostess -dietrich -legitimacy -brushes -expressive -##yp -dissipated -##rse -localized -systemic -##nikov -gettysburg -##js -##uaries -dialogues -muttering -251 -housekeeper -sicilian -discouraged -##frey -beamed -kaladin -halftime -kidnap -##amo -##llet -1754 -synonymous -depleted -instituto -insulin -reprised -##opsis -clashed -##ctric -interrupting -radcliffe -insisting -medici -1715 -ejected -playfully -turbulent -##47 -starvation -##rini -shipment -rebellious -petersen -verification -merits -##rified -cakes -##charged -1757 -milford -shortages -spying -fidelity -##aker -emitted -storylines -harvested -seismic -##iform -cheung -kilda -theoretically -barbie -lynx -##rgy -##tius -goblin -mata -poisonous -##nburg -reactive -residues -obedience -##евич -conjecture -##rac -401 -hating -sixties -kicker -moaning -motown -##bha -emancipation -neoclassical -##hering -consoles -ebert -professorship -##tures -sustaining -assaults -obeyed -affluent -incurred -tornadoes -##eber -##zow -emphasizing -highlanders -cheated -helmets -##ctus -internship -terence -bony -executions -legislators -berries -peninsular -tinged -##aco -1689 -amplifier -corvette -ribbons -lavish -pennant -##lander -worthless -##chfield -##forms -mariano -pyrenees -expenditures -##icides -chesterfield -mandir -tailor -39th -sergey -nestled -willed -aristocracy -devotees -goodnight -raaf -rumored -weaponry -remy -appropriations -harcourt -burr -riaa -##lence -limitation -unnoticed -guo -soaking -swamps -##tica -collapsing -tatiana -descriptive -brigham -psalm -##chment -maddox -##lization -patti -caliph -##aja -akron -injuring -serra -##ganj -basins -##sari -astonished -launcher -##church -hilary -wilkins -sewing -##sf -stinging -##fia -##ncia -underwood -startup -##ition -compilations -vibrations -embankment -jurist -##nity -bard -juventus -groundwater -kern -palaces -helium -boca -cramped -marissa -soto -##worm -jae -princely -##ggy -faso -bazaar -warmly -##voking -229 -pairing -##lite -##grate -##nets -wien -freaked -ulysses -rebirth -##alia -##rent -mummy -guzman -jimenez -stilled -##nitz -trajectory -tha -woken -archival -professions -##pts -##pta -hilly -shadowy -shrink -##bolt -norwood -glued -migrate -stereotypes -devoid -##pheus -625 -evacuate -horrors -infancy -gotham -knowles -optic -downloaded -sachs -kingsley -parramatta -darryl -mor -##onale -shady -commence -confesses -kan -##meter -##placed -marlborough -roundabout -regents -frigates -io -##imating -gothenburg -revoked -carvings -clockwise -convertible -intruder -##sche -banged -##ogo -vicky -bourgeois -##mony -dupont -footing -##gum -pd -##real -buckle -yun -penthouse -sane -720 -serviced -stakeholders -neumann -bb -##eers -comb -##gam -catchment -pinning -rallies -typing -##elles -forefront -freiburg -sweetie -giacomo -widowed -goodwill -worshipped -aspirations -midday -##vat -fishery -##trick -bournemouth -turk -243 -hearth -ethanol -guadalajara -murmurs -sl -##uge -afforded -scripted -##hta -wah -##jn -coroner -translucent -252 -memorials -puck -progresses -clumsy -##race -315 -candace -recounted -##27 -##slin -##uve -filtering -##mac -howl -strata -heron -leveled -##ays -dubious -##oja -##т -##wheel -citations -exhibiting -##laya -##mics -##pods -turkic -##lberg -injunction -##ennial -##mit -antibodies -##44 -organise -##rigues -cardiovascular -cushion -inverness -##zquez -dia -cocoa -sibling -##tman -##roid -expanse -feasible -tunisian -algiers -##relli -rus -bloomberg -dso -westphalia -bro -tacoma -281 -downloads -##ours -konrad -duran -##hdi -continuum -jett -compares -legislator -secession -##nable -##gues -##zuka -translating -reacher -##gley -##ła -aleppo -##agi -tc -orchards -trapping -linguist -versatile -drumming -postage -calhoun -superiors -##mx -barefoot -leary -##cis -ignacio -alfa -kaplan -##rogen -bratislava -mori -##vot -disturb -haas -313 -cartridges -gilmore -radiated -salford -tunic -hades -##ulsive -archeological -delilah -magistrates -auditioned -brewster -charters -empowerment -blogs -cappella -dynasties -iroquois -whipping -##krishna -raceway -truths -myra -weaken -judah -mcgregor -##horse -mic -refueling -37th -burnley -bosses -markus -premio -query -##gga -dunbar -##economic -darkest -lyndon -sealing -commendation -reappeared -##mun -addicted -ezio -slaughtered -satisfactory -shuffle -##eves -##thic -##uj -fortification -warrington -##otto -resurrected -fargo -mane -##utable -##lei -##space -foreword -ox -##aris -##vern -abrams -hua -##mento -sakura -##alo -uv -sentimental -##skaya -midfield -##eses -sturdy -scrolls -macleod -##kyu -entropy -##lance -mitochondrial -cicero -excelled -thinner -convoys -perceive -##oslav -##urable -systematically -grind -burkina -287 -##tagram -ops -##aman -guantanamo -##cloth -##tite -forcefully -wavy -##jou -pointless -##linger -##tze -layton -portico -superficial -clerical -outlaws -##hism -burials -muir -##inn -creditors -hauling -rattle -##leg -calais -monde -archers -reclaimed -dwell -wexford -hellenic -falsely -remorse -##tek -dough -furnishings -##uttered -gabon -neurological -novice -##igraphy -contemplated -pulpit -nightstand -saratoga -##istan -documenting -pulsing -taluk -##firmed -busted -marital -##rien -disagreements -wasps -##yes -hodge -mcdonnell -mimic -fran -pendant -dhabi -musa -##nington -congratulations -argent -darrell -concussion -losers -regrets -thessaloniki -reversal -donaldson -hardwood -thence -achilles -ritter -##eran -demonic -jurgen -prophets -goethe -eki -classmate -buff -##cking -yank -irrational -##inging -perished -seductive -qur -sourced -##crat -##typic -mustard -ravine -barre -horizontally -characterization -phylogenetic -boise -##dit -##runner -##tower -brutally -intercourse -seduce -##bbing -fay -ferris -ogden -amar -nik -unarmed -##inator -evaluating -kyrgyzstan -sweetness -##lford -##oki -mccormick -meiji -notoriety -stimulate -disrupt -figuring -instructional -mcgrath -##zoo -groundbreaking -##lto -flinch -khorasan -agrarian -bengals -mixer -radiating -##sov -ingram -pitchers -nad -tariff -##cript -tata -##codes -##emi -##ungen -appellate -lehigh -##bled -##giri -brawl -duct -texans -##ciation -##ropolis -skipper -speculative -vomit -doctrines -stresses -253 -davy -graders -whitehead -jozef -timely -cumulative -haryana -paints -appropriately -boon -cactus -##ales -##pid -dow -legions -##pit -perceptions -1730 -picturesque -##yse -periphery -rune -wr -##aha -celtics -sentencing -whoa -##erin -confirms -variance -425 -moines -mathews -spade -rave -m1 -fronted -fx -blending -alleging -reared -##gl -237 -##paper -grassroots -eroded -##free -##physical -directs -ordeal -##sław -accelerate -hacker -rooftop -##inia -lev -buys -cebu -devote -##lce -specialising -##ulsion -choreographed -repetition -warehouses -##ryl -paisley -tuscany -analogy -sorcerer -hash -huts -shards -descends -exclude -nix -chaplin -gaga -ito -vane -##drich -causeway -misconduct -limo -orchestrated -glands -jana -##kot -u2 -##mple -##sons -branching -contrasts -scoop -longed -##virus -chattanooga -##75 -syrup -cornerstone -##tized -##mind -##iaceae -careless -precedence -frescoes -##uet -chilled -consult -modelled -snatch -peat -##thermal -caucasian -humane -relaxation -spins -temperance -##lbert -occupations -lambda -hybrids -moons -mp3 -##oese -247 -rolf -societal -yerevan -ness -##ssler -befriended -mechanized -nominate -trough -boasted -cues -seater -##hom -bends -##tangle -conductors -emptiness -##lmer -eurasian -adriatic -tian -##cie -anxiously -lark -propellers -chichester -jock -ev -2a -##holding -credible -recounts -tori -loyalist -abduction -##hoot -##redo -nepali -##mite -ventral -tempting -##ango -##crats -steered -##wice -javelin -dipping -laborers -prentice -looming -titanium -##ː -badges -emir -tensor -##ntation -egyptians -rash -denies -hawthorne -lombard -showers -wehrmacht -dietary -trojan -##reus -welles -executing -horseshoe -lifeboat -##lak -elsa -infirmary -nearing -roberta -boyer -mutter -trillion -joanne -##fine -##oked -sinks -vortex -uruguayan -clasp -sirius -##block -accelerator -prohibit -sunken -byu -chronological -diplomats -ochreous -510 -symmetrical -1644 -maia -##tology -salts -reigns -atrocities -##ия -hess -bared -issn -##vyn -cater -saturated -##cycle -##isse -sable -voyager -dyer -yusuf -##inge -fountains -wolff -##39 -##nni -engraving -rollins -atheist -ominous -##ault -herr -chariot -martina -strung -##fell -##farlane -horrific -sahib -gazes -saetan -erased -ptolemy -##olic -flushing -lauderdale -analytic -##ices -530 -navarro -beak -gorilla -herrera -broom -guadalupe -raiding -sykes -311 -bsc -deliveries -1720 -invasions -carmichael -tajikistan -thematic -ecumenical -sentiments -onstage -##rians -##brand -##sume -catastrophic -flanks -molten -##arns -waller -aimee -terminating -##icing -alternately -##oche -nehru -printers -outraged -##eving -empires -template -banners -repetitive -za -##oise -vegetarian -##tell -guiana -opt -cavendish -lucknow -synthesized -##hani -##mada -finalized -##ctable -fictitious -mayoral -unreliable -##enham -embracing -peppers -rbis -##chio -##neo -inhibition -slashed -togo -orderly -embroidered -safari -salty -236 -barron -benito -totaled -##dak -pubs -simulated -caden -devin -tolkien -momma -welding -sesame -##ept -gottingen -hardness -630 -shaman -temeraire -620 -adequately -pediatric -##kit -ck -assertion -radicals -composure -cadence -seafood -beaufort -lazarus -mani -warily -cunning -kurdistan -249 -cantata -##kir -ares -##41 -##clusive -nape -townland -geared -insulted -flutter -boating -violate -draper -dumping -malmo -##hh -##romatic -firearm -alta -bono -obscured -##clave -exceeds -panorama -unbelievable -##train -preschool -##essed -disconnected -installing -rescuing -secretaries -accessibility -##castle -##drive -##ifice -##film -bouts -slug -waterway -mindanao -##buro -##ratic -halves -##ل -calming -liter -maternity -adorable -bragg -electrification -mcc -##dote -roxy -schizophrenia -##body -munoz -kaye -whaling -239 -mil -tingling -tolerant -##ago -unconventional -volcanoes -##finder -deportivo -##llie -robson -kaufman -neuroscience -wai -deportation -masovian -scraping -converse -##bh -hacking -bulge -##oun -administratively -yao -580 -amp -mammoth -booster -claremont -hooper -nomenclature -pursuits -mclaughlin -melinda -##sul -catfish -barclay -substrates -taxa -zee -originals -kimberly -packets -padma -##ality -borrowing -ostensibly -solvent -##bri -##genesis -##mist -lukas -shreveport -veracruz -##ь -##lou -##wives -cheney -tt -anatolia -hobbs -##zyn -cyclic -radiant -alistair -greenish -siena -dat -independents -##bation -conform -pieter -hyper -applicant -bradshaw -spores -telangana -vinci -inexpensive -nuclei -322 -jang -nme -soho -spd -##ign -cradled -receptionist -pow -##43 -##rika -fascism -##ifer -experimenting -##ading -##iec -##region -345 -jocelyn -maris -stair -nocturnal -toro -constabulary -elgin -##kker -msc -##giving -##schen -##rase -doherty -doping -sarcastically -batter -maneuvers -##cano -##apple -##gai -##git -intrinsic -##nst -##stor -1753 -showtime -cafes -gasps -lviv -ushered -##thed -fours -restart -astonishment -transmitting -flyer -shrugs -##sau -intriguing -cones -dictated -mushrooms -medial -##kovsky -##elman -escorting -gaped -##26 -godfather -##door -##sell -djs -recaptured -timetable -vila -1710 -3a -aerodrome -mortals -scientology -##orne -angelina -mag -convection -unpaid -insertion -intermittent -lego -##nated -endeavor -kota -pereira -##lz -304 -bwv -glamorgan -insults -agatha -fey -##cend -fleetwood -mahogany -protruding -steamship -zeta -##arty -mcguire -suspense -##sphere -advising -urges -##wala -hurriedly -meteor -gilded -inline -arroyo -stalker -##oge -excitedly -revered -##cure -earle -introductory -##break -##ilde -mutants -puff -pulses -reinforcement -##haling -curses -lizards -stalk -correlated -##fixed -fallout -macquarie -##unas -bearded -denton -heaving -802 -##ocation -winery -assign -dortmund -##lkirk -everest -invariant -charismatic -susie -##elling -bled -lesley -telegram -sumner -bk -##ogen -##к -wilcox -needy -colbert -duval -##iferous -##mbled -allotted -attends -imperative -##hita -replacements -hawker -##inda -insurgency -##zee -##eke -casts -##yla -680 -ives -transitioned -##pack -##powering -authoritative -baylor -flex -cringed -plaintiffs -woodrow -##skie -drastic -ape -aroma -unfolded -commotion -nt -preoccupied -theta -routines -lasers -privatization -wand -domino -ek -clenching -nsa -strategically -showered -bile -handkerchief -pere -storing -christophe -insulting -316 -nakamura -romani -asiatic -magdalena -palma -cruises -stripping -405 -konstantin -soaring -##berman -colloquially -forerunner -havilland -incarcerated -parasites -sincerity -##utus -disks -plank -saigon -##ining -corbin -homo -ornaments -powerhouse -##tlement -chong -fastened -feasibility -idf -morphological -usable -##nish -##zuki -aqueduct -jaguars -keepers -##flies -aleksandr -faust -assigns -ewing -bacterium -hurled -tricky -hungarians -integers -wallis -321 -yamaha -##isha -hushed -oblivion -aviator -evangelist -friars -##eller -monograph -ode -##nary -airplanes -labourers -charms -##nee -1661 -hagen -tnt -rudder -fiesta -transcript -dorothea -ska -inhibitor -maccabi -retorted -raining -encompassed -clauses -menacing -1642 -lineman -##gist -vamps -##ape -##dick -gloom -##rera -dealings -easing -seekers -##nut -##pment -helens -unmanned -##anu -##isson -basics -##amy -##ckman -adjustments -1688 -brutality -horne -##zell -sui -##55 -##mable -aggregator -##thal -rhino -##drick -##vira -counters -zoom -##01 -##rting -mn -montenegrin -packard -##unciation -##♭ -##kki -reclaim -scholastic -thugs -pulsed -##icia -syriac -quan -saddam -banda -kobe -blaming -buddies -dissent -##lusion -##usia -corbett -jaya -delle -erratic -lexie -##hesis -435 -amiga -hermes -##pressing -##leen -chapels -gospels -jamal -##uating -compute -revolving -warp -##sso -##thes -armory -##eras -##gol -antrim -loki -##kow -##asian -##good -##zano -braid -handwriting -subdistrict -funky -pantheon -##iculate -concurrency -estimation -improper -juliana -##his -newcomers -johnstone -staten -communicated -##oco -##alle -sausage -stormy -##stered -##tters -superfamily -##grade -acidic -collateral -tabloid -##oped -##rza -bladder -austen -##ellant -mcgraw -##hay -hannibal -mein -aquino -lucifer -wo -badger -boar -cher -christensen -greenberg -interruption -##kken -jem -244 -mocked -bottoms -cambridgeshire -##lide -sprawling -##bbly -eastwood -ghent -synth -##buck -advisers -##bah -nominally -hapoel -qu -daggers -estranged -fabricated -towels -vinnie -wcw -misunderstanding -anglia -nothin -unmistakable -##dust -##lova -chilly -marquette -truss -##edge -##erine -reece -##lty -##chemist -##connected -272 -308 -41st -bash -raion -waterfalls -##ump -##main -labyrinth -queue -theorist -##istle -bharatiya -flexed -soundtracks -rooney -leftist -patrolling -wharton -plainly -alleviate -eastman -schuster -topographic -engages -immensely -unbearable -fairchild -1620 -dona -lurking -parisian -oliveira -ia -indictment -hahn -bangladeshi -##aster -vivo -##uming -##ential -antonia -expects -indoors -kildare -harlan -##logue -##ogenic -##sities -forgiven -##wat -childish -tavi -##mide -##orra -plausible -grimm -successively -scooted -##bola -##dget -##rith -spartans -emery -flatly -azure -epilogue -##wark -flourish -##iny -##tracted -##overs -##oshi -bestseller -distressed -receipt -spitting -hermit -topological -##cot -drilled -subunit -francs -##layer -eel -##fk -##itas -octopus -footprint -petitions -ufo -##say -##foil -interfering -leaking -palo -##metry -thistle -valiant -##pic -narayan -mcpherson -##fast -gonzales -##ym -##enne -dustin -novgorod -solos -##zman -doin -##raph -##patient -##meyer -soluble -ashland -cuffs -carole -pendleton -whistling -vassal -##river -deviation -revisited -constituents -rallied -rotate -loomed -##eil -##nting -amateurs -augsburg -auschwitz -crowns -skeletons -##cona -bonnet -257 -dummy -globalization -simeon -sleeper -mandal -differentiated -##crow -##mare -milne -bundled -exasperated -talmud -owes -segregated -##feng -##uary -dentist -piracy -props -##rang -devlin -##torium -malicious -paws -##laid -dependency -##ergy -##fers -##enna -258 -pistons -rourke -jed -grammatical -tres -maha -wig -512 -ghostly -jayne -##achal -##creen -##ilis -##lins -##rence -designate -##with -arrogance -cambodian -clones -showdown -throttle -twain -##ception -lobes -metz -nagoya -335 -braking -##furt -385 -roaming -##minster -amin -crippled -##37 -##llary -indifferent -hoffmann -idols -intimidating -1751 -261 -influenza -memo -onions -1748 -bandage -consciously -##landa -##rage -clandestine -observes -swiped -tangle -##ener -##jected -##trum -##bill -##lta -hugs -congresses -josiah -spirited -##dek -humanist -managerial -filmmaking -inmate -rhymes -debuting -grimsby -ur -##laze -duplicate -vigor -##tf -republished -bolshevik -refurbishment -antibiotics -martini -methane -newscasts -royale -horizons -levant -iain -visas -##ischen -paler -##around -manifestation -snuck -alf -chop -futile -pedestal -rehab -##kat -bmg -kerman -res -fairbanks -jarrett -abstraction -saharan -##zek -1746 -procedural -clearer -kincaid -sash -luciano -##ffey -crunch -helmut -##vara -revolutionaries -##tute -creamy -leach -##mmon -1747 -permitting -nes -plight -wendell -##lese -contra -ts -clancy -ipa -mach -staples -autopsy -disturbances -nueva -karin -pontiac -##uding -proxy -venerable -haunt -leto -bergman -expands -##helm -wal -##pipe -canning -celine -cords -obesity -##enary -intrusion -planner -##phate -reasoned -sequencing -307 -harrow -##chon -##dora -marred -mcintyre -repay -tarzan -darting -248 -harrisburg -margarita -repulsed -##hur -##lding -belinda -hamburger -novo -compliant -runways -bingham -registrar -skyscraper -ic -cuthbert -improvisation -livelihood -##corp -##elial -admiring -##dened -sporadic -believer -casablanca -popcorn -##29 -asha -shovel -##bek -##dice -coiled -tangible -##dez -casper -elsie -resin -tenderness -rectory -##ivision -avail -sonar -##mori -boutique -##dier -guerre -bathed -upbringing -vaulted -sandals -blessings -##naut -##utnant -1680 -306 -foxes -pia -corrosion -hesitantly -confederates -crystalline -footprints -shapiro -tirana -valentin -drones -45th -microscope -shipments -texted -inquisition -wry -guernsey -unauthorized -resigning -760 -ripple -schubert -stu -reassure -felony -##ardo -brittle -koreans -##havan -##ives -dun -implicit -tyres -##aldi -##lth -magnolia -##ehan -##puri -##poulos -aggressively -fei -gr -familiarity -##poo -indicative -##trust -fundamentally -jimmie -overrun -395 -anchors -moans -##opus -britannia -armagh -##ggle -purposely -seizing -##vao -bewildered -mundane -avoidance -cosmopolitan -geometridae -quartermaster -caf -415 -chatter -engulfed -gleam -purge -##icate -juliette -jurisprudence -guerra -revisions -##bn -casimir -brew -##jm -1749 -clapton -cloudy -conde -hermitage -278 -simulations -torches -vincenzo -matteo -##rill -hidalgo -booming -westbound -accomplishment -tentacles -unaffected -##sius -annabelle -flopped -sloping -##litz -dreamer -interceptor -vu -##loh -consecration -copying -messaging -breaker -climates -hospitalized -1752 -torino -afternoons -winfield -witnessing -##teacher -breakers -choirs -sawmill -coldly -##ege -sipping -haste -uninhabited -conical -bibliography -pamphlets -severn -edict -##oca -deux -illnesses -grips -##pl -rehearsals -sis -thinkers -tame -##keepers -1690 -acacia -reformer -##osed -##rys -shuffling -##iring -##shima -eastbound -ionic -rhea -flees -littered -##oum -rocker -vomiting -groaning -champ -overwhelmingly -civilizations -paces -sloop -adoptive -##tish -skaters -##vres -aiding -mango -##joy -nikola -shriek -##ignon -pharmaceuticals -##mg -tuna -calvert -gustavo -stocked -yearbook -##urai -##mana -computed -subsp -riff -hanoi -kelvin -hamid -moors -pastures -summons -jihad -nectar -##ctors -bayou -untitled -pleasing -vastly -republics -intellect -##η -##ulio -##tou -crumbling -stylistic -sb -##ی -consolation -frequented -h₂o -walden -widows -##iens -404 -##ignment -chunks -improves -288 -grit -recited -##dev -snarl -sociological -##arte -##gul -inquired -##held -bruise -clube -consultancy -homogeneous -hornets -multiplication -pasta -prick -savior -##grin -##kou -##phile -yoon -##gara -grimes -vanishing -cheering -reacting -bn -distillery -##quisite -##vity -coe -dockyard -massif -##jord -escorts -voss -##valent -byte -chopped -hawke -illusions -workings -floats -##koto -##vac -kv -annapolis -madden -##onus -alvaro -noctuidae -##cum -##scopic -avenge -steamboat -forte -illustrates -erika -##trip -570 -dew -nationalities -bran -manifested -thirsty -diversified -muscled -reborn -##standing -arson -##lessness -##dran -##logram -##boys -##kushima -##vious -willoughby -##phobia -286 -alsace -dashboard -yuki -##chai -granville -myspace -publicized -tricked -##gang -adjective -##ater -relic -reorganisation -enthusiastically -indications -saxe -##lassified -consolidate -iec -padua -helplessly -ramps -renaming -regulars -pedestrians -accents -convicts -inaccurate -lowers -mana -##pati -barrie -bjp -outta -someplace -berwick -flanking -invoked -marrow -sparsely -excerpts -clothed -rei -##ginal -wept -##straße -##vish -alexa -excel -##ptive -membranes -aquitaine -creeks -cutler -sheppard -implementations -ns -##dur -fragrance -budge -concordia -magnesium -marcelo -##antes -gladly -vibrating -##rral -##ggles -montrose -##omba -lew -seamus -1630 -cocky -##ament -##uen -bjorn -##rrick -fielder -fluttering -##lase -methyl -kimberley -mcdowell -reductions -barbed -##jic -##tonic -aeronautical -condensed -distracting -##promising -huffed -##cala -##sle -claudius -invincible -missy -pious -balthazar -ci -##lang -butte -combo -orson -##dication -myriad -1707 -silenced -##fed -##rh -coco -netball -yourselves -##oza -clarify -heller -peg -durban -etudes -offender -roast -blackmail -curvature -##woods -vile -309 -illicit -suriname -##linson -overture -1685 -bubbling -gymnast -tucking -##mming -##ouin -maldives -##bala -gurney -##dda -##eased -##oides -backside -pinto -jars -racehorse -tending -##rdial -baronetcy -wiener -duly -##rke -barbarian -cupping -flawed -##thesis -bertha -pleistocene -puddle -swearing -##nob -##tically -fleeting -prostate -amulet -educating -##mined -##iti -##tler -75th -jens -respondents -analytics -cavaliers -papacy -raju -##iente -##ulum -##tip -funnel -271 -disneyland -##lley -sociologist -##iam -2500 -faulkner -louvre -menon -##dson -276 -##ower -afterlife -mannheim -peptide -referees -comedians -meaningless -##anger -##laise -fabrics -hurley -renal -sleeps -##bour -##icle -breakout -kristin -roadside -animator -clover -disdain -unsafe -redesign -##urity -firth -barnsley -portage -reset -narrows -268 -commandos -expansive -speechless -tubular -##lux -essendon -eyelashes -smashwords -##yad -##bang -##claim -craved -sprinted -chet -somme -astor -wrocław -orton -266 -bane -##erving -##uing -mischief -##amps -##sund -scaling -terre -##xious -impairment -offenses -undermine -moi -soy -contiguous -arcadia -inuit -seam -##tops -macbeth -rebelled -##icative -##iot -590 -elaborated -frs -uniformed -##dberg -259 -powerless -priscilla -stimulated -980 -qc -arboretum -frustrating -trieste -bullock -##nified -enriched -glistening -intern -##adia -locus -nouvelle -ollie -ike -lash -starboard -ee -tapestry -headlined -hove -rigged -##vite -pollock -##yme -thrive -clustered -cas -roi -gleamed -olympiad -##lino -pressured -regimes -##hosis -##lick -ripley -##ophone -kickoff -gallon -rockwell -##arable -crusader -glue -revolutions -scrambling -1714 -grover -##jure -englishman -aztec -263 -contemplating -coven -ipad -preach -triumphant -tufts -##esian -rotational -##phus -328 -falkland -##brates -strewn -clarissa -rejoin -environmentally -glint -banded -drenched -moat -albanians -johor -rr -maestro -malley -nouveau -shaded -taxonomy -v6 -adhere -bunk -airfields -##ritan -1741 -encompass -remington -tran -##erative -amelie -mazda -friar -morals -passions -##zai -breadth -vis -##hae -argus -burnham -caressing -insider -rudd -##imov -##mini -##rso -italianate -murderous -textual -wainwright -armada -bam -weave -timer -##taken -##nh -fra -##crest -ardent -salazar -taps -tunis -##ntino -allegro -gland -philanthropic -##chester -implication -##optera -esq -judas -noticeably -wynn -##dara -inched -indexed -crises -villiers -bandit -royalties -patterned -cupboard -interspersed -accessory -isla -kendrick -entourage -stitches -##esthesia -headwaters -##ior -interlude -distraught -draught -1727 -##basket -biased -sy -transient -triad -subgenus -adapting -kidd -shortstop -##umatic -dimly -spiked -mcleod -reprint -nellie -pretoria -windmill -##cek -singled -##mps -273 -reunite -##orous -747 -bankers -outlying -##omp -##ports -##tream -apologies -cosmetics -patsy -##deh -##ocks -##yson -bender -nantes -serene -##nad -lucha -mmm -323 -##cius -##gli -cmll -coinage -nestor -juarez -##rook -smeared -sprayed -twitching -sterile -irina -embodied -juveniles -enveloped -miscellaneous -cancers -dq -gulped -luisa -crested -swat -donegal -ref -##anov -##acker -hearst -mercantile -##lika -doorbell -ua -vicki -##alla -##som -bilbao -psychologists -stryker -sw -horsemen -turkmenistan -wits -##national -anson -mathew -screenings -##umb -rihanna -##agne -##nessy -aisles -##iani -##osphere -hines -kenton -saskatoon -tasha -truncated -##champ -##itan -mildred -advises -fredrik -interpreting -inhibitors -##athi -spectroscopy -##hab -##kong -karim -panda -##oia -##nail -##vc -conqueror -kgb -leukemia -##dity -arrivals -cheered -pisa -phosphorus -shielded -##riated -mammal -unitarian -urgently -chopin -sanitary -##mission -spicy -drugged -hinges -##tort -tipping -trier -impoverished -westchester -##caster -267 -epoch -nonstop -##gman -##khov -aromatic -centrally -cerro -##tively -##vio -billions -modulation -sedimentary -283 -facilitating -outrageous -goldstein -##eak -##kt -ld -maitland -penultimate -pollard -##dance -fleets -spaceship -vertebrae -##nig -alcoholism -als -recital -##bham -##ference -##omics -m2 -##bm -trois -##tropical -##в -commemorates -##meric -marge -##raction -1643 -670 -cosmetic -ravaged -##ige -catastrophe -eng -##shida -albrecht -arterial -bellamy -decor -harmon -##rde -bulbs -synchronized -vito -easiest -shetland -shielding -wnba -##glers -##ssar -##riam -brianna -cumbria -##aceous -##rard -cores -thayer -##nsk -brood -hilltop -luminous -carts -keynote -larkin -logos -##cta -##ا -##mund -##quay -lilith -tinted -277 -wrestle -mobilization -##uses -sequential -siam -bloomfield -takahashi -274 -##ieving -presenters -ringo -blazed -witty -##oven -##ignant -devastation -haydn -harmed -newt -therese -##peed -gershwin -molina -rabbis -sudanese -001 -innate -restarted -##sack -##fus -slices -wb -##shah -enroll -hypothetical -hysterical -1743 -fabio -indefinite -warped -##hg -exchanging -525 -unsuitable -##sboro -gallo -1603 -bret -cobalt -homemade -##hunter -mx -operatives -##dhar -terraces -durable -latch -pens -whorls -##ctuated -##eaux -billing -ligament -succumbed -##gly -regulators -spawn -##brick -##stead -filmfare -rochelle -##nzo -1725 -circumstance -saber -supplements -##nsky -##tson -crowe -wellesley -carrot -##9th -##movable -primate -drury -sincerely -topical -##mad -##rao -callahan -kyiv -smarter -tits -undo -##yeh -announcements -anthologies -barrio -nebula -##islaus -##shaft -##tyn -bodyguards -2021 -assassinate -barns -emmett -scully -##mah -##yd -##eland -##tino -##itarian -demoted -gorman -lashed -prized -adventist -writ -##gui -alla -invertebrates -##ausen -1641 -amman -1742 -align -healy -redistribution -##gf -##rize -insulation -##drop -adherents -hezbollah -vitro -ferns -yanking -269 -php -registering -uppsala -cheerleading -confines -mischievous -tully -##ross -49th -docked -roam -stipulated -pumpkin -##bry -prompt -##ezer -blindly -shuddering -craftsmen -frail -scented -katharine -scramble -shaggy -sponge -helix -zaragoza -279 -##52 -43rd -backlash -fontaine -seizures -posse -cowan -nonfiction -telenovela -wwii -hammered -undone -##gpur -encircled -irs -##ivation -artefacts -oneself -searing -smallpox -##belle -##osaurus -shandong -breached -upland -blushing -rankin -infinitely -psyche -tolerated -docking -evicted -##col -unmarked -##lving -gnome -lettering -litres -musique -##oint -benevolent -##jal -blackened -##anna -mccall -racers -tingle -##ocene -##orestation -introductions -radically -292 -##hiff -##باد -1610 -1739 -munchen -plead -##nka -condo -scissors -##sight -##tens -apprehension -##cey -##yin -hallmark -watering -formulas -sequels -##llas -aggravated -bae -commencing -##building -enfield -prohibits -marne -vedic -civilized -euclidean -jagger -beforehand -blasts -dumont -##arney -##nem -740 -conversions -hierarchical -rios -simulator -##dya -##lellan -hedges -oleg -thrusts -shadowed -darby -maximize -1744 -gregorian -##nded -##routed -sham -unspecified -##hog -emory -factual -##smo -##tp -fooled -##rger -ortega -wellness -marlon -##oton -##urance -casket -keating -ley -enclave -##ayan -char -influencing -jia -##chenko -412 -ammonia -erebidae -incompatible -violins -cornered -##arat -grooves -astronauts -columbian -rampant -fabrication -kyushu -mahmud -vanish -##dern -mesopotamia -##lete -ict -##rgen -caspian -kenji -pitted -##vered -999 -grimace -roanoke -tchaikovsky -twinned -##analysis -##awan -xinjiang -arias -clemson -kazakh -sizable -1662 -##khand -##vard -plunge -tatum -vittorio -##nden -cholera -##dana -##oper -bracing -indifference -projectile -superliga -##chee -realises -upgrading -299 -porte -retribution -##vies -nk -stil -##resses -ama -bureaucracy -blackberry -bosch -testosterone -collapses -greer -##pathic -ioc -fifties -malls -##erved -bao -baskets -adolescents -siegfried -##osity -##tosis -mantra -detecting -existent -fledgling -##cchi -dissatisfied -gan -telecommunication -mingled -sobbed -6000 -controversies -outdated -taxis -##raus -fright -slams -##lham -##fect -##tten -detectors -fetal -tanned -##uw -fray -goth -olympian -skipping -mandates -scratches -sheng -unspoken -hyundai -tracey -hotspur -restrictive -##buch -americana -mundo -##bari -burroughs -diva -vulcan -##6th -distinctions -thumping -##ngen -mikey -sheds -fide -rescues -springsteen -vested -valuation -##ece -##ely -pinnacle -rake -sylvie -##edo -almond -quivering -##irus -alteration -faltered -##wad -51st -hydra -ticked -##kato -recommends -##dicated -antigua -arjun -stagecoach -wilfred -trickle -pronouns -##pon -aryan -nighttime -##anian -gall -pea -stitch -##hei -leung -milos -##dini -eritrea -nexus -starved -snowfall -kant -parasitic -cot -discus -hana -strikers -appleton -kitchens -##erina -##partisan -##itha -##vius -disclose -metis -##channel -1701 -tesla -##vera -fitch -1735 -blooded -##tila -decimal -##tang -##bai -cyclones -eun -bottled -peas -pensacola -basha -bolivian -crabs -boil -lanterns -partridge -roofed -1645 -necks -##phila -opined -patting -##kla -##lland -chuckles -volta -whereupon -##nche -devout -euroleague -suicidal -##dee -inherently -involuntary -knitting -nasser -##hide -puppets -colourful -courageous -southend -stills -miraculous -hodgson -richer -rochdale -ethernet -greta -uniting -prism -umm -##haya -##itical -##utation -deterioration -pointe -prowess -##ropriation -lids -scranton -billings -subcontinent -##koff -##scope -brute -kellogg -psalms -degraded -##vez -stanisław -##ructured -ferreira -pun -astonishing -gunnar -##yat -arya -prc -gottfried -##tight -excursion -##ographer -dina -##quil -##nare -huffington -illustrious -wilbur -gundam -verandah -##zard -naacp -##odle -constructive -fjord -kade -##naud -generosity -thrilling -baseline -cayman -frankish -plastics -accommodations -zoological -##fting -cedric -qb -motorized -##dome -##otted -squealed -tackled -canucks -budgets -situ -asthma -dail -gabled -grasslands -whimpered -writhing -judgments -##65 -minnie -pv -##carbon -bananas -grille -domes -monique -odin -maguire -markham -tierney -##estra -##chua -libel -poke -speedy -atrium -laval -notwithstanding -##edly -fai -kala -##sur -robb -##sma -listings -luz -supplementary -tianjin -##acing -enzo -jd -ric -scanner -croats -transcribed -##49 -arden -cv -##hair -##raphy -##lver -##uy -357 -seventies -staggering -alam -horticultural -hs -regression -timbers -blasting -##ounded -montagu -manipulating -##cit -catalytic -1550 -troopers -##meo -condemnation -fitzpatrick -##oire -##roved -inexperienced -1670 -castes -##lative -outing -314 -dubois -flicking -quarrel -ste -learners -1625 -iq -whistled -##class -282 -classify -tariffs -temperament -355 -folly -liszt -##yles -immersed -jordanian -ceasefire -apparel -extras -maru -fished -##bio -harta -stockport -assortment -craftsman -paralysis -transmitters -##cola -blindness -##wk -fatally -proficiency -solemnly -##orno -repairing -amore -groceries -ultraviolet -##chase -schoolhouse -##tua -resurgence -nailed -##otype -##× -ruse -saliva -diagrams -##tructing -albans -rann -thirties -1b -antennas -hilarious -cougars -paddington -stats -##eger -breakaway -ipod -reza -authorship -prohibiting -scoffed -##etz -##ttle -conscription -defected -trondheim -##fires -ivanov -keenan -##adan -##ciful -##fb -##slow -locating -##ials -##tford -cadiz -basalt -blankly -interned -rags -rattling -##tick -carpathian -reassured -sync -bum -guildford -iss -staunch -##onga -astronomers -sera -sofie -emergencies -susquehanna -##heard -duc -mastery -vh1 -williamsburg -bayer -buckled -craving -##khan -##rdes -bloomington -##write -alton -barbecue -##bians -justine -##hri -##ndt -delightful -smartphone -newtown -photon -retrieval -peugeot -hissing -##monium -##orough -flavors -lighted -relaunched -tainted -##games -##lysis -anarchy -microscopic -hopping -adept -evade -evie -##beau -inhibit -sinn -adjustable -hurst -intuition -wilton -cisco -44th -lawful -lowlands -stockings -thierry -##dalen -##hila -##nai -fates -prank -tb -maison -lobbied -provocative -1724 -4a -utopia -##qual -carbonate -gujarati -purcell -##rford -curtiss -##mei -overgrown -arenas -mediation -swallows -##rnik -respectful -turnbull -##hedron -##hope -alyssa -ozone -##ʻi -ami -gestapo -johansson -snooker -canteen -cuff -declines -empathy -stigma -##ags -##iner -##raine -taxpayers -gui -volga -##wright -##copic -lifespan -overcame -tattooed -enactment -giggles -##ador -##camp -barrington -bribe -obligatory -orbiting -peng -##enas -elusive -sucker -##vating -cong -hardship -empowered -anticipating -estrada -cryptic -greasy -detainees -planck -sudbury -plaid -dod -marriott -kayla -##ears -##vb -##zd -mortally -##hein -cognition -radha -319 -liechtenstein -meade -richly -argyle -harpsichord -liberalism -trumpets -lauded -tyrant -salsa -tiled -lear -promoters -reused -slicing -trident -##chuk -##gami -##lka -cantor -checkpoint -##points -gaul -leger -mammalian -##tov -##aar -##schaft -doha -frenchman -nirvana -##vino -delgado -headlining -##eron -##iography -jug -tko -1649 -naga -intersections -##jia -benfica -nawab -##suka -ashford -gulp -##deck -##vill -##rug -brentford -frazier -pleasures -dunne -potsdam -shenzhen -dentistry -##tec -flanagan -##dorff -##hear -chorale -dinah -prem -quezon -##rogated -relinquished -sutra -terri -##pani -flaps -##rissa -poly -##rnet -homme -aback -##eki -linger -womb -##kson -##lewood -doorstep -orthodoxy -threaded -westfield -##rval -dioceses -fridays -subsided -##gata -loyalists -##biotic -##ettes -letterman -lunatic -prelate -tenderly -invariably -souza -thug -winslow -##otide -furlongs -gogh -jeopardy -##runa -pegasus -##umble -humiliated -standalone -tagged -##roller -freshmen -klan -##bright -attaining -initiating -transatlantic -logged -viz -##uance -1723 -combatants -intervening -stephane -chieftain -despised -grazed -317 -cdc -galveston -godzilla -macro -simulate -##planes -parades -##esses -960 -##ductive -##unes -equator -overdose -##cans -##hosh -##lifting -joshi -epstein -sonora -treacherous -aquatics -manchu -responsive -##sation -supervisory -##christ -##llins -##ibar -##balance -##uso -kimball -karlsruhe -mab -##emy -ignores -phonetic -reuters -spaghetti -820 -almighty -danzig -rumbling -tombstone -designations -lured -outset -##felt -supermarkets -##wt -grupo -kei -kraft -susanna -##blood -comprehension -genealogy -##aghan -##verted -redding -##ythe -1722 -bowing -##pore -##roi -lest -sharpened -fulbright -valkyrie -sikhs -##unds -swans -bouquet -merritt -##tage -##venting -commuted -redhead -clerks -leasing -cesare -dea -hazy -##vances -fledged -greenfield -servicemen -##gical -armando -blackout -dt -sagged -downloadable -intra -potion -pods -##4th -##mism -xp -attendants -gambia -stale -##ntine -plump -asteroids -rediscovered -buds -flea -hive -##neas -1737 -classifications -debuts -##eles -olympus -scala -##eurs -##gno -##mute -hummed -sigismund -visuals -wiggled -await -pilasters -clench -sulfate -##ances -bellevue -enigma -trainee -snort -##sw -clouded -denim -##rank -##rder -churning -hartman -lodges -riches -sima -##missible -accountable -socrates -regulates -mueller -##cr -1702 -avoids -solids -himalayas -nutrient -pup -##jevic -squat -fades -nec -##lates -##pina -##rona -##ου -privateer -tequila -##gative -##mpton -apt -hornet -immortals -##dou -asturias -cleansing -dario -##rries -##anta -etymology -servicing -zhejiang -##venor -##nx -horned -erasmus -rayon -relocating -£10 -##bags -escalated -promenade -stubble -2010s -artisans -axial -liquids -mora -sho -yoo -##tsky -bundles -oldies -##nally -notification -bastion -##ths -sparkle -##lved -1728 -leash -pathogen -highs -##hmi -immature -880 -gonzaga -ignatius -mansions -monterrey -sweets -bryson -##loe -polled -regatta -brightest -pei -rosy -squid -hatfield -payroll -addict -meath -cornerback -heaviest -lodging -##mage -capcom -rippled -##sily -barnet -mayhem -ymca -snuggled -rousseau -##cute -blanchard -284 -fragmented -leighton -chromosomes -risking -##md -##strel -##utter -corinne -coyotes -cynical -hiroshi -yeomanry -##ractive -ebook -grading -mandela -plume -agustin -magdalene -##rkin -bea -femme -trafford -##coll -##lun -##tance -52nd -fourier -upton -##mental -camilla -gust -iihf -islamabad -longevity -##kala -feldman -netting -##rization -endeavour -foraging -mfa -orr -##open -greyish -contradiction -graz -##ruff -handicapped -marlene -tweed -oaxaca -spp -campos -miocene -pri -configured -cooks -pluto -cozy -pornographic -##entes -70th -fairness -glided -jonny -lynne -rounding -sired -##emon -##nist -remade -uncover -##mack -complied -lei -newsweek -##jured -##parts -##enting -##pg -293 -finer -guerrillas -athenian -deng -disused -stepmother -accuse -gingerly -seduction -521 -confronting -##walker -##going -gora -nostalgia -sabres -virginity -wrenched -##minated -syndication -wielding -eyre -##56 -##gnon -##igny -behaved -taxpayer -sweeps -##growth -childless -gallant -##ywood -amplified -geraldine -scrape -##ffi -babylonian -fresco -##rdan -##kney -##position -1718 -restricting -tack -fukuoka -osborn -selector -partnering -##dlow -318 -gnu -kia -tak -whitley -gables -##54 -##mania -mri -softness -immersion -##bots -##evsky -1713 -chilling -insignificant -pcs -##uis -elites -lina -purported -supplemental -teaming -##americana -##dding -##inton -proficient -rouen -##nage -##rret -niccolo -selects -##bread -fluffy -1621 -gruff -knotted -mukherjee -polgara -thrash -nicholls -secluded -smoothing -thru -corsica -loaf -whitaker -inquiries -##rrier -##kam -indochina -289 -marlins -myles -peking -##tea -extracts -pastry -superhuman -connacht -vogel -##ditional -##het -##udged -##lash -gloss -quarries -refit -teaser -##alic -##gaon -20s -materialized -sling -camped -pickering -tung -tracker -pursuant -##cide -cranes -soc -##cini -##typical -##viere -anhalt -overboard -workout -chores -fares -orphaned -stains -##logie -fenton -surpassing -joyah -triggers -##itte -grandmaster -##lass -##lists -clapping -fraudulent -ledger -nagasaki -##cor -##nosis -##tsa -eucalyptus -tun -##icio -##rney -##tara -dax -heroism -ina -wrexham -onboard -unsigned -##dates -moshe -galley -winnie -droplets -exiles -praises -watered -noodles -##aia -fein -adi -leland -multicultural -stink -bingo -comets -erskine -modernized -canned -constraint -domestically -chemotherapy -featherweight -stifled -##mum -darkly -irresistible -refreshing -hasty -isolate -##oys -kitchener -planners -##wehr -cages -yarn -implant -toulon -elects -childbirth -yue -##lind -##lone -cn -rightful -sportsman -junctions -remodeled -specifies -##rgh -291 -##oons -complimented -##urgent -lister -ot -##logic -bequeathed -cheekbones -fontana -gabby -##dial -amadeus -corrugated -maverick -resented -triangles -##hered -##usly -nazareth -tyrol -1675 -assent -poorer -sectional -aegean -##cous -296 -nylon -ghanaian -##egorical -##weig -cushions -forbid -fusiliers -obstruction -somerville -##scia -dime -earrings -elliptical -leyte -oder -polymers -timmy -atm -midtown -piloted -settles -continual -externally -mayfield -##uh -enrichment -henson -keane -persians -1733 -benji -braden -pep -324 -##efe -contenders -pepsi -valet -##isches -298 -##asse -##earing -goofy -stroll -##amen -authoritarian -occurrences -adversary -ahmedabad -tangent -toppled -dorchester -1672 -modernism -marxism -islamist -charlemagne -exponential -racks -unicode -brunette -mbc -pic -skirmish -##bund -##lad -##powered -##yst -hoisted -messina -shatter -##ctum -jedi -vantage -##music -##neil -clemens -mahmoud -corrupted -authentication -lowry -nils -##washed -omnibus -wounding -jillian -##itors -##opped -serialized -narcotics -handheld -##arm -##plicity -intersecting -stimulating -##onis -crate -fellowships -hemingway -casinos -climatic -fordham -copeland -drip -beatty -leaflets -robber -brothel -madeira -##hedral -sphinx -ultrasound -##vana -valor -forbade -leonid -villas -##aldo -duane -marquez -##cytes -disadvantaged -forearms -kawasaki -reacts -consular -lax -uncles -uphold -##hopper -concepcion -dorsey -lass -##izan -arching -passageway -1708 -researches -tia -internationals -##graphs -##opers -distinguishes -javanese -divert -##uven -plotted -##listic -##rwin -##erik -##tify -affirmative -signifies -validation -##bson -kari -felicity -georgina -zulu -##eros -##rained -##rath -overcoming -##dot -argyll -##rbin -1734 -chiba -ratification -windy -earls -parapet -##marks -hunan -pristine -astrid -punta -##gart -brodie -##kota -##oder -malaga -minerva -rouse -##phonic -bellowed -pagoda -portals -reclamation -##gur -##odies -##⁄₄ -parentheses -quoting -allergic -palette -showcases -benefactor -heartland -nonlinear -##tness -bladed -cheerfully -scans -##ety -##hone -1666 -girlfriends -pedersen -hiram -sous -##liche -##nator -1683 -##nery -##orio -##umen -bobo -primaries -smiley -##cb -unearthed -uniformly -fis -metadata -1635 -ind -##oted -recoil -##titles -##tura -##ια -406 -hilbert -jamestown -mcmillan -tulane -seychelles -##frid -antics -coli -fated -stucco -##grants -1654 -bulky -accolades -arrays -caledonian -carnage -optimism -puebla -##tative -##cave -enforcing -rotherham -seo -dunlop -aeronautics -chimed -incline -zoning -archduke -hellenistic -##oses -##sions -candi -thong -##ople -magnate -rustic -##rsk -projective -slant -##offs -danes -hollis -vocalists -##ammed -congenital -contend -gesellschaft -##ocating -##pressive -douglass -quieter -##cm -##kshi -howled -salim -spontaneously -townsville -buena -southport -##bold -kato -1638 -faerie -stiffly -##vus -##rled -297 -flawless -realising -taboo -##7th -bytes -straightening -356 -jena -##hid -##rmin -cartwright -berber -bertram -soloists -411 -noses -417 -coping -fission -hardin -inca -##cen -1717 -mobilized -vhf -##raf -biscuits -curate -##85 -##anial -331 -gaunt -neighbourhoods -1540 -##abas -blanca -bypassed -sockets -behold -coincidentally -##bane -nara -shave -splinter -terrific -##arion -##erian -commonplace -juris -redwood -waistband -boxed -caitlin -fingerprints -jennie -naturalized -##ired -balfour -craters -jody -bungalow -hugely -quilt -glitter -pigeons -undertaker -bulging -constrained -goo -##sil -##akh -assimilation -reworked -##person -persuasion -##pants -felicia -##cliff -##ulent -1732 -explodes -##dun -##inium -##zic -lyman -vulture -hog -overlook -begs -northwards -ow -spoil -##urer -fatima -favorably -accumulate -sargent -sorority -corresponded -dispersal -kochi -toned -##imi -##lita -internacional -newfound -##agger -##lynn -##rigue -booths -peanuts -##eborg -medicare -muriel -nur -##uram -crates -millennia -pajamas -worsened -##breakers -jimi -vanuatu -yawned -##udeau -carousel -##hony -hurdle -##ccus -##mounted -##pod -rv -##eche -airship -ambiguity -compulsion -recapture -##claiming -arthritis -##osomal -1667 -asserting -ngc -sniffing -dade -discontent -glendale -ported -##amina -defamation -rammed -##scent -fling -livingstone -##fleet -875 -##ppy -apocalyptic -comrade -lcd -##lowe -cessna -eine -persecuted -subsistence -demi -hoop -reliefs -710 -coptic -progressing -stemmed -perpetrators -1665 -priestess -##nio -dobson -ebony -rooster -itf -tortricidae -##bbon -##jian -cleanup -##jean -##øy -1721 -eighties -taxonomic -holiness -##hearted -##spar -antilles -showcasing -stabilized -##nb -gia -mascara -michelangelo -dawned -##uria -##vinsky -extinguished -fitz -grotesque -£100 -##fera -##loid -##mous -barges -neue -throbbed -cipher -johnnie -##a1 -##mpt -outburst -##swick -spearheaded -administrations -c1 -heartbreak -pixels -pleasantly -##enay -lombardy -plush -##nsed -bobbie -##hly -reapers -tremor -xiang -minogue -substantive -hitch -barak -##wyl -kwan -##encia -910 -obscene -elegance -indus -surfer -bribery -conserve -##hyllum -##masters -horatio -##fat -apes -rebound -psychotic -##pour -iteration -##mium -##vani -botanic -horribly -antiques -dispose -paxton -##hli -##wg -timeless -1704 -disregard -engraver -hounds -##bau -##version -looted -uno -facilitates -groans -masjid -rutland -antibody -disqualification -decatur -footballers -quake -slacks -48th -rein -scribe -stabilize -commits -exemplary -tho -##hort -##chison -pantry -traversed -##hiti -disrepair -identifiable -vibrated -baccalaureate -##nnis -csa -interviewing -##iensis -##raße -greaves -wealthiest -343 -classed -jogged -£5 -##58 -##atal -illuminating -knicks -respecting -##uno -scrubbed -##iji -##dles -kruger -moods -growls -raider -silvia -chefs -kam -vr -cree -percival -##terol -gunter -counterattack -defiant -henan -ze -##rasia -##riety -equivalence -submissions -##fra -##thor -bautista -mechanically -##heater -cornice -herbal -templar -##mering -outputs -ruining -ligand -renumbered -extravagant -mika -blockbuster -eta -insurrection -##ilia -darkening -ferocious -pianos -strife -kinship -##aer -melee -##anor -##iste -##may -##oue -decidedly -weep -##jad -##missive -##ppel -354 -puget -unease -##gnant -1629 -hammering -kassel -ob -wessex -##lga -bromwich -egan -paranoia -utilization -##atable -##idad -contradictory -provoke -##ols -##ouring -##tangled -knesset -##very -##lette -plumbing -##sden -##¹ -greensboro -occult -sniff -338 -zev -beaming -gamer -haggard -mahal -##olt -##pins -mendes -utmost -briefing -gunnery -##gut -##pher -##zh -##rok -1679 -khalifa -sonya -##boot -principals -urbana -wiring -##liffe -##minating -##rrado -dahl -nyu -skepticism -np -townspeople -ithaca -lobster -somethin -##fur -##arina -##−1 -freighter -zimmerman -biceps -contractual -##herton -amend -hurrying -subconscious -##anal -336 -meng -clermont -spawning -##eia -##lub -dignitaries -impetus -snacks -spotting -twigs -##bilis -##cz -##ouk -libertadores -nic -skylar -##aina -##firm -gustave -asean -##anum -dieter -legislatures -flirt -bromley -trolls -umar -##bbies -##tyle -blah -parc -bridgeport -crank -negligence -##nction -46th -constantin -molded -bandages -seriousness -00pm -siegel -carpets -compartments -upbeat -statehood -##dner -##edging -marko -730 -platt -##hane -paving -##iy -1738 -abbess -impatience -limousine -nbl -##talk -441 -lucille -mojo -nightfall -robbers -##nais -karel -brisk -calves -replicate -ascribed -telescopes -##olf -intimidated -##reen -ballast -specialization -##sit -aerodynamic -caliphate -rainer -visionary -##arded -epsilon -##aday -##onte -aggregation -auditory -boosted -reunification -kathmandu -loco -robyn -402 -acknowledges -appointing -humanoid -newell -redeveloped -restraints -##tained -barbarians -chopper -1609 -italiana -##lez -##lho -investigates -wrestlemania -##anies -##bib -690 -##falls -creaked -dragoons -gravely -minions -stupidity -volley -##harat -##week -musik -##eries -##uously -fungal -massimo -semantics -malvern -##ahl -##pee -discourage -embryo -imperialism -1910s -profoundly -##ddled -jiangsu -sparkled -stat -##holz -sweatshirt -tobin -##iction -sneered -##cheon -##oit -brit -causal -smyth -##neuve -diffuse -perrin -silvio -##ipes -##recht -detonated -iqbal -selma -##nism -##zumi -roasted -##riders -tay -##ados -##mament -##mut -##rud -840 -completes -nipples -cfa -flavour -hirsch -##laus -calderon -sneakers -moravian -##ksha -1622 -rq -294 -##imeters -bodo -##isance -##pre -##ronia -anatomical -excerpt -##lke -dh -kunst -##tablished -##scoe -biomass -panted -unharmed -gael -housemates -montpellier -##59 -coa -rodents -tonic -hickory -singleton -##taro -451 -1719 -aldo -breaststroke -dempsey -och -rocco -##cuit -merton -dissemination -midsummer -serials -##idi -haji -polynomials -##rdon -gs -enoch -prematurely -shutter -taunton -£3 -##grating -##inates -archangel -harassed -##asco -326 -archway -dazzling -##ecin -1736 -sumo -wat -##kovich -1086 -honneur -##ently -##nostic -##ttal -##idon -1605 -403 -1716 -blogger -rents -##gnan -hires -##ikh -##dant -howie -##rons -handler -retracted -shocks -1632 -arun -duluth -kepler -trumpeter -##lary -peeking -seasoned -trooper -##mara -laszlo -##iciencies -##rti -heterosexual -##inatory -##ssion -indira -jogging -##inga -##lism -beit -dissatisfaction -malice -##ately -nedra -peeling -##rgeon -47th -stadiums -475 -vertigo -##ains -iced -restroom -##plify -##tub -illustrating -pear -##chner -##sibility -inorganic -rappers -receipts -watery -##kura -lucinda -##oulos -reintroduced -##8th -##tched -gracefully -saxons -nutritional -wastewater -rained -favourites -bedrock -fisted -hallways -likeness -upscale -##lateral -1580 -blinds -prequel -##pps -##tama -deter -humiliating -restraining -tn -vents -1659 -laundering -recess -rosary -tractors -coulter -federer -##ifiers -##plin -persistence -##quitable -geschichte -pendulum -quakers -##beam -bassett -pictorial -buffet -koln -##sitor -drills -reciprocal -shooters -##57 -##cton -##tees -converge -pip -dmitri -donnelly -yamamoto -aqua -azores -demographics -hypnotic -spitfire -suspend -wryly -roderick -##rran -sebastien -##asurable -mavericks -##fles -##200 -himalayan -prodigy -##iance -transvaal -demonstrators -handcuffs -dodged -mcnamara -sublime -1726 -crazed -##efined -##till -ivo -pondered -reconciled -shrill -sava -##duk -bal -cad -heresy -jaipur -goran -##nished -341 -lux -shelly -whitehall -##hre -israelis -peacekeeping -##wled -1703 -demetrius -ousted -##arians -##zos -beale -anwar -backstroke -raged -shrinking -cremated -##yck -benign -towing -wadi -darmstadt -landfill -parana -soothe -colleen -sidewalks -mayfair -tumble -hepatitis -ferrer -superstructure -##gingly -##urse -##wee -anthropological -translators -##mies -closeness -hooves -##pw -mondays -##roll -##vita -landscaping -##urized -purification -sock -thorns -thwarted -jalan -tiberius -##taka -saline -##rito -confidently -khyber -sculptors -##ij -brahms -hammersmith -inspectors -battista -fivb -fragmentation -hackney -##uls -arresting -exercising -antoinette -bedfordshire -##zily -dyed -##hema -1656 -racetrack -variability -##tique -1655 -austrians -deteriorating -madman -theorists -aix -lehman -weathered -1731 -decreed -eruptions -1729 -flaw -quinlan -sorbonne -flutes -nunez -1711 -adored -downwards -fable -rasped -1712 -moritz -mouthful -renegade -shivers -stunts -dysfunction -restrain -translit -327 -pancakes -##avio -##cision -##tray -351 -vial -##lden -bain -##maid -##oxide -chihuahua -malacca -vimes -##rba -##rnier -1664 -donnie -plaques -##ually -337 -bangs -floppy -huntsville -loretta -nikolay -##otte -eater -handgun -ubiquitous -##hett -eras -zodiac -1634 -##omorphic -1820s -##zog -cochran -##bula -##lithic -warring -##rada -dalai -excused -blazers -mcconnell -reeling -bot -este -##abi -geese -hoax -taxon -##bla -guitarists -##icon -condemning -hunts -inversion -moffat -taekwondo -##lvis -1624 -stammered -##rest -##rzy -sousa -fundraiser -marylebone -navigable -uptown -cabbage -daniela -salman -shitty -whimper -##kian -##utive -programmers -protections -rm -##rmi -##rued -forceful -##enes -fuss -##tao -##wash -brat -oppressive -reykjavik -spartak -ticking -##inkles -##kiewicz -adolph -horst -maui -protege -straighten -cpc -landau -concourse -clements -resultant -##ando -imaginative -joo -reactivated -##rem -##ffled -##uising -consultative -##guide -flop -kaitlyn -mergers -parenting -somber -##vron -supervise -vidhan -##imum -courtship -exemplified -harmonies -medallist -refining -##rrow -##ка -amara -##hum -780 -goalscorer -sited -overshadowed -rohan -displeasure -secretive -multiplied -osman -##orth -engravings -padre -##kali -##veda -miniatures -mis -##yala -clap -pali -rook -##cana -1692 -57th -antennae -astro -oskar -1628 -bulldog -crotch -hackett -yucatan -##sure -amplifiers -brno -ferrara -migrating -##gree -thanking -turing -##eza -mccann -ting -andersson -onslaught -gaines -ganga -incense -standardization -##mation -sentai -scuba -stuffing -turquoise -waivers -alloys -##vitt -regaining -vaults -##clops -##gizing -digger -furry -memorabilia -probing -##iad -payton -rec -deutschland -filippo -opaque -seamen -zenith -afrikaans -##filtration -disciplined -inspirational -##merie -banco -confuse -grafton -tod -##dgets -championed -simi -anomaly -biplane -##ceptive -electrode -##para -1697 -cleavage -crossbow -swirl -informant -##lars -##osta -afi -bonfire -spec -##oux -lakeside -slump -##culus -##lais -##qvist -##rrigan -1016 -facades -borg -inwardly -cervical -xl -pointedly -050 -stabilization -##odon -chests -1699 -hacked -ctv -orthogonal -suzy -##lastic -gaulle -jacobite -rearview -##cam -##erted -ashby -##drik -##igate -##mise -##zbek -affectionately -canine -disperse -latham -##istles -##ivar -spielberg -##orin -##idium -ezekiel -cid -##sg -durga -middletown -##cina -customized -frontiers -harden -##etano -##zzy -1604 -bolsheviks -##66 -coloration -yoko -##bedo -briefs -slabs -debra -liquidation -plumage -##oin -blossoms -dementia -subsidy -1611 -proctor -relational -jerseys -parochial -ter -##ici -esa -peshawar -cavalier -loren -cpi -idiots -shamrock -1646 -dutton -malabar -mustache -##endez -##ocytes -referencing -terminates -marche -yarmouth -##sop -acton -mated -seton -subtly -baptised -beige -extremes -jolted -kristina -telecast -##actic -safeguard -waldo -##baldi -##bular -endeavors -sloppy -subterranean -##ensburg -##itung -delicately -pigment -tq -##scu -1626 -##ound -collisions -coveted -herds -##personal -##meister -##nberger -chopra -##ricting -abnormalities -defective -galician -lucie -##dilly -alligator -likened -##genase -burundi -clears -complexion -derelict -deafening -diablo -fingered -champaign -dogg -enlist -isotope -labeling -mrna -##erre -brilliance -marvelous -##ayo -1652 -crawley -ether -footed -dwellers -deserts -hamish -rubs -warlock -skimmed -##lizer -870 -buick -embark -heraldic -irregularities -##ajan -kiara -##kulam -##ieg -antigen -kowalski -##lge -oakley -visitation -##mbit -vt -##suit -1570 -murderers -##miento -##rites -chimneys -##sling -condemn -custer -exchequer -havre -##ghi -fluctuations -##rations -dfb -hendricks -vaccines -##tarian -nietzsche -biking -juicy -##duced -brooding -scrolling -selangor -##ragan -352 -annum -boomed -seminole -sugarcane -##dna -departmental -dismissing -innsbruck -arteries -ashok -batavia -daze -kun -overtook -##rga -##tlan -beheaded -gaddafi -holm -electronically -faulty -galilee -fractures -kobayashi -##lized -gunmen -magma -aramaic -mala -eastenders -inference -messengers -bf -##qu -407 -bathrooms -##vere -1658 -flashbacks -ideally -misunderstood -##jali -##weather -mendez -##grounds -505 -uncanny -##iii -1709 -friendships -##nbc -sacrament -accommodated -reiterated -logistical -pebbles -thumped -##escence -administering -decrees -drafts -##flight -##cased -##tula -futuristic -picket -intimidation -winthrop -##fahan -interfered -339 -afar -francoise -morally -uta -cochin -croft -dwarfs -##bruck -##dents -##nami -biker -##hner -##meral -nano -##isen -##ometric -##pres -##ан -brightened -meek -parcels -securely -gunners -##jhl -##zko -agile -hysteria -##lten -##rcus -bukit -champs -chevy -cuckoo -leith -sadler -theologians -welded -##section -1663 -jj -plurality -xander -##rooms -##formed -shredded -temps -intimately -pau -tormented -##lok -##stellar -1618 -charred -ems -essen -##mmel -alarms -spraying -ascot -blooms -twinkle -##abia -##apes -internment -obsidian -##chaft -snoop -##dav -##ooping -malibu -##tension -quiver -##itia -hays -mcintosh -travers -walsall -##ffie -1623 -beverley -schwarz -plunging -structurally -m3 -rosenthal -vikram -##tsk -770 -ghz -##onda -##tiv -chalmers -groningen -pew -reckon -unicef -##rvis -55th -##gni -1651 -sulawesi -avila -cai -metaphysical -screwing -turbulence -##mberg -augusto -samba -56th -baffled -momentary -toxin -##urian -##wani -aachen -condoms -dali -steppe -##3d -##app -##oed -##year -adolescence -dauphin -electrically -inaccessible -microscopy -nikita -##ega -atv -##cel -##enter -##oles -##oteric -##ы -accountants -punishments -wrongly -bribes -adventurous -clinch -flinders -southland -##hem -##kata -gough -##ciency -lads -soared -##ה -undergoes -deformation -outlawed -rubbish -##arus -##mussen -##nidae -##rzburg -arcs -##ingdon -##tituted -1695 -wheelbase -wheeling -bombardier -campground -zebra -##lices -##oj -##bain -lullaby -##ecure -donetsk -wylie -grenada -##arding -##ης -squinting -eireann -opposes -##andra -maximal -runes -##broken -##cuting -##iface -##ror -##rosis -additive -britney -adultery -triggering -##drome -detrimental -aarhus -containment -jc -swapped -vichy -##ioms -madly -##oric -##rag -brant -##ckey -##trix -1560 -1612 -broughton -rustling -##stems -##uder -asbestos -mentoring -##nivorous -finley -leaps -##isan -apical -pry -slits -substitutes -##dict -intuitive -fantasia -insistent -unreasonable -##igen -##vna -domed -hannover -margot -ponder -##zziness -impromptu -jian -lc -rampage -stemming -##eft -andrey -gerais -whichever -amnesia -appropriated -anzac -clicks -modifying -ultimatum -cambrian -maids -verve -yellowstone -##mbs -conservatoire -##scribe -adherence -dinners -spectra -imperfect -mysteriously -sidekick -tatar -tuba -##aks -##ifolia -distrust -##athan -##zle -c2 -ronin -zac -##pse -celaena -instrumentalist -scents -skopje -##mbling -comical -compensated -vidal -condor -intersect -jingle -wavelengths -##urrent -mcqueen -##izzly -carp -weasel -422 -kanye -militias -postdoctoral -eugen -gunslinger -##ɛ -faux -hospice -##for -appalled -derivation -dwarves -##elis -dilapidated -##folk -astoria -philology -##lwyn -##otho -##saka -inducing -philanthropy -##bf -##itative -geek -markedly -sql -##yce -bessie -indices -rn -##flict -495 -frowns -resolving -weightlifting -tugs -cleric -contentious -1653 -mania -rms -##miya -##reate -##ruck -##tucket -bien -eels -marek -##ayton -##cence -discreet -unofficially -##ife -leaks -##bber -1705 -332 -dung -compressor -hillsborough -pandit -shillings -distal -##skin -381 -##tat -##you -nosed -##nir -mangrove -undeveloped -##idia -textures -##inho -##500 -##rise -ae -irritating -nay -amazingly -bancroft -apologetic -compassionate -kata -symphonies -##lovic -airspace -##lch -930 -gifford -precautions -fulfillment -sevilla -vulgar -martinique -##urities -looting -piccolo -tidy -##dermott -quadrant -armchair -incomes -mathematicians -stampede -nilsson -##inking -##scan -foo -quarterfinal -##ostal -shang -shouldered -squirrels -##owe -344 -vinegar -##bner -##rchy -##systems -delaying -##trics -ars -dwyer -rhapsody -sponsoring -##gration -bipolar -cinder -starters -##olio -##urst -421 -signage -##nty -aground -figurative -mons -acquaintances -duets -erroneously -soyuz -elliptic -recreated -##cultural -##quette -##ssed -##tma -##zcz -moderator -scares -##itaire -##stones -##udence -juniper -sighting -##just -##nsen -britten -calabria -ry -bop -cramer -forsyth -stillness -##л -airmen -gathers -unfit -##umber -##upt -taunting -##rip -seeker -streamlined -##bution -holster -schumann -tread -vox -##gano -##onzo -strive -dil -reforming -covent -newbury -predicting -##orro -decorate -tre -##puted -andover -ie -asahi -dept -dunkirk -gills -##tori -buren -huskies -##stis -##stov -abstracts -bets -loosen -##opa -1682 -yearning -##glio -##sir -berman -effortlessly -enamel -napoli -persist -##peration -##uez -attache -elisa -b1 -invitations -##kic -accelerating -reindeer -boardwalk -clutches -nelly -polka -starbucks -##kei -adamant -huey -lough -unbroken -adventurer -embroidery -inspecting -stanza -##ducted -naia -taluka -##pone -##roids -chases -deprivation -florian -##jing -##ppet -earthly -##lib -##ssee -colossal -foreigner -vet -freaks -patrice -rosewood -triassic -upstate -##pkins -dominates -ata -chants -ks -vo -##400 -##bley -##raya -##rmed -555 -agra -infiltrate -##ailing -##ilation -##tzer -##uppe -##werk -binoculars -enthusiast -fujian -squeak -##avs -abolitionist -almeida -boredom -hampstead -marsden -rations -##ands -inflated -334 -bonuses -rosalie -patna -##rco -329 -detachments -penitentiary -54th -flourishing -woolf -##dion -##etched -papyrus -##lster -##nsor -##toy -bobbed -dismounted -endelle -inhuman -motorola -tbs -wince -wreath -##ticus -hideout -inspections -sanjay -disgrace -infused -pudding -stalks -##urbed -arsenic -leases -##hyl -##rrard -collarbone -##waite -##wil -dowry -##bant -##edance -genealogical -nitrate -salamanca -scandals -thyroid -necessitated -##! -##" -### -##$ -##% -##& -##' -##( -##) -##* -##+ -##, -##- -##. -##/ -##: -##; -##< -##= -##> -##? -##@ -##[ -##\ -##] -##^ -##_ -##` -##{ -##| -##} -##~ -##¡ -##¢ -##£ -##¤ -##¥ -##¦ -##§ -##¨ -##© -##ª -##« -##¬ -##® -##± -##´ -##µ -##¶ -##· -##º -##» -##¼ -##¾ -##¿ -##æ -##ð -##÷ -##þ -##đ -##ħ -##ŋ -##œ -##ƒ -##ɐ -##ɑ -##ɒ -##ɔ -##ɕ -##ə -##ɡ -##ɣ -##ɨ -##ɪ -##ɫ -##ɬ -##ɯ -##ɲ -##ɴ -##ɹ -##ɾ -##ʀ -##ʁ -##ʂ -##ʃ -##ʉ -##ʊ -##ʋ -##ʌ -##ʎ -##ʐ -##ʑ -##ʒ -##ʔ -##ʰ -##ʲ -##ʳ -##ʷ -##ʸ -##ʻ -##ʼ -##ʾ -##ʿ -##ˈ -##ˡ -##ˢ -##ˣ -##ˤ -##β -##γ -##δ -##ε -##ζ -##θ -##κ -##λ -##μ -##ξ -##ο -##π -##ρ -##σ -##τ -##υ -##φ -##χ -##ψ -##ω -##б -##г -##д -##ж -##з -##м -##п -##с -##у -##ф -##х -##ц -##ч -##ш -##щ -##ъ -##э -##ю -##ђ -##є -##і -##ј -##љ -##њ -##ћ -##ӏ -##ա -##բ -##գ -##դ -##ե -##թ -##ի -##լ -##կ -##հ -##մ -##յ -##ն -##ո -##պ -##ս -##վ -##տ -##ր -##ւ -##ք -##־ -##א -##ב -##ג -##ד -##ו -##ז -##ח -##ט -##י -##ך -##כ -##ל -##ם -##מ -##ן -##נ -##ס -##ע -##ף -##פ -##ץ -##צ -##ק -##ר -##ש -##ת -##، -##ء -##ب -##ت -##ث -##ج -##ح -##خ -##ذ -##ز -##س -##ش -##ص -##ض -##ط -##ظ -##ع -##غ -##ـ -##ف -##ق -##ك -##و -##ى -##ٹ -##پ -##چ -##ک -##گ -##ں -##ھ -##ہ -##ے -##अ -##आ -##उ -##ए -##क -##ख -##ग -##च -##ज -##ट -##ड -##ण -##त -##थ -##द -##ध -##न -##प -##ब -##भ -##म -##य -##र -##ल -##व -##श -##ष -##स -##ह -##ा -##ि -##ी -##ो -##। -##॥ -##ং -##অ -##আ -##ই -##উ -##এ -##ও -##ক -##খ -##গ -##চ -##ছ -##জ -##ট -##ড -##ণ -##ত -##থ -##দ -##ধ -##ন -##প -##ব -##ভ -##ম -##য -##র -##ল -##শ -##ষ -##স -##হ -##া -##ি -##ী -##ে -##க -##ச -##ட -##த -##ந -##ன -##ப -##ம -##ய -##ர -##ல -##ள -##வ -##ா -##ி -##ு -##ே -##ை -##ನ -##ರ -##ಾ -##ක -##ය -##ර -##ල -##ව -##ා -##ก -##ง -##ต -##ท -##น -##พ -##ม -##ย -##ร -##ล -##ว -##ส -##อ -##า -##เ -##་ -##། -##ག -##ང -##ད -##ན -##པ -##བ -##མ -##འ -##ར -##ལ -##ས -##မ -##ა -##ბ -##გ -##დ -##ე -##ვ -##თ -##ი -##კ -##ლ -##მ -##ნ -##ო -##რ -##ს -##ტ -##უ -##ᄀ -##ᄂ -##ᄃ -##ᄅ -##ᄆ -##ᄇ -##ᄉ -##ᄊ -##ᄋ -##ᄌ -##ᄎ -##ᄏ -##ᄐ -##ᄑ -##ᄒ -##ᅡ -##ᅢ -##ᅥ -##ᅦ -##ᅧ -##ᅩ -##ᅪ -##ᅭ -##ᅮ -##ᅯ -##ᅲ -##ᅳ -##ᅴ -##ᅵ -##ᆨ -##ᆫ -##ᆯ -##ᆷ -##ᆸ -##ᆼ -##ᴬ -##ᴮ -##ᴰ -##ᴵ -##ᴺ -##ᵀ -##ᵃ -##ᵇ -##ᵈ -##ᵉ -##ᵍ -##ᵏ -##ᵐ -##ᵒ -##ᵖ -##ᵗ -##ᵘ -##ᵣ -##ᵤ -##ᵥ -##ᶜ -##ᶠ -##‐ -##‑ -##‒ -##– -##— -##― -##‖ -##‘ -##’ -##‚ -##“ -##” -##„ -##† -##‡ -##• -##… -##‰ -##′ -##″ -##› -##‿ -##⁄ -##⁰ -##ⁱ -##⁴ -##⁵ -##⁶ -##⁷ -##⁸ -##⁹ -##⁻ -##ⁿ -##₅ -##₆ -##₇ -##₈ -##₉ -##₊ -##₍ -##₎ -##ₐ -##ₑ -##ₒ -##ₓ -##ₕ -##ₖ -##ₗ -##ₘ -##ₚ -##ₛ -##ₜ -##₤ -##₩ -##€ -##₱ -##₹ -##ℓ -##№ -##ℝ -##™ -##⅓ -##⅔ -##← -##↑ -##→ -##↓ -##↔ -##↦ -##⇄ -##⇌ -##⇒ -##∂ -##∅ -##∆ -##∇ -##∈ -##∗ -##∘ -##√ -##∞ -##∧ -##∨ -##∩ -##∪ -##≈ -##≡ -##≤ -##≥ -##⊂ -##⊆ -##⊕ -##⊗ -##⋅ -##─ -##│ -##■ -##▪ -##● -##★ -##☆ -##☉ -##♠ -##♣ -##♥ -##♦ -##♯ -##⟨ -##⟩ -##ⱼ -##⺩ -##⺼ -##⽥ -##、 -##。 -##〈 -##〉 -##《 -##》 -##「 -##」 -##『 -##』 -##〜 -##あ -##い -##う -##え -##お -##か -##き -##く -##け -##こ -##さ -##し -##す -##せ -##そ -##た -##ち -##っ -##つ -##て -##と -##な -##に -##ぬ -##ね -##の -##は -##ひ -##ふ -##へ -##ほ -##ま -##み -##む -##め -##も -##や -##ゆ -##よ -##ら -##り -##る -##れ -##ろ -##を -##ん -##ァ -##ア -##ィ -##イ -##ウ -##ェ -##エ -##オ -##カ -##キ -##ク -##ケ -##コ -##サ -##シ -##ス -##セ -##タ -##チ -##ッ -##ツ -##テ -##ト -##ナ -##ニ -##ノ -##ハ -##ヒ -##フ -##ヘ -##ホ -##マ -##ミ -##ム -##メ -##モ -##ャ -##ュ -##ョ -##ラ -##リ -##ル -##レ -##ロ -##ワ -##ン -##・ -##ー -##一 -##三 -##上 -##下 -##不 -##世 -##中 -##主 -##久 -##之 -##也 -##事 -##二 -##五 -##井 -##京 -##人 -##亻 -##仁 -##介 -##代 -##仮 -##伊 -##会 -##佐 -##侍 -##保 -##信 -##健 -##元 -##光 -##八 -##公 -##内 -##出 -##分 -##前 -##劉 -##力 -##加 -##勝 -##北 -##区 -##十 -##千 -##南 -##博 -##原 -##口 -##古 -##史 -##司 -##合 -##吉 -##同 -##名 -##和 -##囗 -##四 -##国 -##國 -##土 -##地 -##坂 -##城 -##堂 -##場 -##士 -##夏 -##外 -##大 -##天 -##太 -##夫 -##奈 -##女 -##子 -##学 -##宀 -##宇 -##安 -##宗 -##定 -##宣 -##宮 -##家 -##宿 -##寺 -##將 -##小 -##尚 -##山 -##岡 -##島 -##崎 -##川 -##州 -##巿 -##帝 -##平 -##年 -##幸 -##广 -##弘 -##張 -##彳 -##後 -##御 -##德 -##心 -##忄 -##志 -##忠 -##愛 -##成 -##我 -##戦 -##戸 -##手 -##扌 -##政 -##文 -##新 -##方 -##日 -##明 -##星 -##春 -##昭 -##智 -##曲 -##書 -##月 -##有 -##朝 -##木 -##本 -##李 -##村 -##東 -##松 -##林 -##森 -##楊 -##樹 -##橋 -##歌 -##止 -##正 -##武 -##比 -##氏 -##民 -##水 -##氵 -##氷 -##永 -##江 -##沢 -##河 -##治 -##法 -##海 -##清 -##漢 -##瀬 -##火 -##版 -##犬 -##王 -##生 -##田 -##男 -##疒 -##発 -##白 -##的 -##皇 -##目 -##相 -##省 -##真 -##石 -##示 -##社 -##神 -##福 -##禾 -##秀 -##秋 -##空 -##立 -##章 -##竹 -##糹 -##美 -##義 -##耳 -##良 -##艹 -##花 -##英 -##華 -##葉 -##藤 -##行 -##街 -##西 -##見 -##訁 -##語 -##谷 -##貝 -##貴 -##車 -##軍 -##辶 -##道 -##郎 -##郡 -##部 -##都 -##里 -##野 -##金 -##鈴 -##镇 -##長 -##門 -##間 -##阝 -##阿 -##陳 -##陽 -##雄 -##青 -##面 -##風 -##食 -##香 -##馬 -##高 -##龍 -##龸 -##fi -##fl -##! -##( -##) -##, -##- -##. -##/ -##: -##? -##~ diff --git a/matchzoo/datasets/bert_resources/uncased_vocab_100.txt b/matchzoo/datasets/bert_resources/uncased_vocab_100.txt new file mode 100644 index 00000000..bbdb8526 --- /dev/null +++ b/matchzoo/datasets/bert_resources/uncased_vocab_100.txt @@ -0,0 +1,101 @@ +[PAD] +##ness +episode +bed +added +table +indian +private +charles +route +available +idea +throughout +centre +addition +appointed +style +1994 +books +eight +construction +press +mean +wall +friends +remained +schools +study +##ch +##um +institute +oh +chinese +sometimes +events +possible +1992 +australian +type +brown +forward +talk +process +food +debut +seat +performance +committee +features +character +arts +herself +else +lot +strong +russian +range +hours +peter +arm +##da +morning +dr +sold +##ry +quickly +directed +1993 +guitar +china +##w +31 +list +##ma +performed +media +uk +players +smile +##rs +myself +40 +placed +coach +province +##gawa +typed +##dry +favors +allegheny +glaciers +##rly +recalling +aziz +##log +parasite +requiem +auf +##berto +##llin +[UNK] \ No newline at end of file diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index 83840d95..0df73732 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -35,7 +35,7 @@ def __init__(self, fixed_length_left: int = 30, >>> train_data = mz.datasets.toy.load_data() >>> test_data = mz.datasets.toy.load_data(stage='test') >>> # the argument 'bert_vocab_path' must feed the bert vocab path - >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='matchzoo/datasets/bert_resources/uncased_vocab.txt') + >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='matchzoo/datasets/bert_resources/uncased_vocab_100.txt') >>> train_data_processed = bert_preprocessor.fit_transform(train_data) >>> test_data_processed = bert_preprocessor.transform(test_data) From ac1d8ab27f8fa0951a02a10abf31fd28b37fa843 Mon Sep 17 00:00:00 2001 From: wqh17101 <597935261@qq.com> Date: Sun, 19 May 2019 17:39:17 +0800 Subject: [PATCH 069/100] update rst --- docs/source/conf.py | 7 +- docs/source/matchzoo.auto.preparer.rst | 30 ++++ docs/source/matchzoo.auto.rst | 22 +-- docs/source/matchzoo.auto.tuner.callbacks.rst | 46 ++++++ docs/source/matchzoo.auto.tuner.rst | 37 +++++ docs/source/matchzoo.datasets.quora_qp.rst | 22 +++ docs/source/matchzoo.datasets.rst | 1 + docs/source/matchzoo.embedding.rst | 22 +++ docs/source/matchzoo.preprocessors.units.rst | 134 ++++++++++++++++++ docs/source/matchzoo.rst | 12 +- docs/source/matchzoo.utils.rst | 8 ++ 11 files changed, 310 insertions(+), 31 deletions(-) create mode 100644 docs/source/matchzoo.auto.preparer.rst create mode 100644 docs/source/matchzoo.auto.tuner.callbacks.rst create mode 100644 docs/source/matchzoo.auto.tuner.rst create mode 100644 docs/source/matchzoo.datasets.quora_qp.rst create mode 100644 docs/source/matchzoo.embedding.rst create mode 100644 docs/source/matchzoo.preprocessors.units.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index 8bc624db..32d02f5a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -20,15 +20,16 @@ sys.path.insert(0, os.path.abspath('../../matchzoo/data_generator')) sys.path.insert(0, os.path.abspath('../../matchzoo/data_pack')) sys.path.insert(0, os.path.abspath('../../matchzoo/datasets')) +sys.path.insert(0, os.path.abspath('../../matchzoo/embedding')) sys.path.insert(0, os.path.abspath('../../matchzoo/engine')) sys.path.insert(0, os.path.abspath('../../matchzoo/layers')) sys.path.insert(0, os.path.abspath('../../matchzoo/losses')) -sys.path.insert(0, os.path.abspath('../../matchzoo/models')) sys.path.insert(0, os.path.abspath('../../matchzoo/metrics')) +sys.path.insert(0, os.path.abspath('../../matchzoo/models')) sys.path.insert(0, os.path.abspath('../../matchzoo/preprocessors')) -sys.path.insert(0, os.path.abspath('../../matchzoo/processor_units')) -sys.path.insert(0, os.path.abspath('../../matchzoo/utils')) sys.path.insert(0, os.path.abspath('../../matchzoo/tasks')) +sys.path.insert(0, os.path.abspath('../../matchzoo/utils')) + # -- Project information ----------------------------------------------------- diff --git a/docs/source/matchzoo.auto.preparer.rst b/docs/source/matchzoo.auto.preparer.rst new file mode 100644 index 00000000..3291f9fe --- /dev/null +++ b/docs/source/matchzoo.auto.preparer.rst @@ -0,0 +1,30 @@ +matchzoo.auto.preparer package +============================== + +Submodules +---------- + +matchzoo.auto.preparer.prepare module +------------------------------------- + +.. automodule:: matchzoo.auto.preparer.prepare + :members: + :undoc-members: + :show-inheritance: + +matchzoo.auto.preparer.preparer module +-------------------------------------- + +.. automodule:: matchzoo.auto.preparer.preparer + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.auto.preparer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.auto.rst b/docs/source/matchzoo.auto.rst index bb974511..1272de0a 100644 --- a/docs/source/matchzoo.auto.rst +++ b/docs/source/matchzoo.auto.rst @@ -1,25 +1,13 @@ matchzoo.auto package ===================== -Submodules ----------- +Subpackages +----------- -matchzoo.auto.prepare module ----------------------------- - -.. automodule:: matchzoo.auto.prepare - :members: - :undoc-members: - :show-inheritance: - -matchzoo.auto.tune module -------------------------- - -.. automodule:: matchzoo.auto.tune - :members: - :undoc-members: - :show-inheritance: +.. toctree:: + matchzoo.auto.preparer + matchzoo.auto.tuner Module contents --------------- diff --git a/docs/source/matchzoo.auto.tuner.callbacks.rst b/docs/source/matchzoo.auto.tuner.callbacks.rst new file mode 100644 index 00000000..1671dc48 --- /dev/null +++ b/docs/source/matchzoo.auto.tuner.callbacks.rst @@ -0,0 +1,46 @@ +matchzoo.auto.tuner.callbacks package +===================================== + +Submodules +---------- + +matchzoo.auto.tuner.callbacks.callback module +--------------------------------------------- + +.. automodule:: matchzoo.auto.tuner.callbacks.callback + :members: + :undoc-members: + :show-inheritance: + +matchzoo.auto.tuner.callbacks.lambda\_callback module +----------------------------------------------------- + +.. automodule:: matchzoo.auto.tuner.callbacks.lambda_callback + :members: + :undoc-members: + :show-inheritance: + +matchzoo.auto.tuner.callbacks.load\_embedding\_matrix module +------------------------------------------------------------ + +.. automodule:: matchzoo.auto.tuner.callbacks.load_embedding_matrix + :members: + :undoc-members: + :show-inheritance: + +matchzoo.auto.tuner.callbacks.save\_model module +------------------------------------------------ + +.. automodule:: matchzoo.auto.tuner.callbacks.save_model + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.auto.tuner.callbacks + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.auto.tuner.rst b/docs/source/matchzoo.auto.tuner.rst new file mode 100644 index 00000000..024d1e83 --- /dev/null +++ b/docs/source/matchzoo.auto.tuner.rst @@ -0,0 +1,37 @@ +matchzoo.auto.tuner package +=========================== + +Subpackages +----------- + +.. toctree:: + + matchzoo.auto.tuner.callbacks + +Submodules +---------- + +matchzoo.auto.tuner.tune module +------------------------------- + +.. automodule:: matchzoo.auto.tuner.tune + :members: + :undoc-members: + :show-inheritance: + +matchzoo.auto.tuner.tuner module +-------------------------------- + +.. automodule:: matchzoo.auto.tuner.tuner + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.auto.tuner + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.datasets.quora_qp.rst b/docs/source/matchzoo.datasets.quora_qp.rst new file mode 100644 index 00000000..e0eb3d83 --- /dev/null +++ b/docs/source/matchzoo.datasets.quora_qp.rst @@ -0,0 +1,22 @@ +matchzoo.datasets.quora\_qp package +=================================== + +Submodules +---------- + +matchzoo.datasets.quora\_qp.load\_data module +--------------------------------------------- + +.. automodule:: matchzoo.datasets.quora_qp.load_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.datasets.quora_qp + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.datasets.rst b/docs/source/matchzoo.datasets.rst index 8a77b0fc..d559538d 100644 --- a/docs/source/matchzoo.datasets.rst +++ b/docs/source/matchzoo.datasets.rst @@ -7,6 +7,7 @@ Subpackages .. toctree:: matchzoo.datasets.embeddings + matchzoo.datasets.quora_qp matchzoo.datasets.snli matchzoo.datasets.toy matchzoo.datasets.wiki_qa diff --git a/docs/source/matchzoo.embedding.rst b/docs/source/matchzoo.embedding.rst new file mode 100644 index 00000000..f1b0265b --- /dev/null +++ b/docs/source/matchzoo.embedding.rst @@ -0,0 +1,22 @@ +matchzoo.embedding package +========================== + +Submodules +---------- + +matchzoo.embedding.embedding module +----------------------------------- + +.. automodule:: matchzoo.embedding.embedding + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.embedding + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.preprocessors.units.rst b/docs/source/matchzoo.preprocessors.units.rst new file mode 100644 index 00000000..dc501f4a --- /dev/null +++ b/docs/source/matchzoo.preprocessors.units.rst @@ -0,0 +1,134 @@ +matchzoo.preprocessors.units package +==================================== + +Submodules +---------- + +matchzoo.preprocessors.units.digit\_removal module +-------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.digit_removal + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.fixed\_length module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.fixed_length + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.frequency\_filter module +----------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.frequency_filter + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.lemmatization module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.lemmatization + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.lowercase module +--------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.lowercase + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.matching\_histogram module +------------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.matching_histogram + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.ngram\_letter module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.ngram_letter + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.punc\_removal module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.punc_removal + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.stateful\_unit module +-------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.stateful_unit + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.stemming module +-------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.stemming + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.stop\_removal module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.stop_removal + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.tokenize module +-------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.tokenize + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.unit module +---------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.unit + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.vocabulary module +---------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.vocabulary + :members: + :undoc-members: + :show-inheritance: + +matchzoo.preprocessors.units.word\_hashing module +------------------------------------------------- + +.. automodule:: matchzoo.preprocessors.units.word_hashing + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: matchzoo.preprocessors.units + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/matchzoo.rst b/docs/source/matchzoo.rst index ef27bcbb..56ee8b77 100644 --- a/docs/source/matchzoo.rst +++ b/docs/source/matchzoo.rst @@ -6,7 +6,7 @@ Subpackages .. toctree:: - matchzoo.contrib + matchzoo.auto matchzoo.data_generator matchzoo.data_pack matchzoo.datasets @@ -16,23 +16,13 @@ Subpackages matchzoo.losses matchzoo.metrics matchzoo.models - matchzoo.prepare matchzoo.preprocessors matchzoo.tasks - matchzoo.tune matchzoo.utils Submodules ---------- -matchzoo.logger module ----------------------- - -.. automodule:: matchzoo.logger - :members: - :undoc-members: - :show-inheritance: - matchzoo.version module ----------------------- diff --git a/docs/source/matchzoo.utils.rst b/docs/source/matchzoo.utils.rst index d19d2a78..c679d9fd 100644 --- a/docs/source/matchzoo.utils.rst +++ b/docs/source/matchzoo.utils.rst @@ -12,6 +12,14 @@ matchzoo.utils.list\_recursive\_subclasses module :undoc-members: :show-inheritance: +matchzoo.utils.make\_keras\_optimizer\_picklable module +------------------------------------------------------- + +.. automodule:: matchzoo.utils.make_keras_optimizer_picklable + :members: + :undoc-members: + :show-inheritance: + matchzoo.utils.one\_hot module ------------------------------ From 02750ef0e7c98adbd69eefe1da592210487b7938 Mon Sep 17 00:00:00 2001 From: wqh17101 <597935261@qq.com> Date: Sun, 19 May 2019 17:40:55 +0800 Subject: [PATCH 070/100] update readme --- docs/Readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Readme.md b/docs/Readme.md index e5f392ce..7b1b43c7 100644 --- a/docs/Readme.md +++ b/docs/Readme.md @@ -16,7 +16,8 @@ pip install -r requirements.txt # Enter docs folder. cd docs # Use sphinx autodoc to generate rst. -sphinx-apidoc -o source/ ../matchzoo/ +# usage: sphinx-apidoc [OPTIONS] -o [EXCLUDE_PATTERN,...] +sphinx-apidoc -o source/ ../matchzoo/ ../matchzoo/contrib # Generate html from rst make clean make html From 8968ebba27370376db4b8604f183f8db3401dd07 Mon Sep 17 00:00:00 2001 From: wqh17101 <597935261@qq.com> Date: Sun, 19 May 2019 17:47:08 +0800 Subject: [PATCH 071/100] update release_ver --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 32d02f5a..55981b7d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -40,7 +40,7 @@ # The short X.Y version version = '' # The full version, including alpha/beta/rc tags -release = '2.0' +release = '2.1' # -- General configuration --------------------------------------------------- From 8804cdb85be16decd1162829fedaf9d020396b1e Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Wed, 22 May 2019 16:55:50 +0800 Subject: [PATCH 072/100] fix the code style warning --- matchzoo/preprocessors/bert_preprocessor.py | 19 ++++++------- matchzoo/preprocessors/build_vocab_unit.py | 8 +++--- matchzoo/preprocessors/units/bert_clean.py | 3 ++- matchzoo/preprocessors/units/tokenize.py | 10 ++++--- matchzoo/preprocessors/units/vocabulary.py | 1 - matchzoo/utils/bert_utils.py | 30 ++++++++++----------- 6 files changed, 38 insertions(+), 33 deletions(-) diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index 0df73732..ccdcdaee 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -21,9 +21,9 @@ def __init__(self, fixed_length_left: int = 30, filter_low_freq: float = 2, filter_high_freq: float = float('inf'), remove_stop_words: bool = False, - lower_case: bool=True, - chinese_version: bool=True, - bert_vocab_path: str="bert_resources/vocab.txt"): + lower_case: bool = True, + chinese_version: bool = True, + bert_vocab_path: str = "bert_resources/vocab.txt"): """ Bert-base Model preprocessor. @@ -35,8 +35,11 @@ def __init__(self, fixed_length_left: int = 30, >>> train_data = mz.datasets.toy.load_data() >>> test_data = mz.datasets.toy.load_data(stage='test') >>> # the argument 'bert_vocab_path' must feed the bert vocab path - >>> bert_preprocessor = mz.preprocessors.BertPreprocessor(bert_vocab_path='matchzoo/datasets/bert_resources/uncased_vocab_100.txt') - >>> train_data_processed = bert_preprocessor.fit_transform(train_data) + >>> bert_preprocessor = mz.preprocessors.BertPreprocessor( + ... bert_vocab_path= + ... 'matchzoo/datasets/bert_resources/uncased_vocab_100.txt') + >>> train_data_processed = bert_preprocessor.fit_transform( + ... train_data) >>> test_data_processed = bert_preprocessor.transform(test_data) """ @@ -65,7 +68,8 @@ def __init__(self, fixed_length_left: int = 30, if lower_case: self._units.append(units.Lowercase()) self._units.append(units.StripAccent()) - self._units.append(units.WordPieceTokenize(self._vocab_unit.state['term_index'])) + self._units.append(units.WordPieceTokenize( + self._vocab_unit.state['term_index'])) if remove_stop_words: self._units.append(units.StopRemoval()) @@ -135,6 +139,3 @@ def _default_units(cls) -> list: units.BertClean(), units.BasicTokenize() ] - - - diff --git a/matchzoo/preprocessors/build_vocab_unit.py b/matchzoo/preprocessors/build_vocab_unit.py index ac1af5d6..77dc54a8 100644 --- a/matchzoo/preprocessors/build_vocab_unit.py +++ b/matchzoo/preprocessors/build_vocab_unit.py @@ -3,10 +3,11 @@ from .build_unit_from_data_pack import build_unit_from_data_pack from .units import BertVocabulary + def build_vocab_unit( - data_pack: DataPack, - mode: str = 'both', - verbose: int = 1 + data_pack: DataPack, + mode: str = 'both', + verbose: int = 1 ) -> Vocabulary: """ Build a :class:`preprocessor.units.Vocabulary` given `data_pack`. @@ -33,6 +34,7 @@ def build_vocab_unit( def built_bert_vocab_unit(vocab_path: str) -> BertVocabulary: """ Build a :class:`preprocessor.units.BertVocabulary` given `vocab_path`. + :param vocab_path: bert vocabulary path. :return: A built vocabulary unit. diff --git a/matchzoo/preprocessors/units/bert_clean.py b/matchzoo/preprocessors/units/bert_clean.py index 74f7b5fc..e6747a78 100644 --- a/matchzoo/preprocessors/units/bert_clean.py +++ b/matchzoo/preprocessors/units/bert_clean.py @@ -1,5 +1,6 @@ from .unit import Unit -from matchzoo.utils.bert_utils import is_whitespace, is_control, run_strip_accents +from matchzoo.utils.bert_utils import \ + is_whitespace, is_control, run_strip_accents class BertClean(Unit): diff --git a/matchzoo/preprocessors/units/tokenize.py b/matchzoo/preprocessors/units/tokenize.py index a7747f8a..c72e65d9 100644 --- a/matchzoo/preprocessors/units/tokenize.py +++ b/matchzoo/preprocessors/units/tokenize.py @@ -1,5 +1,6 @@ import nltk -from matchzoo.utils.bert_utils import is_chinese_char, whitespace_tokenize, run_split_on_punc +from matchzoo.utils.bert_utils import is_chinese_char, \ + whitespace_tokenize, run_split_on_punc from .unit import Unit @@ -64,7 +65,7 @@ def transform(self, input_: str) -> list: class WordPieceTokenize(Unit): """Process unit for text tokenization.""" - def __init__(self, vocab: dict, max_input_chars_per_word: int=200): + def __init__(self, vocab: dict, max_input_chars_per_word: int = 200): """Initialization. """ self.vocab = vocab self.unk_token = '[UNK]' @@ -73,8 +74,9 @@ def __init__(self, vocab: dict, max_input_chars_per_word: int=200): def transform(self, input_: list) -> list: """ Tokenizes a piece of text into its word pieces. - This uses a greedy longest-match-first algorithm to perform tokenization - using the given vocabulary. + + This uses a greedy longest-match-first algorithm to perform + tokenization using the given vocabulary. For example: input = "unaffable" diff --git a/matchzoo/preprocessors/units/vocabulary.py b/matchzoo/preprocessors/units/vocabulary.py index 7504b4cc..1ed62bc5 100644 --- a/matchzoo/preprocessors/units/vocabulary.py +++ b/matchzoo/preprocessors/units/vocabulary.py @@ -108,4 +108,3 @@ def fit(self, vocab_path: str): def transform(self, input_: list) -> list: """Transform a list of tokens to corresponding indices.""" return [self._context['term_index'][token] for token in input_] - diff --git a/matchzoo/utils/bert_utils.py b/matchzoo/utils/bert_utils.py index 9ed234f3..f4b2b8c7 100644 --- a/matchzoo/utils/bert_utils.py +++ b/matchzoo/utils/bert_utils.py @@ -32,8 +32,8 @@ def is_punctuation(char): # Characters such as "^", "$", and "`" are not in the Unicode # Punctuation class but we treat them as punctuation anyways, for # consistency. - if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or - (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): + if ((33 <= cp <= 47) or (58 <= cp <= 64) or + (91 <= cp <= 96) or (123 <= cp <= 126)): return True cat = unicodedata.category(char) if cat.startswith("P"): @@ -46,19 +46,19 @@ def is_chinese_char(cp): # This defines a "chinese character" as anything in the CJK Unicode block: # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) # - # Note that the CJK Unicode block is NOT all Japanese and Korean characters, - # despite its name. The modern Korean Hangul alphabet is a different block, - # as is Japanese Hiragana and Katakana. Those alphabets are used to write - # space-separated words, so they are not treated specially and handled - # like the all of the other languages. - if ((cp >= 0x4E00 and cp <= 0x9FFF) or # - (cp >= 0x3400 and cp <= 0x4DBF) or # - (cp >= 0x20000 and cp <= 0x2A6DF) or # - (cp >= 0x2A700 and cp <= 0x2B73F) or # - (cp >= 0x2B740 and cp <= 0x2B81F) or # - (cp >= 0x2B820 and cp <= 0x2CEAF) or - (cp >= 0xF900 and cp <= 0xFAFF) or # - (cp >= 0x2F800 and cp <= 0x2FA1F)): # + # Note that the CJK Unicode block is NOT all Japanese and Korean + # characters, despite its name. The modern Korean Hangul alphabet is a + # different block, as is Japanese Hiragana and Katakana. Those alphabets + # are used to write space-separated words, so they are not treated + # specially and handled like the all of the other languages. + if ((0x4E00 <= cp <= 0x9FFF) or # + (0x3400 <= cp <= 0x4DBF) or # + (0x20000 <= cp <= 0x2A6DF) or # + (0x2A700 <= cp <= 0x2B73F) or # + (0x2B740 <= cp <= 0x2B81F) or # + (0x2B820 <= cp <= 0x2CEAF) or + (0xF900 <= cp <= 0xFAFF) or # + (0x2F800 <= cp <= 0x2FA1F)): # return True return False From 3e08df2d1f8d6c8eeb39354684b5b27bd077e036 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Wed, 22 May 2019 20:03:08 +0800 Subject: [PATCH 073/100] fix the line break warning --- matchzoo/preprocessors/units/tokenize.py | 2 +- matchzoo/utils/bert_utils.py | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/matchzoo/preprocessors/units/tokenize.py b/matchzoo/preprocessors/units/tokenize.py index c72e65d9..8456f1b2 100644 --- a/matchzoo/preprocessors/units/tokenize.py +++ b/matchzoo/preprocessors/units/tokenize.py @@ -66,7 +66,7 @@ class WordPieceTokenize(Unit): """Process unit for text tokenization.""" def __init__(self, vocab: dict, max_input_chars_per_word: int = 200): - """Initialization. """ + """Initialization.""" self.vocab = vocab self.unk_token = '[UNK]' self.max_input_chars_per_word = max_input_chars_per_word diff --git a/matchzoo/utils/bert_utils.py b/matchzoo/utils/bert_utils.py index f4b2b8c7..0814a30d 100644 --- a/matchzoo/utils/bert_utils.py +++ b/matchzoo/utils/bert_utils.py @@ -32,8 +32,9 @@ def is_punctuation(char): # Characters such as "^", "$", and "`" are not in the Unicode # Punctuation class but we treat them as punctuation anyways, for # consistency. - if ((33 <= cp <= 47) or (58 <= cp <= 64) or - (91 <= cp <= 96) or (123 <= cp <= 126)): + condition = (33 <= cp <= 47) or (58 <= cp <= 64) or \ + (91 <= cp <= 96) or (123 <= cp <= 126) + if condition: return True cat = unicodedata.category(char) if cat.startswith("P"): @@ -51,17 +52,14 @@ def is_chinese_char(cp): # different block, as is Japanese Hiragana and Katakana. Those alphabets # are used to write space-separated words, so they are not treated # specially and handled like the all of the other languages. - if ((0x4E00 <= cp <= 0x9FFF) or # - (0x3400 <= cp <= 0x4DBF) or # - (0x20000 <= cp <= 0x2A6DF) or # - (0x2A700 <= cp <= 0x2B73F) or # - (0x2B740 <= cp <= 0x2B81F) or # - (0x2B820 <= cp <= 0x2CEAF) or - (0xF900 <= cp <= 0xFAFF) or # - (0x2F800 <= cp <= 0x2FA1F)): # - return True - - return False + return (0x4E00 <= cp <= 0x9FFF) or \ + (0x3400 <= cp <= 0x4DBF) or \ + (0x20000 <= cp <= 0x2A6DF) or \ + (0x2A700 <= cp <= 0x2B73F) or \ + (0x2B740 <= cp <= 0x2B81F) or \ + (0x2B820 <= cp <= 0x2CEAF) or \ + (0xF900 <= cp <= 0xFAFF) or \ + (0x2F800 <= cp <= 0x2FA1F) def run_strip_accents(text): From 40f9a181499b21c80f3a56c021e0a580ee35d279 Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Tue, 28 May 2019 14:43:17 +0800 Subject: [PATCH 074/100] modified according to reviews --- matchzoo/preprocessors/bert_preprocessor.py | 12 +++++------- matchzoo/preprocessors/units/tokenize.py | 16 +++++++++------- matchzoo/utils/bert_utils.py | 17 ++++++----------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/matchzoo/preprocessors/bert_preprocessor.py b/matchzoo/preprocessors/bert_preprocessor.py index ccdcdaee..2c6b64ce 100644 --- a/matchzoo/preprocessors/bert_preprocessor.py +++ b/matchzoo/preprocessors/bert_preprocessor.py @@ -15,26 +15,24 @@ class BertPreprocessor(BasePreprocessor): """Bert-base Model preprocessor.""" - def __init__(self, fixed_length_left: int = 30, + def __init__(self, bert_vocab_path: str, + fixed_length_left: int = 30, fixed_length_right: int = 30, filter_mode: str = 'df', filter_low_freq: float = 2, filter_high_freq: float = float('inf'), remove_stop_words: bool = False, lower_case: bool = True, - chinese_version: bool = True, - bert_vocab_path: str = "bert_resources/vocab.txt"): + chinese_version: bool = False, + ): """ Bert-base Model preprocessor. - TODO: doc here. - - Example: >>> import matchzoo as mz >>> train_data = mz.datasets.toy.load_data() >>> test_data = mz.datasets.toy.load_data(stage='test') - >>> # the argument 'bert_vocab_path' must feed the bert vocab path + >>> # The argument 'bert_vocab_path' must feed the bert vocab path >>> bert_preprocessor = mz.preprocessors.BertPreprocessor( ... bert_vocab_path= ... 'matchzoo/datasets/bert_resources/uncased_vocab_100.txt') diff --git a/matchzoo/preprocessors/units/tokenize.py b/matchzoo/preprocessors/units/tokenize.py index 8456f1b2..51d97de6 100644 --- a/matchzoo/preprocessors/units/tokenize.py +++ b/matchzoo/preprocessors/units/tokenize.py @@ -28,7 +28,8 @@ def transform(self, input_: str) -> str: :param input_: raw textual input. - :return output: text with a blank between adjacent Chinese tokens. + :return output: text with at least one blank between adjacent + Chinese tokens. """ output = [] for char in input_: @@ -89,15 +90,16 @@ def transform(self, input_: list) -> list: output_tokens = [] for token in input_: chars = list(token) - if len(chars) > self.max_input_chars_per_word: + token_length = len(chars) + if token_length > self.max_input_chars_per_word: output_tokens.append(self.unk_token) continue - is_bad = False + unknown_suffix = False start = 0 sub_tokens = [] - while start < len(chars): - end = len(chars) + while start < token_length: + end = token_length cur_substr = None while start < end: substr = "".join(chars[start:end]) @@ -108,12 +110,12 @@ def transform(self, input_: list) -> list: break end -= 1 if cur_substr is None: - is_bad = True + unknown_suffix = True break sub_tokens.append(cur_substr) start = end - if is_bad: + if unknown_suffix: output_tokens.append(self.unk_token) else: output_tokens.extend(sub_tokens) diff --git a/matchzoo/utils/bert_utils.py b/matchzoo/utils/bert_utils.py index 0814a30d..44908278 100644 --- a/matchzoo/utils/bert_utils.py +++ b/matchzoo/utils/bert_utils.py @@ -5,12 +5,11 @@ def is_whitespace(char): """Checks whether `chars` is a whitespace character.""" # \t, \n, and \r are technically contorl characters but we treat them # as whitespace since they are generally considered as such. - if char == " " or char == "\t" or char == "\n" or char == "\r": - return True - cat = unicodedata.category(char) - if cat == "Zs": - return True - return False + return (char == " ") or \ + (char == "\t") or \ + (char == "\n") or \ + (char == "\r") or \ + (unicodedata.category(char) == "Zs") def is_control(char): @@ -34,10 +33,8 @@ def is_punctuation(char): # consistency. condition = (33 <= cp <= 47) or (58 <= cp <= 64) or \ (91 <= cp <= 96) or (123 <= cp <= 126) - if condition: - return True cat = unicodedata.category(char) - if cat.startswith("P"): + if condition or cat.startswith("P"): return True return False @@ -98,7 +95,5 @@ def run_split_on_punc(text): def whitespace_tokenize(text): """Runs basic whitespace cleaning and splitting on a piece of text.""" text = text.strip() - if not text: - return [] tokens = text.split() return tokens From 458a29dbd25a137372374ba4e039a24fa383f6aa Mon Sep 17 00:00:00 2001 From: jellying <469413628@qq.com> Date: Thu, 30 May 2019 11:35:57 +0800 Subject: [PATCH 075/100] fix some style problems --- matchzoo/preprocessors/units/__init__.py | 2 +- matchzoo/preprocessors/units/tokenize.py | 8 ++++++-- matchzoo/preprocessors/units/vocabulary.py | 2 +- matchzoo/utils/bert_utils.py | 9 ++------- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/matchzoo/preprocessors/units/__init__.py b/matchzoo/preprocessors/units/__init__.py index e6ba360a..71bd7468 100644 --- a/matchzoo/preprocessors/units/__init__.py +++ b/matchzoo/preprocessors/units/__init__.py @@ -15,7 +15,7 @@ from .word_hashing import WordHashing from .bert_clean import BertClean from .bert_clean import StripAccent -from.tokenize import ChineseTokenize +from .tokenize import ChineseTokenize from .tokenize import BasicTokenize from .tokenize import WordPieceTokenize from .vocabulary import BertVocabulary diff --git a/matchzoo/preprocessors/units/tokenize.py b/matchzoo/preprocessors/units/tokenize.py index 51d97de6..befdcc56 100644 --- a/matchzoo/preprocessors/units/tokenize.py +++ b/matchzoo/preprocessors/units/tokenize.py @@ -80,8 +80,12 @@ def transform(self, input_: list) -> list: tokenization using the given vocabulary. For example: - input = "unaffable" - output = ["un", "##aff", "##able"] + >>> input_list = ["unaffable"] + >>> vocab = {"un": 0, "##aff": 1, "##able":2} + >>> wordpiece_unit = WordPieceTokenize(vocab) + >>> output = wordpiece_unit.transform(input_list) + >>> golden_output = ["un", "##aff", "##able"] + >>> assert output == golden_output :param input_: token list. diff --git a/matchzoo/preprocessors/units/vocabulary.py b/matchzoo/preprocessors/units/vocabulary.py index 1ed62bc5..711e4d50 100644 --- a/matchzoo/preprocessors/units/vocabulary.py +++ b/matchzoo/preprocessors/units/vocabulary.py @@ -88,7 +88,7 @@ def __init__(self, pad_value: str = '[PAD]', oov_value: str = '[UNK]'): self._pad = pad_value self._oov = oov_value self._context['term_index'] = self.TermIndex() - self._context['index_term'] = dict() + self._context['index_term'] = {} class TermIndex(dict): """Map term to index.""" diff --git a/matchzoo/utils/bert_utils.py b/matchzoo/utils/bert_utils.py index 44908278..8490ddbb 100644 --- a/matchzoo/utils/bert_utils.py +++ b/matchzoo/utils/bert_utils.py @@ -19,7 +19,7 @@ def is_control(char): if char == "\t" or char == "\n" or char == "\r": return False cat = unicodedata.category(char) - if cat in ("Cc", "Cf"): + if cat in ["Cc", "Cf"]: return True return False @@ -62,12 +62,7 @@ def is_chinese_char(cp): def run_strip_accents(text): """Strips accents from a piece of text.""" text = unicodedata.normalize("NFD", text) - output = [] - for char in text: - cat = unicodedata.category(char) - if cat == "Mn": - continue - output.append(char) + output = [char for char in text if not unicodedata.category(char) == 'Mn'] return "".join(output) From b0c356602777be7cd642d02971b69d106b771afe Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Sun, 2 Jun 2019 11:39:39 +0800 Subject: [PATCH 076/100] reduce test time --- matchzoo/preprocessors/diin_preprocessor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py index b8c5a4af..6fdb7eaf 100644 --- a/matchzoo/preprocessors/diin_preprocessor.py +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -16,9 +16,9 @@ class DIINPreprocessor(BasePreprocessor): """DIIN Model preprocessor.""" def __init__(self, - fixed_length_left: int = 10, - fixed_length_right: int = 10, - fixed_length_word: int = 5): + fixed_length_left: int = 5, + fixed_length_right: int = 5, + fixed_length_word: int = 3): """ DIIN Model preprocessor. From e37ff1715d35f152bd4351a2565f75c272195504 Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Wed, 5 Jun 2019 18:54:14 +0800 Subject: [PATCH 077/100] fix doctest --- matchzoo/preprocessors/diin_preprocessor.py | 22 +++++++++---------- .../preprocessors/units/character_index.py | 6 ++--- .../preprocessors/units/word_exact_match.py | 13 +++++++---- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py index 6fdb7eaf..51c8ecf1 100644 --- a/matchzoo/preprocessors/diin_preprocessor.py +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -16,9 +16,9 @@ class DIINPreprocessor(BasePreprocessor): """DIIN Model preprocessor.""" def __init__(self, - fixed_length_left: int = 5, - fixed_length_right: int = 5, - fixed_length_word: int = 3): + fixed_length_left: int = 10, + fixed_length_right: int = 10, + fixed_length_word: int = 5): """ DIIN Model preprocessor. @@ -30,26 +30,26 @@ def __init__(self, Example: >>> import matchzoo as mz - >>> train_data = mz.datasets.snli.load_data('train') - >>> test_data = mz.datasets.snli.load_data('test') + >>> train_data = mz.datasets.toy.load_data() + >>> test_data = mz.datasets.toy.load_data(stage='test') >>> diin_preprocessor = mz.preprocessors.DIINPreprocessor( - ... fixed_length_left=32, - ... fixed_length_right=32, - ... fixed_length_word=16, + ... fixed_length_left=5, + ... fixed_length_right=5, + ... fixed_length_word=3, ... ) >>> diin_preprocessor = diin_preprocessor.fit( ... train_data, verbose=0) >>> diin_preprocessor.context['input_shapes'] - [(32,), (32,), (32,16,), (32,16,), (32,), (32,)] + [(5,), (5,), (5, 3), (5, 3), (5,), (5,)] >>> diin_preprocessor.context['vocab_size'] - 33061 + 859 >>> train_data_processed = diin_preprocessor.transform( ... train_data, verbose=0) >>> type(train_data_processed) >>> test_data_processed = diin_preprocessor.transform( ... test_data, verbose=0) - >>> type(test_data_transformed) + >>> type(test_data_processed) """ super().__init__() diff --git a/matchzoo/preprocessors/units/character_index.py b/matchzoo/preprocessors/units/character_index.py index ae2a46cd..52718c9e 100644 --- a/matchzoo/preprocessors/units/character_index.py +++ b/matchzoo/preprocessors/units/character_index.py @@ -18,12 +18,12 @@ class CharacterIndex(Unit): >>> input_ = [['#', 'a', '#'],['#', 'o', 'n', 'e', '#']] >>> character_index = CharacterIndex( ... char_index={ - '': 0, '': 1, 'a': 2, 'n': 3, 'e':4, '#':5}, - ... fixed_length_text=3, + ... '': 0, '': 1, 'a': 2, 'n': 3, 'e':4, '#':5}, + ... fixed_length_text=2, ... fixed_length_word=5) >>> index = character_index.transform(input_) >>> index - [[5, 2, 5, 0, 0], [5, 1, 3, 4, 5], [0, 0, 0, 0, 0]] + [[5.0, 2.0, 5.0, 0.0, 0.0], [5.0, 1.0, 3.0, 4.0, 5.0]] """ def __init__( diff --git a/matchzoo/preprocessors/units/word_exact_match.py b/matchzoo/preprocessors/units/word_exact_match.py index 68a7834b..d08562ab 100644 --- a/matchzoo/preprocessors/units/word_exact_match.py +++ b/matchzoo/preprocessors/units/word_exact_match.py @@ -1,4 +1,5 @@ import numpy as np +import pandas from .unit import Unit @@ -20,15 +21,19 @@ class WordExactMatch(Unit): ... match='text_left', to_match='text_right' ... ) >>> left_out = input_.apply(left_word_exact_match.transform, axis=1) - >>> left_out - [[0, 1, 1, 0, 0],[0, 1, 0, 0, 0]] + >>> left_out[0] + [0.0, 1.0, 1.0, 0.0, 0.0] + >>> left_out[1] + [0.0, 1.0, 0.0, 0.0, 0.0] >>> right_word_exact_match = WordExactMatch( ... fixed_length_text=5, ... match='text_right', to_match='text_left' ... ) >>> right_out = input_.apply(right_word_exact_match.transform, axis=1) - >>> right_out - [[0, 1, 1, 0, 0], [0, 0, 1, 0, 0]] + >>> right_out[0] + [0.0, 1.0, 1.0, 0.0, 0.0] + >>> right_out[1] + [0.0, 0.0, 1.0, 0.0, 0.0] """ def __init__( From 093e3124acdc903be1eea5ead252d4cf3b862190 Mon Sep 17 00:00:00 2001 From: caiyinqiong <1198593462@qq.com> Date: Wed, 5 Jun 2019 19:56:16 +0800 Subject: [PATCH 078/100] fix flake8 error --- matchzoo/preprocessors/diin_preprocessor.py | 4 ++-- matchzoo/preprocessors/units/character_index.py | 1 + matchzoo/preprocessors/units/word_exact_match.py | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py index 51c8ecf1..4985e3a2 100644 --- a/matchzoo/preprocessors/diin_preprocessor.py +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -51,6 +51,7 @@ def __init__(self, ... test_data, verbose=0) >>> type(test_data_processed) + """ super().__init__() self._fixed_length_left = fixed_length_left @@ -103,8 +104,7 @@ def fit(self, data_pack: DataPack, verbose: int = 1): def transform(self, data_pack: DataPack, verbose: int = 1) -> DataPack: """ - Apply transformation on data, create fixed length word representation, - character representation and exact match representation. + Apply transformation on data. :param data_pack: Inputs to be preprocessed. :param verbose: Verbosity. diff --git a/matchzoo/preprocessors/units/character_index.py b/matchzoo/preprocessors/units/character_index.py index 52718c9e..17126765 100644 --- a/matchzoo/preprocessors/units/character_index.py +++ b/matchzoo/preprocessors/units/character_index.py @@ -24,6 +24,7 @@ class CharacterIndex(Unit): >>> index = character_index.transform(input_) >>> index [[5.0, 2.0, 5.0, 0.0, 0.0], [5.0, 1.0, 3.0, 4.0, 5.0]] + """ def __init__( diff --git a/matchzoo/preprocessors/units/word_exact_match.py b/matchzoo/preprocessors/units/word_exact_match.py index d08562ab..717b196d 100644 --- a/matchzoo/preprocessors/units/word_exact_match.py +++ b/matchzoo/preprocessors/units/word_exact_match.py @@ -34,6 +34,7 @@ class WordExactMatch(Unit): [0.0, 1.0, 1.0, 0.0, 0.0] >>> right_out[1] [0.0, 0.0, 1.0, 0.0, 0.0] + """ def __init__( From 61414aa76252683d24441059f995ff16b4031c35 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 26 Jun 2019 15:15:32 +0800 Subject: [PATCH 079/100] Fix macOS CI (#759) --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5599f633..aa960a88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,11 +16,8 @@ matrix: dist: trusty python: 3.6 - os: osx - language: generic - env: PYTHON_VERSION=3.6 - - os: osx - language: generic - env: PYTHON_VERSION=3.7 + osx_image: xcode10.2 + language: shell install: - pip3 install -r requirements.txt From 88d949c5a9be1cbf838e8b833e2f6f5e0be1d539 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 1 Jul 2019 16:59:12 +0800 Subject: [PATCH 080/100] Fix cron job (#761) * Fix cron job * Reduce parameters --- matchzoo/contrib/models/bimpm.py | 6 +++--- matchzoo/contrib/models/diin.py | 12 ++++++------ matchzoo/contrib/models/esim.py | 2 +- matchzoo/contrib/models/hbmp.py | 10 +++++----- tests/unit_test/models/test_models.py | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/matchzoo/contrib/models/bimpm.py b/matchzoo/contrib/models/bimpm.py index b5ee162f..112967ea 100644 --- a/matchzoo/contrib/models/bimpm.py +++ b/matchzoo/contrib/models/bimpm.py @@ -43,9 +43,9 @@ def get_default_params(cls) -> ParamTable: 'max-pooling': True, 'attentive': True, 'max-attentive': True})) - params.add(Param('mp_dim', 20)) - params.add(Param('att_dim', 20)) - params.add(Param('hidden_size', 32)) + params.add(Param('mp_dim', 3)) + params.add(Param('att_dim', 3)) + params.add(Param('hidden_size', 4)) params.add(Param('dropout_rate', 0.0)) params.add(Param('w_initializer', 'glorot_uniform')) params.add(Param('b_initializer', 'zeros')) diff --git a/matchzoo/contrib/models/diin.py b/matchzoo/contrib/models/diin.py index 52045b59..3ab3632b 100644 --- a/matchzoo/contrib/models/diin.py +++ b/matchzoo/contrib/models/diin.py @@ -49,24 +49,24 @@ def get_default_params(cls) -> ParamTable: params.add(Param(name='char_embedding_input_dim', value=100, desc="The input dimension of character embedding " "layer.")) - params.add(Param(name='char_embedding_output_dim', value=8, + params.add(Param(name='char_embedding_output_dim', value=2, desc="The output dimension of character embedding " "layer.")) - params.add(Param(name='char_conv_filters', value=100, + params.add(Param(name='char_conv_filters', value=8, desc="The filter size of character convolution " "layer.")) - params.add(Param(name='char_conv_kernel_size', value=5, + params.add(Param(name='char_conv_kernel_size', value=2, desc="The kernel size of character convolution " "layer.")) params.add(Param(name='first_scale_down_ratio', value=0.3, desc="The channel scale down ratio of the " "convolution layer before densenet.")) - params.add(Param(name='nb_dense_blocks', value=3, + params.add(Param(name='nb_dense_blocks', value=1, desc="The number of blocks in densenet.")) - params.add(Param(name='layers_per_dense_block', value=8, + params.add(Param(name='layers_per_dense_block', value=2, desc="The number of convolution layers in dense " "block.")) - params.add(Param(name='growth_rate', value=20, + params.add(Param(name='growth_rate', value=2, desc="The filter size of each convolution layer in " "dense block.")) params.add(Param(name='transition_scale_down_ratio', value=0.5, diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index 4af0371c..e5e5f851 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -47,7 +47,7 @@ def get_default_params(cls) -> ParamTable: params.add(Param( name='lstm_dim', - value=300, + value=8, desc="The dimension of LSTM layer." )) diff --git a/matchzoo/contrib/models/hbmp.py b/matchzoo/contrib/models/hbmp.py index 342ec53b..bc16605d 100644 --- a/matchzoo/contrib/models/hbmp.py +++ b/matchzoo/contrib/models/hbmp.py @@ -15,13 +15,13 @@ class HBMP(BaseModel): Examples: >>> model = HBMP() >>> model.guess_and_fill_missing_params(verbose=0) - >>> model.params['embedding_input_dim'] = 10000 + >>> model.params['embedding_input_dim'] = 200 >>> model.params['embedding_output_dim'] = 100 >>> model.params['embedding_trainable'] = True >>> model.params['alpha'] = 0.1 >>> model.params['mlp_num_layers'] = 3 - >>> model.params['mlp_num_units'] = [600, 600] - >>> model.params['lstm_num_units'] = 600 + >>> model.params['mlp_num_units'] = [10, 10] + >>> model.params['lstm_num_units'] = 5 >>> model.params['dropout_rate'] = 0.1 >>> model.build() """ @@ -36,10 +36,10 @@ def get_default_params(cls) -> ParamTable: "function.")) params.add(Param(name='mlp_num_layers', value=3, desc="The number of layers of mlp.")) - params.add(Param(name='mlp_num_units', value=[600, 600], + params.add(Param(name='mlp_num_units', value=[10, 10], desc="The hidden size of the FC layers, but not " "include the final layer.")) - params.add(Param(name='lstm_num_units', value=600, + params.add(Param(name='lstm_num_units', value=5, desc="The hidden size of the LSTM layer.")) params.add(Param( name='dropout_rate', value=0.1, diff --git a/tests/unit_test/models/test_models.py b/tests/unit_test/models/test_models.py index 3d6c994c..828a8b62 100644 --- a/tests/unit_test/models/test_models.py +++ b/tests/unit_test/models/test_models.py @@ -21,7 +21,7 @@ def task(request): @pytest.fixture(scope='module') def train_raw(task): - return mz.datasets.toy.load_data('train', task) + return mz.datasets.toy.load_data('train', task)[:5] @pytest.fixture(scope='module', params=mz.models.list_available()) @@ -97,7 +97,7 @@ def test_save_load_model(model): @pytest.mark.cron def test_hyper_space(model): - for _ in range(8): + for _ in range(2): new_params = copy.deepcopy(model.params) sample = mz.hyper_spaces.sample(new_params.hyper_space) for key, value in sample.items(): From 80537130be0e5ab87859af87104649f857ad986f Mon Sep 17 00:00:00 2001 From: faneshion Date: Mon, 15 Jul 2019 11:14:37 +0800 Subject: [PATCH 081/100] add drop_invlid (#765) --- matchzoo/data_pack/data_pack.py | 26 ++++++++++++++++++++++++++ requirements.txt | 1 + 2 files changed, 27 insertions(+) diff --git a/matchzoo/data_pack/data_pack.py b/matchzoo/data_pack/data_pack.py index df2f1746..5b3e862d 100644 --- a/matchzoo/data_pack/data_pack.py +++ b/matchzoo/data_pack/data_pack.py @@ -294,6 +294,32 @@ def drop_label(self): """ self._relation = self._relation.drop(columns='label') + @_optional_inplace + def drop_invalid(self): + """ + Remove rows from the data pack where the length is zero. + + :param inplace: `True` to modify inplace, `False` to return a modified + copy. (default: `False`) + + Example: + >>> import matchzoo as mz + >>> data_pack = mz.datasets.toy.load_data() + >>> data_pack.append_text_length(inplace=True, verbose=0) + >>> data_pack.drop_invalid(inplace=True) + """ + if not ('length_left' in self._left and 'length_right' in self._right): + raise ValueError(f"`lenght_left` or `length_right` is missing. " + f"Please call `append_text_length` in advance.") + valid_left = self._left.loc[self._left.length_left != 0] + valid_right = self._right.loc[self._right.length_right != 0] + self._left = self._left[self._left.index.isin(valid_left.index)] + self._right = self._right[self._right.index.isin(valid_right.index)] + self._relation = self._relation[self._relation.id_left.isin( + valid_left.index) & self._relation.id_right.isin( + valid_right.index)] + self._relation.reset_index(drop=True, inplace=True) + @_optional_inplace def append_text_length(self, verbose=1): """ diff --git a/requirements.txt b/requirements.txt index 9b04fcd7..7582150e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ pytest >= 3.7.4 pytest-cov >= 2.4.0 flake8 >= 3.6.0 flake8_docstrings >= 1.3.0 +pydocstyle == 2.1 From 4b86b0891acf665cf27ad565785910036d0337a8 Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 17 Jul 2019 12:58:11 +0800 Subject: [PATCH 082/100] Replace operator `/` with `//`. Extract a validation method to get a `dpool_size` suggestion. --- matchzoo/layers/dynamic_pooling_layer.py | 35 ++++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/matchzoo/layers/dynamic_pooling_layer.py b/matchzoo/layers/dynamic_pooling_layer.py index 40b989f7..47b46bd6 100644 --- a/matchzoo/layers/dynamic_pooling_layer.py +++ b/matchzoo/layers/dynamic_pooling_layer.py @@ -49,6 +49,7 @@ def call(self, inputs: list, **kwargs) -> typing.Any: :param inputs: two input tensors. """ + self.validate_dpool_size() x, dpool_index = inputs dpool_shape = K.tf.shape(dpool_index) batch_index_one = K.tf.expand_dims( @@ -60,18 +61,8 @@ def call(self, inputs: list, **kwargs) -> typing.Any: axis=-1) dpool_index_ex = K.tf.concat([batch_index, dpool_index], axis=3) x_expand = K.tf.gather_nd(x, dpool_index_ex) - stride1 = self._msize1 / self._psize1 - stride2 = self._msize2 / self._psize2 - - suggestion1 = self._msize1 / stride1 - suggestion2 = self._msize2 / stride2 - - if suggestion1 != self._psize1 or suggestion2 != self._psize2: - raise ValueError("DynamicPooling Layer can not " - "generate ({} x {}) output feature map, " - "please use ({} x {} instead.)" - .format(self._psize1, self._psize2, - suggestion1, suggestion2)) + stride1 = self._msize1 // self._psize1 + stride2 = self._msize2 // self._psize2 x_pool = K.tf.nn.max_pool(x_expand, [1, stride1, stride2, 1], @@ -97,3 +88,23 @@ def get_config(self) -> dict: } base_config = super(DynamicPoolingLayer, self).get_config() return dict(list(base_config.items()) + list(config.items())) + + def validate_dpool_size(self): + suggestion = self.get_size_suggestion( + self._msize1, self._msize2, self._psize1, self._psize2 + ) + if suggestion != (self._psize1, self._psize2): + raise ValueError( + "DynamicPooling Layer can not " + f"generate ({self._psize1} x {self._psize2}) output feature map, " + f"please use ({suggestion[0]} x {suggestion[1]}) instead. " + f" `model.params['dpool_size'] = {suggestion}` " + ) + + @classmethod + def get_size_suggestion(cls, msize1, msize2, psize1, psize2): + stride1 = msize1 // psize1 + stride2 = msize2 // psize2 + suggestion1 = msize1 // stride1 + suggestion2 = msize2 // stride2 + return (suggestion1, suggestion2) From 8cd3df713e23c8e9e8e72829737106c0eca96ec5 Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 17 Jul 2019 12:58:56 +0800 Subject: [PATCH 083/100] Update `auto.prepare` to select the nearest legal `dpool_size` based on the given lengths. --- matchzoo/auto/preparer/preparer.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/matchzoo/auto/preparer/preparer.py b/matchzoo/auto/preparer/preparer.py index 1e5b5fb0..eef74f91 100644 --- a/matchzoo/auto/preparer/preparer.py +++ b/matchzoo/auto/preparer/preparer.py @@ -137,6 +137,7 @@ def _build_model( else: embedding_matrix = None + self._handle_match_pyramid_dpool_size(model) self._handle_drmm_input_shapes(model) assert model.params.completed() @@ -148,6 +149,16 @@ def _build_model( return model, embedding_matrix + def _handle_match_pyramid_dpool_size(self, model): + if isinstance(model, mz.models.MatchPyramid): + suggestion = mz.layers.DynamicPoolingLayer.get_size_suggestion( + msize1=model.params['input_shapes'][0][0], + msize2=model.params['input_shapes'][1][0], + psize1=model.params['dpool_size'][0], + psize2=model.params['dpool_size'][1], + ) + model.params['dpool_size'] = suggestion + def _handle_drmm_input_shapes(self, model): if isinstance(model, mz.models.DRMM): left = model.params['input_shapes'][0] From d8292c8caa6b2bd8245ba51e00411a6c44d5f775 Mon Sep 17 00:00:00 2001 From: uduse Date: Wed, 17 Jul 2019 14:38:52 +0800 Subject: [PATCH 084/100] Update doc. --- matchzoo/layers/dynamic_pooling_layer.py | 30 +++++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/matchzoo/layers/dynamic_pooling_layer.py b/matchzoo/layers/dynamic_pooling_layer.py index 47b46bd6..27b37888 100644 --- a/matchzoo/layers/dynamic_pooling_layer.py +++ b/matchzoo/layers/dynamic_pooling_layer.py @@ -49,7 +49,7 @@ def call(self, inputs: list, **kwargs) -> typing.Any: :param inputs: two input tensors. """ - self.validate_dpool_size() + self._validate_dpool_size() x, dpool_index = inputs dpool_shape = K.tf.shape(dpool_index) batch_index_one = K.tf.expand_dims( @@ -89,20 +89,38 @@ def get_config(self) -> dict: base_config = super(DynamicPoolingLayer, self).get_config() return dict(list(base_config.items()) + list(config.items())) - def validate_dpool_size(self): + def _validate_dpool_size(self): suggestion = self.get_size_suggestion( self._msize1, self._msize2, self._psize1, self._psize2 ) if suggestion != (self._psize1, self._psize2): raise ValueError( "DynamicPooling Layer can not " - f"generate ({self._psize1} x {self._psize2}) output feature map, " - f"please use ({suggestion[0]} x {suggestion[1]}) instead. " - f" `model.params['dpool_size'] = {suggestion}` " + f"generate ({self._psize1} x {self._psize2}) output " + f"feature map, please use ({suggestion[0]} x {suggestion[1]})" + f" instead. `model.params['dpool_size'] = {suggestion}` " ) @classmethod - def get_size_suggestion(cls, msize1, msize2, psize1, psize2): + def get_size_suggestion( + cls, + msize1: int, + msize2: int, + psize1: int, + psize2: int + ) -> typing.Tuple[int, int]: + """ + Get `dpool_size` suggestion for a given shape. + + Returns the nearest legal `dpool_size` for the given combination of + `(psize1, psize2)`. + + :param msize1: size of the left text. + :param msize2: size of the right text. + :param psize1: base size of the pool. + :param psize2: base size of the pool. + :return: + """ stride1 = msize1 // psize1 stride2 = msize2 // psize2 suggestion1 = msize1 // stride1 From 8d4dffd879eec26ad8098039b1aa84d149cd3799 Mon Sep 17 00:00:00 2001 From: bo Date: Tue, 23 Jul 2019 16:31:39 +0200 Subject: [PATCH 085/100] replace regex with string.translate --- matchzoo/preprocessors/units/punc_removal.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/matchzoo/preprocessors/units/punc_removal.py b/matchzoo/preprocessors/units/punc_removal.py index 302a4702..af55d582 100644 --- a/matchzoo/preprocessors/units/punc_removal.py +++ b/matchzoo/preprocessors/units/punc_removal.py @@ -1,4 +1,4 @@ -import re +import string from .unit import Unit @@ -6,8 +6,6 @@ class PuncRemoval(Unit): """Process unit for remove punctuations.""" - _MATCH_PUNC = re.compile(r'[^\w\s]') - def transform(self, input_: list) -> list: """ Remove punctuations from list of tokens. @@ -16,5 +14,5 @@ def transform(self, input_: list) -> list: :return rv: tokens without punctuation. """ - return [token for token in input_ if - not self._MATCH_PUNC.search(token)] + table = str.maketrans({key: None for key in string.punctuation}) + return [item.translate(table) for item in input_] From b08390c30351e164928ad3d417642e4940d44dd0 Mon Sep 17 00:00:00 2001 From: bo Date: Tue, 23 Jul 2019 16:31:59 +0200 Subject: [PATCH 086/100] update doc test for punc remove unit --- matchzoo/preprocessors/basic_preprocessor.py | 2 +- matchzoo/preprocessors/diin_preprocessor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matchzoo/preprocessors/basic_preprocessor.py b/matchzoo/preprocessors/basic_preprocessor.py index d14af9f2..0fd82d37 100644 --- a/matchzoo/preprocessors/basic_preprocessor.py +++ b/matchzoo/preprocessors/basic_preprocessor.py @@ -44,7 +44,7 @@ class BasicPreprocessor(BasePreprocessor): >>> preprocessor.context['input_shapes'] [(10,), (20,)] >>> preprocessor.context['vocab_size'] - 226 + 228 >>> processed_train_data = preprocessor.transform(train_data, ... verbose=0) >>> type(processed_train_data) diff --git a/matchzoo/preprocessors/diin_preprocessor.py b/matchzoo/preprocessors/diin_preprocessor.py index 4985e3a2..7d64ed16 100644 --- a/matchzoo/preprocessors/diin_preprocessor.py +++ b/matchzoo/preprocessors/diin_preprocessor.py @@ -42,7 +42,7 @@ def __init__(self, >>> diin_preprocessor.context['input_shapes'] [(5,), (5,), (5, 3), (5, 3), (5,), (5,)] >>> diin_preprocessor.context['vocab_size'] - 859 + 893 >>> train_data_processed = diin_preprocessor.transform( ... train_data, verbose=0) >>> type(train_data_processed) From 000820326910e70e4076258d7527e1c3f5f9996b Mon Sep 17 00:00:00 2001 From: bo Date: Tue, 23 Jul 2019 16:44:03 +0200 Subject: [PATCH 087/100] resolve ci for pandas 0.2.5 conflict with tqdm --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7582150e..772b9465 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,10 +3,10 @@ tabulate >= 0.8.2 tensorflow >= 1.8.0 nltk >= 3.2.3 numpy >= 1.14 -tqdm >= 4.19.4 +tqdm >= 4.23.4 dill >= 0.2.7.1 hyperopt >= 0.1.1 -pandas >= 0.23.1 +pandas == 0.24.2 networkx >= 2.1 h5py >= 2.8.0 coverage >= 4.3.4 From 4a39fbe345ae69e76994d67b89fd96a315f1d0ee Mon Sep 17 00:00:00 2001 From: jibrilfrej Date: Wed, 7 Aug 2019 12:23:46 +0200 Subject: [PATCH 088/100] Update rank_cross_entropy_loss.py --- matchzoo/losses/rank_cross_entropy_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matchzoo/losses/rank_cross_entropy_loss.py b/matchzoo/losses/rank_cross_entropy_loss.py index 2be64023..9bf56f43 100644 --- a/matchzoo/losses/rank_cross_entropy_loss.py +++ b/matchzoo/losses/rank_cross_entropy_loss.py @@ -48,7 +48,7 @@ def __call__(self, y_true: np.array, y_pred: np.array) -> np.array: labels.append(neg_labels) logits = K.concatenate(logits, axis=-1) labels = K.concatenate(labels, axis=-1) - return -K.mean(K.sum(labels * K.log(K.softmax(logits)), axis=-1)) + return -K.mean(K.sum(labels * K.log(K.softmax(logits) + np.finfo(float).eps), axis=-1)) @property def num_neg(self): From 2bfbc89449e05c7b0a7473707e053b7faae7b1c1 Mon Sep 17 00:00:00 2001 From: Crystina Date: Sun, 11 Aug 2019 21:25:34 +0800 Subject: [PATCH 089/100] Feature/esim quora tutorial (#766) * refactor cdssm tutorial (#694) * refactor dssm tutorial (#705) * refactor cdssm tutorial for branch master (#708) * fix cron CI * add esim tutorial for quora dataset * add acc callback to categorical task * undo the requirement changes --- tutorials/quora/esim.ipynb | 675 +++++++++++++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 tutorials/quora/esim.ipynb diff --git a/tutorials/quora/esim.ipynb b/tutorials/quora/esim.ipynb new file mode 100644 index 00000000..4bdf927a --- /dev/null +++ b/tutorials/quora/esim.ipynb @@ -0,0 +1,675 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "matchzoo version 2.1.0\n", + "\n", + "data loading ...\n", + "data loaded as `train_pack_raw` `dev_pack_raw` `test_pack_raw`\n", + "`ranking_task` initialized with metrics [normalized_discounted_cumulative_gain@3(0.0), normalized_discounted_cumulative_gain@5(0.0), mean_average_precision(0.0)]\n", + "loading embedding ...\n", + "embedding loaded as `glove_embedding`\n" + ] + } + ], + "source": [ + "%run ./tutorials/wikiqa/init.ipynb" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from keras.optimizers import Adam\n", + "from keras.utils import to_categorical\n", + "\n", + "import matchzoo as mz\n", + "from matchzoo.contrib.models.esim import ESIM" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def load_filtered_data(preprocessor, data_type):\n", + " assert ( data_type in ['train', 'dev', 'test'])\n", + " data_pack = mz.datasets.wiki_qa.load_data(data_type, task='ranking')\n", + "\n", + " if data_type == 'train':\n", + " X, Y = preprocessor.fit_transform(data_pack).unpack()\n", + " else:\n", + " X, Y = preprocessor.transform(data_pack).unpack()\n", + "\n", + " new_idx = []\n", + " for i in range(Y.shape[0]):\n", + " if X[\"length_left\"][i] == 0 or X[\"length_right\"][i] == 0:\n", + " continue\n", + " new_idx.append(i)\n", + " new_idx = np.array(new_idx)\n", + " print(\"Removed empty data. Found \", (Y.shape[0] - new_idx.shape[0]))\n", + "\n", + " for k in X.keys():\n", + " X[k] = X[k][new_idx]\n", + " Y = Y[new_idx]\n", + "\n", + " pos_idx = (Y == 1)[:, 0]\n", + " pos_qid = X[\"id_left\"][pos_idx]\n", + " keep_idx_bool = np.array([ qid in pos_qid for qid in X[\"id_left\"]])\n", + " keep_idx = np.arange(keep_idx_bool.shape[0])\n", + " keep_idx = keep_idx[keep_idx_bool]\n", + " print(\"Removed questions with no pos label. Found \", (keep_idx_bool == 0).sum())\n", + "\n", + " print(\"shuffling...\")\n", + " np.random.shuffle(keep_idx)\n", + " for k in X.keys():\n", + " X[k] = X[k][keep_idx]\n", + " Y = Y[keep_idx]\n", + "\n", + " return X, Y, preprocessor" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "fixed_length_left = 10\n", + "fixed_length_right = 40\n", + "batch_size = 32\n", + "epochs = 5" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 10798.93it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 18841/18841 [00:02<00:00, 8019.65it/s]\n", + "Processing text_right with append: 100%|██████████| 18841/18841 [00:00<00:00, 1415354.12it/s]\n", + "Building FrequencyFilter from a datapack.: 100%|██████████| 18841/18841 [00:00<00:00, 226166.63it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 233892.08it/s]\n", + "Processing text_left with extend: 100%|██████████| 2118/2118 [00:00<00:00, 782897.32it/s]\n", + "Processing text_right with extend: 100%|██████████| 18841/18841 [00:00<00:00, 1175423.27it/s]\n", + "Building Vocabulary from a datapack.: 100%|██████████| 358408/358408 [00:00<00:00, 4845654.07it/s]\n", + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 2118/2118 [00:00<00:00, 15108.05it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 18841/18841 [00:02<00:00, 8129.15it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 222548.25it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 324738.11it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 122413.67it/s]\n", + "Processing length_left with len: 100%|██████████| 2118/2118 [00:00<00:00, 821484.73it/s]\n", + "Processing length_right with len: 100%|██████████| 18841/18841 [00:00<00:00, 1319786.92it/s]\n", + "Processing text_left with transform: 100%|██████████| 2118/2118 [00:00<00:00, 200871.36it/s]\n", + "Processing text_right with transform: 100%|██████████| 18841/18841 [00:00<00:00, 180842.83it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed empty data. Found 91\n", + "Removed questions with no pos label. Found 11642\n", + "shuffling...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Processing text_left with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 296/296 [00:00<00:00, 15853.43it/s]\n", + "Processing text_right with chain_transform of Tokenize => Lowercase => PuncRemoval: 100%|██████████| 2708/2708 [00:00<00:00, 8318.22it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 232964.32it/s]\n", + "Processing text_left with transform: 100%|██████████| 296/296 [00:00<00:00, 200892.23it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 231808.96it/s]\n", + "Processing length_left with len: 100%|██████████| 296/296 [00:00<00:00, 562279.88it/s]\n", + "Processing length_right with len: 100%|██████████| 2708/2708 [00:00<00:00, 1159470.73it/s]\n", + "Processing text_left with transform: 100%|██████████| 296/296 [00:00<00:00, 183357.55it/s]\n", + "Processing text_right with transform: 100%|██████████| 2708/2708 [00:00<00:00, 178815.40it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed empty data. Found 8\n", + "Removed questions with no pos label. Found 1595\n", + "shuffling...\n" + ] + } + ], + "source": [ + "# prepare data\n", + "preprocessor = mz.preprocessors.BasicPreprocessor(fixed_length_left=fixed_length_left,\n", + " fixed_length_right=fixed_length_right,\n", + " remove_stop_words=False,\n", + " filter_low_freq=10)\n", + "\n", + "train_X, train_Y, preprocessor = load_filtered_data(preprocessor, 'train')\n", + "val_X, val_Y, _ = load_filtered_data(preprocessor, 'dev')\n", + "pred_X, pred_Y = val_X, val_Y\n", + "# pred_X, pred_Y, _ = load_filtered_data(preprocessor, 'test') # no prediction label for quora dataset\n", + "\n", + "embedding_matrix = glove_embedding.build_matrix(preprocessor.context['vocab_unit'].state['term_index'], initializer=lambda: 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "text_left (InputLayer) (None, 10) 0 \n", + "__________________________________________________________________________________________________\n", + "text_right (InputLayer) (None, 40) 0 \n", + "__________________________________________________________________________________________________\n", + "embedding (Embedding) multiple 1930500 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "dropout_1 (Dropout) multiple 0 embedding[0][0] \n", + " embedding[1][0] \n", + " dense_1[0][0] \n", + " dense_1[1][0] \n", + " dense_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_1 (Lambda) multiple 0 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_1 (Bidirectional) multiple 1442400 dropout_1[0][0] \n", + " dropout_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_2 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_3 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_1 (Multiply) (None, 10, 600) 0 bidirectional_1[0][0] \n", + " lambda_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_2 (Multiply) (None, 40, 600) 0 bidirectional_1[1][0] \n", + " lambda_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_4 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_5 (Lambda) (None, 1, 40) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_1 (Dot) (None, 10, 40) 0 multiply_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_3 (Multiply) (None, 10, 40) 0 lambda_4[0][0] \n", + " lambda_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "permute_1 (Permute) (None, 40, 10) 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "atten_mask (Lambda) multiple 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + " permute_1[0][0] \n", + " permute_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "softmax_1 (Softmax) multiple 0 atten_mask[0][0] \n", + " atten_mask[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_2 (Dot) (None, 10, 600) 0 softmax_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "dot_3 (Dot) (None, 40, 600) 0 softmax_1[1][0] \n", + " multiply_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_1 (Subtract) (None, 10, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_4 (Multiply) (None, 10, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_2 (Subtract) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_5 (Multiply) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 10, 2400) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + " subtract_1[0][0] \n", + " multiply_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_2 (Concatenate) (None, 40, 2400) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + " subtract_2[0][0] \n", + " multiply_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_1 (Dense) multiple 720300 concatenate_1[0][0] \n", + " concatenate_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_2 (Bidirectional) multiple 1442400 dropout_1[2][0] \n", + " dropout_1[3][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_6 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_8 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_10 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_12 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_6 (Multiply) (None, 10, 600) 0 bidirectional_2[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_7 (Multiply) (None, 10, 600) 0 bidirectional_2[0][0] \n", + " lambda_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_8 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_9 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_7 (Lambda) (None, 600) 0 multiply_6[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_9 (Lambda) (None, 600) 0 multiply_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_11 (Lambda) (None, 600) 0 multiply_8[0][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_13 (Lambda) (None, 600) 0 multiply_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_3 (Concatenate) (None, 1200) 0 lambda_7[0][0] \n", + " lambda_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_4 (Concatenate) (None, 1200) 0 lambda_11[0][0] \n", + " lambda_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_5 (Concatenate) (None, 2400) 0 concatenate_3[0][0] \n", + " concatenate_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_2 (Dense) (None, 300) 720300 concatenate_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_3 (Dense) (None, 1) 301 dropout_1[4][0] \n", + "==================================================================================================\n", + "Total params: 6,256,201\n", + "Trainable params: 4,325,701\n", + "Non-trainable params: 1,930,500\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model = ESIM()\n", + "model.params['task'] = mz.tasks.Ranking()\n", + "model.params['mask_value'] = 0\n", + "model.params['input_shapes'] = [[fixed_length_left, ],\n", + " [fixed_length_right, ]]\n", + "model.params['lstm_dim'] = 300\n", + "model.params['embedding_input_dim'] = preprocessor.context['vocab_size']\n", + "model.params['embedding_output_dim'] = 300\n", + "model.params['embedding_trainable'] = False\n", + "model.params['dropout_rate'] = 0.5\n", + "\n", + "model.params['mlp_num_units'] = 300\n", + "model.params['mlp_num_layers'] = 0\n", + "model.params['mlp_num_fan_out'] = 300\n", + "model.params['mlp_activation_func'] = 'tanh'\n", + "model.params['optimizer'] = Adam(lr=4e-4)\n", + "\n", + "model.guess_and_fill_missing_params()\n", + "model.build()\n", + "\n", + "model.compile()\n", + "model.backend.summary() # not visualize" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 8627 samples, validate on 1130 samples\n", + "Epoch 1/5\n", + "8627/8627 [==============================] - 48s 6ms/step - loss: 0.1073 - val_loss: 0.0984\n", + "Validation: mean_average_precision(0.0): 0.6222655981584554\n", + "Epoch 2/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.0994 - val_loss: 0.0974\n", + "Validation: mean_average_precision(0.0): 0.640342571890191\n", + "Epoch 3/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.0944 - val_loss: 0.0981\n", + "Validation: mean_average_precision(0.0): 0.633281742507933\n", + "Epoch 4/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.0915 - val_loss: 0.0898\n", + "Validation: mean_average_precision(0.0): 0.6479046351993808\n", + "Epoch 5/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.0893 - val_loss: 0.0931\n", + "Validation: mean_average_precision(0.0): 0.6506805763854636\n" + ] + } + ], + "source": [ + "# run as classification task\n", + "model.load_embedding_matrix(embedding_matrix)\n", + "evaluate = mz.callbacks.EvaluateAllMetrics(model,\n", + " x=pred_X,\n", + " y=pred_Y,\n", + " once_every=1,\n", + " batch_size=len(pred_Y))\n", + "\n", + "history = model.fit(x = [train_X['text_left'],\n", + " train_X['text_right']],\n", + " y = train_Y,\n", + " validation_data = (val_X, val_Y),\n", + " batch_size = batch_size,\n", + " epochs = epochs,\n", + " callbacks=[evaluate]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "text_left (InputLayer) (None, 10) 0 \n", + "__________________________________________________________________________________________________\n", + "text_right (InputLayer) (None, 40) 0 \n", + "__________________________________________________________________________________________________\n", + "embedding (Embedding) multiple 1930500 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "dropout_1 (Dropout) multiple 0 embedding[0][0] \n", + " embedding[1][0] \n", + " dense_1[0][0] \n", + " dense_1[1][0] \n", + " dense_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_1 (Lambda) multiple 0 text_left[0][0] \n", + " text_right[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_1 (Bidirectional) multiple 1442400 dropout_1[0][0] \n", + " dropout_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_2 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_3 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_1 (Multiply) (None, 10, 600) 0 bidirectional_1[0][0] \n", + " lambda_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_2 (Multiply) (None, 40, 600) 0 bidirectional_1[1][0] \n", + " lambda_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_4 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_5 (Lambda) (None, 1, 40) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_1 (Dot) (None, 10, 40) 0 multiply_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_3 (Multiply) (None, 10, 40) 0 lambda_4[0][0] \n", + " lambda_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "permute_1 (Permute) (None, 40, 10) 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "atten_mask (Lambda) multiple 0 dot_1[0][0] \n", + " multiply_3[0][0] \n", + " permute_1[0][0] \n", + " permute_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "softmax_1 (Softmax) multiple 0 atten_mask[0][0] \n", + " atten_mask[1][0] \n", + "__________________________________________________________________________________________________\n", + "dot_2 (Dot) (None, 10, 600) 0 softmax_1[0][0] \n", + " multiply_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "dot_3 (Dot) (None, 40, 600) 0 softmax_1[1][0] \n", + " multiply_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_1 (Subtract) (None, 10, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_4 (Multiply) (None, 10, 600) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "subtract_2 (Subtract) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_5 (Multiply) (None, 40, 600) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 10, 2400) 0 multiply_1[0][0] \n", + " dot_2[0][0] \n", + " subtract_1[0][0] \n", + " multiply_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_2 (Concatenate) (None, 40, 2400) 0 multiply_2[0][0] \n", + " dot_3[0][0] \n", + " subtract_2[0][0] \n", + " multiply_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_1 (Dense) multiple 720300 concatenate_1[0][0] \n", + " concatenate_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "bidirectional_2 (Bidirectional) multiple 1442400 dropout_1[2][0] \n", + " dropout_1[3][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_6 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_8 (Lambda) (None, 10, 1) 0 lambda_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_10 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_12 (Lambda) (None, 40, 1) 0 lambda_1[1][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_6 (Multiply) (None, 10, 600) 0 bidirectional_2[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_7 (Multiply) (None, 10, 600) 0 bidirectional_2[0][0] \n", + " lambda_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_8 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_9 (Multiply) (None, 40, 600) 0 bidirectional_2[1][0] \n", + " lambda_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_7 (Lambda) (None, 600) 0 multiply_6[0][0] \n", + " lambda_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_9 (Lambda) (None, 600) 0 multiply_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_11 (Lambda) (None, 600) 0 multiply_8[0][0] \n", + " lambda_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "lambda_13 (Lambda) (None, 600) 0 multiply_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_3 (Concatenate) (None, 1200) 0 lambda_7[0][0] \n", + " lambda_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_4 (Concatenate) (None, 1200) 0 lambda_11[0][0] \n", + " lambda_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_5 (Concatenate) (None, 2400) 0 concatenate_3[0][0] \n", + " concatenate_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_2 (Dense) (None, 300) 720300 concatenate_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense_3 (Dense) (None, 2) 602 dropout_1[4][0] \n", + "==================================================================================================\n", + "Total params: 6,256,502\n", + "Trainable params: 4,326,002\n", + "Non-trainable params: 1,930,500\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "# run as classification task\n", + "classification_task = mz.tasks.Classification(num_classes=2)\n", + "classification_task.metrics = 'acc'\n", + "\n", + "model = ESIM()\n", + "model.params['task'] = classification_task\n", + "model.params['mask_value'] = 0\n", + "model.params['input_shapes'] = [[fixed_length_left, ],\n", + " [fixed_length_right, ]]\n", + "model.params['lstm_dim'] = 300\n", + "model.params['embedding_input_dim'] = preprocessor.context['vocab_size']\n", + "model.params['embedding_output_dim'] = 300\n", + "model.params['embedding_trainable'] = False\n", + "model.params['dropout_rate'] = 0.5\n", + "\n", + "model.params['mlp_num_units'] = 300\n", + "model.params['mlp_num_layers'] = 0\n", + "model.params['mlp_num_fan_out'] = 300\n", + "model.params['mlp_activation_func'] = 'tanh'\n", + "model.params['optimizer'] = Adam(lr=4e-4)\n", + "\n", + "model.guess_and_fill_missing_params()\n", + "model.build()\n", + "\n", + "model.compile()\n", + "model.backend.summary() # not visualize" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 8627 samples, validate on 1130 samples\n", + "Epoch 1/5\n", + "8627/8627 [==============================] - 48s 6ms/step - loss: 0.3607 - val_loss: 0.3330\n", + "Validation: categorical_accuracy: 1.0\n", + "Epoch 2/5\n", + "8627/8627 [==============================] - 43s 5ms/step - loss: 0.3273 - val_loss: 0.3490\n", + "Validation: categorical_accuracy: 0.9451327323913574\n", + "Epoch 3/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.3096 - val_loss: 0.3498\n", + "Validation: categorical_accuracy: 0.9938052892684937\n", + "Epoch 4/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.2970 - val_loss: 0.3170\n", + "Validation: categorical_accuracy: 0.969911515712738\n", + "Epoch 5/5\n", + "8627/8627 [==============================] - 44s 5ms/step - loss: 0.2787 - val_loss: 0.3543\n", + "Validation: categorical_accuracy: 0.8778761029243469\n" + ] + } + ], + "source": [ + "evaluate = mz.callbacks.EvaluateAllMetrics(model,\n", + " x=pred_X,\n", + " y=pred_Y,\n", + " once_every=1,\n", + " batch_size=len(pred_Y))\n", + "\n", + "train_Y = to_categorical(train_Y)\n", + "val_Y = to_categorical(val_Y)\n", + "\n", + "model.load_embedding_matrix(embedding_matrix)\n", + "history = model.fit(x = [train_X['text_left'],\n", + " train_X['text_right']],\n", + " y = train_Y,\n", + " validation_data = (val_X, val_Y),\n", + " batch_size = batch_size,\n", + " epochs = epochs,\n", + " callbacks=[evaluate]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'categorical_accuracy': 0.8920354}" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.evaluate(val_X, val_Y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mz_play", + "language": "python", + "name": "mz_play" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From acd533f89b64350667b70ff0f1fd4aacc69939f4 Mon Sep 17 00:00:00 2001 From: faneshion Date: Mon, 12 Aug 2019 00:23:21 +0800 Subject: [PATCH 090/100] update README --- README.md | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 97ef5ad0..0bc891d1 100644 --- a/README.md +++ b/README.md @@ -166,18 +166,29 @@ python setup.py install If you use MatchZoo in your research, please use the following BibTex entry. ``` -@article{fan2017matchzoo, - title={Matchzoo: A toolkit for deep text matching}, - author={Fan, Yixing and Pang, Liang and Hou, JianPeng and Guo, Jiafeng and Lan, Yanyan and Cheng, Xueqi}, - journal={arXiv preprint arXiv:1707.07270}, - year={2017} -} +@inproceedings{Guo:2019:MLP:3331184.3331403, + author = {Guo, Jiafeng and Fan, Yixing and Ji, Xiang and Cheng, Xueqi}, + title = {MatchZoo: A Learning, Practicing, and Developing System for Neural Text Matching}, + booktitle = {Proceedings of the 42Nd International ACM SIGIR Conference on Research and Development in Information Retrieval}, + series = {SIGIR'19}, + year = {2019}, + isbn = {978-1-4503-6172-9}, + location = {Paris, France}, + pages = {1297--1300}, + numpages = {4}, + url = {http://doi.acm.org/10.1145/3331184.3331403}, + doi = {10.1145/3331184.3331403}, + acmid = {3331403}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {matchzoo, neural network, text matching}, +} ``` ## Development Team -​ ​ ​ ​ ​ + ​ ​ ​ ​ From 7e1e7e300ee3c2da81151a48ccaa80557c72d73a Mon Sep 17 00:00:00 2001 From: "J.Hou" Date: Mon, 12 Aug 2019 10:20:50 +0800 Subject: [PATCH 091/100] Remove ":" in the title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bc891d1..14900a0e 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ python setup.py install ``` -## Models: +## Models 1. [DRMM](https://github.com/NTMC-Community/MatchZoo/tree/master/matchzoo/models/drmm.py): this model is an implementation of A Deep Relevance Matching Model for Ad-hoc Retrieval. From 60c0bb6d421e5db5c0e96c0fa1adae8e629e3c9e Mon Sep 17 00:00:00 2001 From: zhen Date: Sun, 1 Sep 2019 22:06:49 +0800 Subject: [PATCH 092/100] #714 add SemEval 16 dataset (#721) * #714 add SemEval 16 dataset * #714 add SemEval 16 dataset * #714 rename SemEval 16 to cqa_ql_16 dataset, and add test files * fix doctest error * fix style error in `load_data` * move `xml` to standard package scope --- matchzoo/datasets/__init__.py | 1 + matchzoo/datasets/cqa_ql_16/__init__.py | 1 + matchzoo/datasets/cqa_ql_16/load_data.py | 203 +++++++++++++++++++++++ tests/unit_test/test_datasets.py | 35 ++++ 4 files changed, 240 insertions(+) create mode 100644 matchzoo/datasets/cqa_ql_16/__init__.py create mode 100644 matchzoo/datasets/cqa_ql_16/load_data.py diff --git a/matchzoo/datasets/__init__.py b/matchzoo/datasets/__init__.py index 45f592ff..44eb4669 100644 --- a/matchzoo/datasets/__init__.py +++ b/matchzoo/datasets/__init__.py @@ -3,6 +3,7 @@ from . import embeddings from . import snli from . import quora_qp +from . import cqa_ql_16 from pathlib import Path diff --git a/matchzoo/datasets/cqa_ql_16/__init__.py b/matchzoo/datasets/cqa_ql_16/__init__.py new file mode 100644 index 00000000..0394d77f --- /dev/null +++ b/matchzoo/datasets/cqa_ql_16/__init__.py @@ -0,0 +1 @@ +from .load_data import load_data \ No newline at end of file diff --git a/matchzoo/datasets/cqa_ql_16/load_data.py b/matchzoo/datasets/cqa_ql_16/load_data.py new file mode 100644 index 00000000..5b6b0a2e --- /dev/null +++ b/matchzoo/datasets/cqa_ql_16/load_data.py @@ -0,0 +1,203 @@ +"""CQA-QL-16 data loader.""" + +import xml +import typing +from pathlib import Path + +import keras +import pandas as pd + +import matchzoo + + +_train_dev_url = "http://alt.qcri.org/semeval2016/task3/data/uploads/" \ + "semeval2016-task3-cqa-ql-traindev-v3.2.zip" +_test_url = "http://alt.qcri.org/semeval2016/task3/data/uploads/" \ + "semeval2016_task3_test.zip" + + +def load_data( + stage: str = 'train', + task: str = 'classification', + target_label: str = 'PerfectMatch', + return_classes: bool = False, + match_type: str = 'question', + mode: str = 'both', +) -> typing.Union[matchzoo.DataPack, tuple]: + """ + Load CQA-QL-16 data. + + :param stage: One of `train`, `dev`, and `test`. + (default: `train`) + :param task: Could be one of `ranking`, `classification` or instance + of :class:`matchzoo.engine.BaseTask`. (default: `classification`) + :param target_label: If `ranking`, choose one of classification + label as the positive label. (default: `PerfectMatch`) + :param return_classes: `True` to return classes for classification + task, `False` otherwise. + :param match_type: Matching text types. One of `question`, + `answer`, and `external_answer`. (default: `question`) + :param mode: Train data use method. One of `part1`, `part2`, + and `both`. (default: `both`) + + :return: A DataPack unless `task` is `classification` and `return_classes` + is `True`: a tuple of `(DataPack, classes)` in that case. + """ + if stage not in ('train', 'dev', 'test'): + raise ValueError(f"{stage} is not a valid stage." + f"Must be one of `train`, `dev`, and `test`.") + + if match_type not in ('question', 'answer', 'external_answer'): + raise ValueError(f"{match_type} is not a valid method. Must be one of" + f" `question`, `answer`, `external_answer`.") + + if mode not in ('part1', 'part2', 'both'): + raise ValueError(f"{mode} is not a valid method." + f"Must be one of `part1`, `part2`, `both`.") + + data_root = _download_data(stage) + data_pack = _read_data(data_root, stage, match_type, mode) + + if task == 'ranking': + if match_type in ('anwer', 'external_answer') and target_label not in [ + 'Good', 'PotentiallyUseful', 'Bad']: + raise ValueError(f"{target_label} is not a valid target label." + f"Must be one of `Good`, `PotentiallyUseful`," + f" `Bad`.") + elif match_type == 'question' and target_label not in [ + 'PerfectMatch', 'Relevant', 'Irrelevant']: + raise ValueError(f"{target_label} is not a valid target label." + f" Must be one of `PerfectMatch`, `Relevant`," + f" `Irrelevant`.") + binary = (data_pack.relation['label'] == target_label).astype(float) + data_pack.relation['label'] = binary + return data_pack + elif task == 'classification': + if match_type in ('answer', 'external_answer'): + classes = ['Good', 'PotentiallyUseful', 'Bad'] + else: + classes = ['PerfectMatch', 'Relevant', 'Irrelevant'] + label = data_pack.relation['label'].apply(classes.index) + data_pack.relation['label'] = label + data_pack.one_hot_encode_label(num_classes=3, inplace=True) + if return_classes: + return data_pack, classes + else: + return data_pack + else: + raise ValueError(f"{task} is not a valid task." + f"Must be one of `Ranking` and `Classification`.") + + +def _download_data(stage): + if stage in ['train', 'dev']: + return _download_train_dev_data() + else: + return _download_test_data() + + +def _download_train_dev_data(): + ref_path = keras.utils.data_utils.get_file( + 'semeval_train', _train_dev_url, extract=True, + cache_dir=matchzoo.USER_DATA_DIR, + cache_subdir='semeval_train' + ) + return Path(ref_path).parent.joinpath('v3.2') + + +def _download_test_data(): + ref_path = keras.utils.data_utils.get_file( + 'semeval_test', _test_url, extract=True, + cache_dir=matchzoo.USER_DATA_DIR, + cache_subdir='semeval_test' + ) + return Path(ref_path).parent.joinpath('SemEval2016_task3_test/English') + + +def _read_data(path, stage, match_type, mode='both'): + if stage == 'train': + if mode == 'part1': + path = path.joinpath( + 'train/SemEval2016-Task3-CQA-QL-train-part1.xml') + data = _load_data_by_type(path, match_type) + elif mode == 'part2': + path = path.joinpath( + 'train/SemEval2016-Task3-CQA-QL-train-part2.xml') + data = _load_data_by_type(path, match_type) + else: + part1 = path.joinpath( + 'train/SemEval2016-Task3-CQA-QL-train-part1.xml') + p1 = _load_data_by_type(part1, match_type) + part2 = path.joinpath( + 'train/SemEval2016-Task3-CQA-QL-train-part1.xml') + p2 = _load_data_by_type(part2, match_type) + data = pd.concat([p1, p2], ignore_index=True) + return matchzoo.pack(data) + elif stage == 'dev': + path = path.joinpath('dev/SemEval2016-Task3-CQA-QL-dev.xml') + data = _load_data_by_type(path, match_type) + return matchzoo.pack(data) + else: + path = path.joinpath('SemEval2016-Task3-CQA-QL-test.xml') + data = _load_data_by_type(path, match_type) + return matchzoo.pack(data) + + +def _load_data_by_type(path, match_type): + if match_type == 'question': + return _load_question(path) + elif match_type == 'answer': + return _load_answer(path) + else: + return _load_external_answer(path) + + +def _load_question(path): + doc = xml.etree.ElementTree.parse(path) + dataset = [] + for question in doc.iterfind('OrgQuestion'): + qid = question.attrib['ORGQ_ID'] + query = question.findtext('OrgQBody') + rel_question = question.find('Thread').find('RelQuestion') + question = rel_question.findtext('RelQBody') + question_id = rel_question.attrib['RELQ_ID'] + dataset.append([qid, question_id, query, question, + rel_question.attrib['RELQ_RELEVANCE2ORGQ']]) + df = pd.DataFrame(dataset, columns=[ + 'id_left', 'id_right', 'text_left', 'text_right', 'label']) + return df + + +def _load_answer(path): + doc = xml.etree.ElementTree.parse(path) + dataset = [] + for org_q in doc.iterfind('OrgQuestion'): + for thread in org_q.iterfind('Thread'): + ques = thread.find('RelQuestion') + qid = ques.attrib['RELQ_ID'] + question = ques.findtext('RelQBody') + for comment in thread.iterfind('RelComment'): + aid = comment.attrib['RELC_ID'] + answer = comment.findtext('RelCText') + dataset.append([qid, aid, question, answer, + comment.attrib['RELC_RELEVANCE2RELQ']]) + df = pd.DataFrame(dataset, columns=[ + 'id_left', 'id_right', 'text_left', 'text_right', 'label']) + return df + + +def _load_external_answer(path): + doc = xml.etree.ElementTree.parse(path) + dataset = [] + for question in doc.iterfind('OrgQuestion'): + qid = question.attrib['ORGQ_ID'] + query = question.findtext('OrgQBody') + thread = question.find('Thread') + for comment in thread.iterfind('RelComment'): + answer = comment.findtext('RelCText') + aid = comment.attrib['RELC_ID'] + dataset.append([qid, aid, query, answer, + comment.attrib['RELC_RELEVANCE2ORGQ']]) + df = pd.DataFrame(dataset, columns=[ + 'id_left', 'id_right', 'text_left', 'text_right', 'label']) + return df diff --git a/tests/unit_test/test_datasets.py b/tests/unit_test/test_datasets.py index 03b44cc4..f94fb5cd 100644 --- a/tests/unit_test/test_datasets.py +++ b/tests/unit_test/test_datasets.py @@ -83,3 +83,38 @@ def test_load_quora_qp(): x, y = dev_data.unpack() assert y.shape == (40371, 1) + +@pytest.mark.cron +def test_load_cqa_ql_16(): + # test load question pairs + train_data = mz.datasets.cqa_ql_16.load_data(task='classification') + assert len(train_data) == 3998 + dev_data, tag = mz.datasets.cqa_ql_16.load_data( + 'dev', + task='classification', + return_classes=True) + assert tag == ['PerfectMatch', 'Relevant', 'Irrelevant'] + assert len(dev_data) == 500 + x, y = dev_data.unpack() + assert y.shape == (500, 3) + test_data = mz.datasets.cqa_ql_16.load_data('test') + assert len(test_data) == 700 + + # test load answer pairs + train_data = mz.datasets.cqa_ql_16.load_data(match_type='answer') + assert len(train_data) == 39980 + test_data = mz.datasets.cqa_ql_16.load_data(stage='test', match_type='answer') + assert len(test_data) == 7000 + + # test load external answer pairs + train_data = mz.datasets.cqa_ql_16.load_data(match_type='external_answer') + assert len(train_data) == 39980 + + # test load rank data + train_data = mz.datasets.cqa_ql_16.load_data(task='ranking') + x, y = train_data.unpack() + assert y.shape == (3998, 1) + + dev_data = mz.datasets.cqa_ql_16.load_data('dev', task='ranking', match_type='answer', target_label='Good') + x, y = dev_data.unpack() + assert y.shape == (5000, 1) From 2096d88830e99719885c5754267f0c94e1362ded Mon Sep 17 00:00:00 2001 From: zhaohao Date: Thu, 3 Oct 2019 20:25:00 +0900 Subject: [PATCH 093/100] support keras 2.3 and tensorflow 2.0 --- .travis.yml | 1 + .../contrib/layers/matching_tensor_layer.py | 3 +- .../contrib/layers/multi_perspective_layer.py | 9 ++-- matchzoo/contrib/layers/spatial_gru.py | 50 +++++++++---------- matchzoo/layers/dynamic_pooling_layer.py | 27 +++++----- matchzoo/layers/matching_layer.py | 9 ++-- matchzoo/losses/rank_cross_entropy_loss.py | 16 ++++-- matchzoo/losses/rank_hinge_loss.py | 16 ++++-- matchzoo/models/conv_knrm.py | 11 ++-- matchzoo/models/drmm.py | 2 +- matchzoo/models/drmmtks.py | 12 ++--- matchzoo/models/duet.py | 8 +-- matchzoo/models/knrm.py | 11 ++-- matchzoo/models/mvlstm.py | 4 +- requirements.txt | 4 +- 15 files changed, 102 insertions(+), 81 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa960a88..e3911359 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,7 @@ matrix: language: shell install: + - pip3 install -U pip - pip3 install -r requirements.txt - python3 -m nltk.downloader punkt - python3 -m nltk.downloader wordnet diff --git a/matchzoo/contrib/layers/matching_tensor_layer.py b/matchzoo/contrib/layers/matching_tensor_layer.py index 3c2aabb4..0578ed1c 100644 --- a/matchzoo/contrib/layers/matching_tensor_layer.py +++ b/matchzoo/contrib/layers/matching_tensor_layer.py @@ -2,6 +2,7 @@ import typing import numpy as np +import tensorflow as tf from keras import backend as K from keras.engine import Layer from keras.initializers import constant @@ -105,7 +106,7 @@ def call(self, inputs: list, **kwargs) -> typing.Any: # d, e = embedding size # c = number of channels # output = [b, c, l, r] - output = K.tf.einsum( + output = tf.einsum( 'bld,cde,bre->bclr', x1, self.interaction_matrix, x2 ) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index f8dd3566..f9f1dcac 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -1,5 +1,6 @@ """An implementation of MultiPerspectiveLayer for Bimpm model.""" +import tensorflow as tf from keras import backend as K from keras.engine import Layer @@ -307,10 +308,10 @@ def collect_final_step_of_lstm(lstm_representation, lengths): batch_size = K.shape(lengths)[0] # shape (batch_size) - batch_nums = K.tf.range(0, limit=batch_size) + batch_nums = tf.range(0, limit=batch_size) # shape (batch_size, 2) indices = K.stack((batch_nums, lengths), axis=1) - result = K.tf.gather_nd(lstm_representation, indices, + result = tf.gather_nd(lstm_representation, indices, name='last-forwar-lstm') # [batch_size, dim] return result @@ -337,10 +338,10 @@ def collect_probs(probs, positions): # shape (batch_size, pair_size, 2) # Alert: to solve error message - positions = K.tf.to_int32(positions) + positions = tf.cast(positions, tf.int32) indices = K.stack([batch_nums, positions], axis=2) - pair_probs = K.tf.gather_nd(probs, indices) + pair_probs = tf.gather_nd(probs, indices) # pair_probs = tf.reshape(pair_probs, shape=[batch_size, pair_size]) return pair_probs diff --git a/matchzoo/contrib/layers/spatial_gru.py b/matchzoo/contrib/layers/spatial_gru.py index 76f9df9f..c583c9d6 100644 --- a/matchzoo/contrib/layers/spatial_gru.py +++ b/matchzoo/contrib/layers/spatial_gru.py @@ -1,12 +1,12 @@ """An implementation of Spatial GRU Layer.""" import typing - +import tensorflow as tf from keras import backend as K from keras.engine import Layer from keras.layers import Permute from keras.layers import Reshape -from keras.layers import activations -from keras.layers import initializers +from keras import activations +from keras import initializers class SpatialGRU(Layer): @@ -133,13 +133,13 @@ def softmax_by_row(self, z: typing.Any) -> tuple: for i in range(0, self._units): begin = [0, i, 0] # z_slice: [B, 1, 4] - z_slice = K.tf.slice(z_transform, begin, size) + z_slice = tf.slice(z_transform, begin, size) if i == 0: - z_s = K.tf.nn.softmax(z_slice) + z_s = tf.nn.softmax(z_slice) else: - z_s = K.tf.concat([z_s, K.tf.nn.softmax(z_slice)], 1) + z_s = tf.concat([z_s, tf.nn.softmax(z_slice)], 1) # zi, zl, zt, zd: [B, U] - zi, zl, zt, zd = K.tf.unstack(z_s, axis=2) + zi, zl, zt, zd = tf.unstack(z_s, axis=2) return zi, zl, zt, zd def calculate_recurrent_unit( @@ -160,8 +160,8 @@ def calculate_recurrent_unit( :param h: Hidden state from last operation. """ # Get index i, j - i = K.tf.floordiv(step, K.tf.constant(self._text2_maxlen)) - j = K.tf.mod(step, K.tf.constant(self._text2_maxlen)) + i = tf.math.floordiv(step, tf.constant(self._text2_maxlen)) + j = tf.math.mod(step, tf.constant(self._text2_maxlen)) # Get hidden state h_diag, h_top, h_left # h_diag, h_top, h_left = [B, U] @@ -175,8 +175,8 @@ def calculate_recurrent_unit( # Concatenate h_top, h_left, h_diag, s_ij # q = [B, 3*U+C] - q = K.tf.concat([K.tf.concat([h_top, h_left], 1), - K.tf.concat([h_diag, s_ij], 1)], 1) + q = tf.concat([tf.concat([h_top, h_left], 1), + tf.concat([h_diag, s_ij], 1)], 1) # Calculate reset gate # r = [B, 3*U] @@ -194,7 +194,7 @@ def calculate_recurrent_unit( # Get h_ij_ # h_ij_ = [B, U] h_ij_l = self._time_distributed_dense(self._w_ij, s_ij, self._b_ij) - h_ij_r = K.dot(r * (K.tf.concat([h_left, h_top, h_diag], 1)), self._U) + h_ij_r = K.dot(r * (tf.concat([h_left, h_top, h_diag], 1)), self._U) h_ij_ = self._activation(h_ij_l + h_ij_r) # Calculate h_ij @@ -214,39 +214,39 @@ def call(self, inputs: list, **kwargs) -> typing.Any: :param inputs: input tensors. """ - batch_size = K.tf.shape(inputs)[0] + batch_size = tf.shape(inputs)[0] # h0 = [B, U] - self._bounder_state_h0 = K.tf.zeros([batch_size, self._units]) + self._bounder_state_h0 = tf.zeros([batch_size, self._units]) # input_x = [L, R, B, C] - input_x = K.tf.transpose(inputs, [2, 3, 0, 1]) + input_x = tf.transpose(inputs, [2, 3, 0, 1]) if self._direction == 'rb': # input_x: [R, L, B, C] - input_x = K.tf.reverse(input_x, [0, 1]) + input_x = tf.reverse(input_x, [0, 1]) elif self._direction != 'lt': raise ValueError(f"Invalid direction. " f"`{self._direction}` received. " f"Must be in `lt`, `rb`.") # input_x = [L*R*B, C] - input_x = K.tf.reshape(input_x, [-1, self._channel]) + input_x = tf.reshape(input_x, [-1, self._channel]) # input_x = L*R * [B, C] - input_x = K.tf.split( + input_x = tf.split( axis=0, num_or_size_splits=self._text1_maxlen * self._text2_maxlen, value=input_x ) # inputs = L*R * [B, C] - inputs = K.tf.TensorArray( - dtype=K.tf.float32, + inputs = tf.TensorArray( + dtype=tf.float32, size=self._text1_maxlen * self._text2_maxlen, name='inputs' ) inputs = inputs.unstack(input_x) # states = (L+1)*(R+1) * [B, U] - states = K.tf.TensorArray( - dtype=K.tf.float32, + states = tf.TensorArray( + dtype=tf.float32, size=(self._text1_maxlen + 1) * (self._text2_maxlen + 1), name='states', clear_after_read=False @@ -260,13 +260,13 @@ def call(self, inputs: list, **kwargs) -> typing.Any: # Calculate h_ij # h_ij = [B, U] - _, _, _, h_ij = K.tf.while_loop( - cond=lambda _0, _1, i, _3: K.tf.less(i, self._recurrent_step), + _, _, _, h_ij = tf.while_loop( + cond=lambda _0, _1, i, _3: tf.less(i, self._recurrent_step), body=self.calculate_recurrent_unit, loop_vars=( inputs, states, - K.tf.constant(0, dtype=K.tf.int32), + tf.constant(0, dtype=tf.int32), self._bounder_state_h0 ), parallel_iterations=1, diff --git a/matchzoo/layers/dynamic_pooling_layer.py b/matchzoo/layers/dynamic_pooling_layer.py index 27b37888..7ae925c4 100644 --- a/matchzoo/layers/dynamic_pooling_layer.py +++ b/matchzoo/layers/dynamic_pooling_layer.py @@ -1,7 +1,7 @@ """An implementation of Dynamic Pooling Layer.""" import typing -from keras import backend as K +import tensorflow as tf from keras.engine import Layer @@ -51,23 +51,24 @@ def call(self, inputs: list, **kwargs) -> typing.Any: """ self._validate_dpool_size() x, dpool_index = inputs - dpool_shape = K.tf.shape(dpool_index) - batch_index_one = K.tf.expand_dims( - K.tf.expand_dims( - K.tf.range(dpool_shape[0]), axis=-1), + dpool_shape = tf.shape(dpool_index) + batch_index_one = tf.expand_dims( + tf.expand_dims( + tf.range(dpool_shape[0]), axis=-1), axis=-1) - batch_index = K.tf.expand_dims( - K.tf.tile(batch_index_one, [1, self._msize1, self._msize2]), + batch_index = tf.expand_dims( + tf.tile(batch_index_one, [1, self._msize1, self._msize2]), axis=-1) - dpool_index_ex = K.tf.concat([batch_index, dpool_index], axis=3) - x_expand = K.tf.gather_nd(x, dpool_index_ex) + dpool_index_ex = tf.concat([batch_index, dpool_index], axis=3) + x_expand = tf.gather_nd(x, dpool_index_ex) stride1 = self._msize1 // self._psize1 stride2 = self._msize2 // self._psize2 - x_pool = K.tf.nn.max_pool(x_expand, - [1, stride1, stride2, 1], - [1, stride1, stride2, 1], - "VALID") + + x_pool = tf.nn.max_pool(x_expand, + [1, stride1, stride2, 1], + [1, stride1, stride2, 1], + "VALID") return x_pool def compute_output_shape(self, input_shape: list) -> tuple: diff --git a/matchzoo/layers/matching_layer.py b/matchzoo/layers/matching_layer.py index 24b591cf..0f2ce782 100644 --- a/matchzoo/layers/matching_layer.py +++ b/matchzoo/layers/matching_layer.py @@ -1,6 +1,7 @@ """An implementation of Matching Layer.""" import typing +import tensorflow as tf from keras import backend as K from keras.engine import Layer @@ -76,7 +77,7 @@ def call(self, inputs: list, **kwargs) -> typing.Any: if self._normalize: x1 = K.l2_normalize(x1, axis=2) x2 = K.l2_normalize(x2, axis=2) - return K.tf.expand_dims(K.tf.einsum('abd,acd->abc', x1, x2), 3) + return K.expand_dims(tf.einsum('abd,acd->abc', x1, x2), 3) else: if self._matching_type == 'mul': def func(x, y): @@ -89,14 +90,14 @@ def func(x, y): return x - y elif self._matching_type == 'concat': def func(x, y): - return K.tf.concat([x, y], axis=3) + return tf.concat([x, y], axis=3) else: raise ValueError(f"Invalid matching type." f"{self._matching_type} received." f"Mut be in `dot`, `mul`, `plus`, " f"`minus` and `concat`.") - x1_exp = K.tf.stack([x1] * self._shape2[1], 2) - x2_exp = K.tf.stack([x2] * self._shape1[1], 1) + x1_exp = K.stack([x1] * self._shape2[1], 2) + x2_exp = K.stack([x2] * self._shape1[1], 1) return func(x1_exp, x2_exp) def compute_output_shape(self, input_shape: list) -> tuple: diff --git a/matchzoo/losses/rank_cross_entropy_loss.py b/matchzoo/losses/rank_cross_entropy_loss.py index 9bf56f43..ed1ecbe3 100644 --- a/matchzoo/losses/rank_cross_entropy_loss.py +++ b/matchzoo/losses/rank_cross_entropy_loss.py @@ -1,10 +1,12 @@ """The rank cross entropy loss.""" -import numpy as np from keras import layers, backend as K +import numpy as np +from keras.losses import Loss +from keras.utils import losses_utils -class RankCrossEntropyLoss(object): +class RankCrossEntropyLoss(Loss): """ Rank cross entropy loss. @@ -26,9 +28,12 @@ def __init__(self, num_neg: int = 1): :param num_neg: number of negative instances in cross entropy loss. """ + super().__init__(reduction=losses_utils.Reduction.SUM_OVER_BATCH_SIZE, + name="rank_crossentropy") self._num_neg = num_neg - def __call__(self, y_true: np.array, y_pred: np.array) -> np.array: + def call(self, y_true: np.array, y_pred: np.array, + sample_weight=None) -> np.array: """ Calculate rank cross entropy loss. @@ -48,7 +53,10 @@ def __call__(self, y_true: np.array, y_pred: np.array) -> np.array: labels.append(neg_labels) logits = K.concatenate(logits, axis=-1) labels = K.concatenate(labels, axis=-1) - return -K.mean(K.sum(labels * K.log(K.softmax(logits) + np.finfo(float).eps), axis=-1)) + + loss = -(K.sum(labels * K.log(K.softmax(logits) + np.finfo(float).eps), axis=-1)) + return losses_utils.compute_weighted_loss( + loss, sample_weight, reduction=self.reduction) @property def num_neg(self): diff --git a/matchzoo/losses/rank_hinge_loss.py b/matchzoo/losses/rank_hinge_loss.py index 43dccbc7..7b74887d 100644 --- a/matchzoo/losses/rank_hinge_loss.py +++ b/matchzoo/losses/rank_hinge_loss.py @@ -1,10 +1,12 @@ """The rank hinge loss.""" -import numpy as np +import numpy as np from keras import layers, backend as K +from keras.losses import Loss +from keras.utils import losses_utils -class RankHingeLoss(object): +class RankHingeLoss(Loss): """ Rank hinge loss. @@ -28,13 +30,18 @@ def __init__(self, num_neg: int = 1, margin: float = 1.0): :param num_neg: number of negative instances in hinge loss. :param margin: the margin between positive and negative scores. """ + super().__init__(reduction=losses_utils.Reduction.SUM_OVER_BATCH_SIZE, + name="rank_hinge") + self._num_neg = num_neg self._margin = margin - def __call__(self, y_true: np.array, y_pred: np.array) -> np.array: + def call(self, y_true: np.array, y_pred: np.array, + sample_weight=None) -> np.array: """ Calculate rank hinge loss. + :param **kwargs: :param y_true: Label. :param y_pred: Predicted result. :return: Hinge loss computed by user-defined margin. @@ -49,7 +56,8 @@ def __call__(self, y_true: np.array, y_pred: np.array) -> np.array: output_shape=(1,))(y_pred)) y_neg = K.mean(K.concatenate(y_neg, axis=-1), axis=-1, keepdims=True) loss = K.maximum(0., self._margin + y_neg - y_pos) - return K.mean(loss) + return losses_utils.compute_weighted_loss( + loss, sample_weight, reduction=self.reduction) @property def num_neg(self): diff --git a/matchzoo/models/conv_knrm.py b/matchzoo/models/conv_knrm.py index 47eb64a2..19e07eaa 100644 --- a/matchzoo/models/conv_knrm.py +++ b/matchzoo/models/conv_knrm.py @@ -2,11 +2,10 @@ import keras import keras.backend as K +import tensorflow as tf from .knrm import KNRM from matchzoo.engine.param import Param -from matchzoo.engine.param_table import ParamTable -from matchzoo.engine import hyper_spaces class ConvKNRM(KNRM): @@ -87,13 +86,13 @@ def build(self): mu = 1.0 mm_exp = self._kernel_layer(mu, sigma)(mm) mm_doc_sum = keras.layers.Lambda( - lambda x: K.tf.reduce_sum(x, 2))( + lambda x: K.sum(x, 2))( mm_exp) - mm_log = keras.layers.Activation(K.tf.log1p)(mm_doc_sum) + mm_log = keras.layers.Activation(tf.math.log1p)(mm_doc_sum) mm_sum = keras.layers.Lambda( - lambda x: K.tf.reduce_sum(x, 1))(mm_log) + lambda x: K.sum(x, 1))(mm_log) KM.append(mm_sum) - phi = keras.layers.Lambda(lambda x: K.tf.stack(x, 1))(KM) + phi = keras.layers.Lambda(lambda x: K.stack(x, 1))(KM) out = self._make_output_layer()(phi) self._backend = keras.Model(inputs=[query, doc], outputs=[out]) diff --git a/matchzoo/models/drmm.py b/matchzoo/models/drmm.py index cfaeb4cc..e302062d 100644 --- a/matchzoo/models/drmm.py +++ b/matchzoo/models/drmm.py @@ -114,7 +114,7 @@ def attention_layer(cls, attention_input: typing.Any, )(dense_input) # shape = [B, L, 1] attention_probs = keras.layers.Lambda( - lambda x: keras.layers.activations.softmax(x, axis=1), + lambda x: keras.activations.softmax(x, axis=1), output_shape=lambda s: (s[0], s[1], s[2]), name="attention_probs" )(dense_input) diff --git a/matchzoo/models/drmmtks.py b/matchzoo/models/drmmtks.py index b0111b2f..3bfae201 100644 --- a/matchzoo/models/drmmtks.py +++ b/matchzoo/models/drmmtks.py @@ -2,7 +2,7 @@ import typing import keras -import keras.backend as K +import tensorflow as tf from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param @@ -67,11 +67,11 @@ def build(self): # shape = [B, R, D] embed_doc = embedding(doc) # shape = [B, L] - atten_mask = K.not_equal(query, self._params['mask_value']) + atten_mask = tf.not_equal(query, self._params['mask_value']) # shape = [B, L] - atten_mask = K.cast(atten_mask, K.floatx()) + atten_mask = tf.cast(atten_mask, keras.backend.floatx()) # shape = [B, L, 1] - atten_mask = K.expand_dims(atten_mask, axis=2) + atten_mask = tf.expand_dims(atten_mask, axis=2) # shape = [B, L, 1] attention_probs = self.attention_layer(embed_query, atten_mask) @@ -85,7 +85,7 @@ def build(self): self.params['input_shapes'][0][0], self.params['input_shapes'][1][0]) matching_topk = keras.layers.Lambda( - lambda x: K.tf.nn.top_k(x, k=effective_top_k, sorted=True)[0] + lambda x: tf.nn.top_k(x, k=effective_top_k, sorted=True)[0] )(matching_matrix) # Process right input. @@ -127,7 +127,7 @@ def attention_layer(cls, attention_input: typing.Any, )(dense_input) # shape = [B, L, 1] attention_probs = keras.layers.Lambda( - lambda x: keras.layers.activations.softmax(x, axis=1), + lambda x: keras.activations.softmax(x, axis=1), output_shape=lambda s: (s[0], s[1], s[2]), name="attention_probs" )(dense_input) diff --git a/matchzoo/models/duet.py b/matchzoo/models/duet.py index cb85b602..bce9e9a3 100644 --- a/matchzoo/models/duet.py +++ b/matchzoo/models/duet.py @@ -149,10 +149,10 @@ def _xor_match(cls, x): t2 = x[1] t1_shape = t1.get_shape() t2_shape = t2.get_shape() - t1_expand = K.tf.stack([t1] * t2_shape[1], 2) - t2_expand = K.tf.stack([t2] * t1_shape[1], 1) - out_bool = K.tf.equal(t1_expand, t2_expand) - out = K.tf.cast(out_bool, K.tf.float32) + t1_expand = tf.stack([t1] * t2_shape[1], 2) + t2_expand = tf.stack([t2] * t1_shape[1], 1) + out_bool = tf.equal(t1_expand, t2_expand) + out = tf.cast(out_bool, tf.float32) return out @classmethod diff --git a/matchzoo/models/knrm.py b/matchzoo/models/knrm.py index 6e0d3d77..1aefee44 100644 --- a/matchzoo/models/knrm.py +++ b/matchzoo/models/knrm.py @@ -1,6 +1,7 @@ """KNRM model.""" import keras import keras.backend as K +import tensorflow as tf from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param @@ -69,13 +70,13 @@ def build(self): mu = 1.0 mm_exp = self._kernel_layer(mu, sigma)(mm) mm_doc_sum = keras.layers.Lambda( - lambda x: K.tf.reduce_sum(x, 2))(mm_exp) - mm_log = keras.layers.Activation(K.tf.log1p)(mm_doc_sum) + lambda x: K.sum(x, 2))(mm_exp) + mm_log = keras.layers.Activation(tf.math.log1p)(mm_doc_sum) mm_sum = keras.layers.Lambda( - lambda x: K.tf.reduce_sum(x, 1))(mm_log) + lambda x: K.sum(x, 1))(mm_log) KM.append(mm_sum) - phi = keras.layers.Lambda(lambda x: K.tf.stack(x, 1))(KM) + phi = keras.layers.Lambda(lambda x: K.stack(x, 1))(KM) out = self._make_output_layer()(phi) self._backend = keras.Model(inputs=[query, doc], outputs=[out]) @@ -90,6 +91,6 @@ def _kernel_layer(cls, mu: float, sigma: float) -> keras.layers.Layer: """ def kernel(x): - return K.tf.exp(-0.5 * (x - mu) * (x - mu) / sigma / sigma) + return K.exp(-0.5 * (x - mu) * (x - mu) / sigma / sigma) return keras.layers.Activation(kernel) diff --git a/matchzoo/models/mvlstm.py b/matchzoo/models/mvlstm.py index fcd5f648..bb7f8fba 100644 --- a/matchzoo/models/mvlstm.py +++ b/matchzoo/models/mvlstm.py @@ -2,7 +2,7 @@ import typing import keras -import keras.backend as K +import tensorflow as tf import matchzoo from matchzoo.engine.base_model import BaseModel @@ -73,7 +73,7 @@ def build(self): axes=[2, 2], normalize=False)([rep_query, rep_doc]) matching_signals = keras.layers.Reshape((-1,))(matching_matrix) matching_topk = keras.layers.Lambda( - lambda x: K.tf.nn.top_k(x, k=self._params['top_k'], sorted=True)[0] + lambda x: tf.nn.top_k(x, k=self._params['top_k'], sorted=True)[0] )(matching_signals) # Multilayer perceptron layer. diff --git a/requirements.txt b/requirements.txt index 772b9465..995b0417 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ -keras >= 2.2.4 +keras == 2.3.0 tabulate >= 0.8.2 -tensorflow >= 1.8.0 +tensorflow >= 2.0.0 nltk >= 3.2.3 numpy >= 1.14 tqdm >= 4.23.4 From ebc4f21f91ffb652b8c0c53eb7e9004ba3336579 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Thu, 3 Oct 2019 23:00:51 +0900 Subject: [PATCH 094/100] replace keras add_update with assign_add for tf2.0 --- matchzoo/contrib/layers/decaying_dropout_layer.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/matchzoo/contrib/layers/decaying_dropout_layer.py b/matchzoo/contrib/layers/decaying_dropout_layer.py index fda87212..21232c6f 100644 --- a/matchzoo/contrib/layers/decaying_dropout_layer.py +++ b/matchzoo/contrib/layers/decaying_dropout_layer.py @@ -1,10 +1,9 @@ """An implementation of Decaying Dropout Layer.""" -import typing import keras.backend as K +import tensorflow as tf from keras.engine import Layer - class DecayingDropoutLayer(Layer): """ Layer that processes dropout with exponential decayed keep rate during @@ -61,6 +60,7 @@ def build(self, input_shape): :param input_shape: the shape of the input tensor, for DecayingDropoutLayer we need one input tensor. """ + self._iterations = self.add_weight(name='iterations', shape=(1,), dtype=K.floatx(), @@ -81,9 +81,9 @@ def call(self, inputs, training=None): keep_rate = self._initial_keep_rate * K.pow(self._decay_rate, p) def dropped_inputs(): - self.add_update([K.update_add(self._iterations, [1])], inputs) - return K.dropout(inputs, 1 - keep_rate[0], noise_shape, - seed=self._seed) + with tf.control_dependencies([self._iterations.assign_add([1])]): + return K.dropout(inputs, 1 - keep_rate[0], noise_shape, + seed=self._seed) return K.in_train_phase(dropped_inputs, inputs, training=training) From e94d888c73769b86ca24115280db2ddc4ff2e136 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Thu, 3 Oct 2019 23:37:20 +0900 Subject: [PATCH 095/100] remove dump test as keras optimizer is dumpable now --- tests/unit_test/test_utils.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/tests/unit_test/test_utils.py b/tests/unit_test/test_utils.py index d293ef66..e69de29b 100644 --- a/tests/unit_test/test_utils.py +++ b/tests/unit_test/test_utils.py @@ -1,17 +0,0 @@ -import dill -import pytest -import keras - -import matchzoo - - -def test_make_keras_optimizer_picklable(): - adam = keras.optimizers.Adam(lr=0.1) - with pytest.raises(Exception): - s = dill.dumps(adam) - assert dill.loads(s) - - matchzoo.utils.make_keras_optimizer_picklable() - - s = dill.dumps(adam) - assert dill.loads(s) From d590adc8ec33413ad9b42139e8e366fbe40020e4 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Thu, 3 Oct 2019 23:37:31 +0900 Subject: [PATCH 096/100] reformat for flask8 --- matchzoo/contrib/layers/decaying_dropout_layer.py | 3 ++- matchzoo/layers/dynamic_pooling_layer.py | 1 - matchzoo/losses/rank_cross_entropy_loss.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/matchzoo/contrib/layers/decaying_dropout_layer.py b/matchzoo/contrib/layers/decaying_dropout_layer.py index 21232c6f..2cb7d961 100644 --- a/matchzoo/contrib/layers/decaying_dropout_layer.py +++ b/matchzoo/contrib/layers/decaying_dropout_layer.py @@ -81,7 +81,8 @@ def call(self, inputs, training=None): keep_rate = self._initial_keep_rate * K.pow(self._decay_rate, p) def dropped_inputs(): - with tf.control_dependencies([self._iterations.assign_add([1])]): + update_op = self._iterations.assign_add([1]) + with tf.control_dependencies([update_op]): return K.dropout(inputs, 1 - keep_rate[0], noise_shape, seed=self._seed) diff --git a/matchzoo/layers/dynamic_pooling_layer.py b/matchzoo/layers/dynamic_pooling_layer.py index 7ae925c4..049bbf82 100644 --- a/matchzoo/layers/dynamic_pooling_layer.py +++ b/matchzoo/layers/dynamic_pooling_layer.py @@ -64,7 +64,6 @@ def call(self, inputs: list, **kwargs) -> typing.Any: stride1 = self._msize1 // self._psize1 stride2 = self._msize2 // self._psize2 - x_pool = tf.nn.max_pool(x_expand, [1, stride1, stride2, 1], [1, stride1, stride2, 1], diff --git a/matchzoo/losses/rank_cross_entropy_loss.py b/matchzoo/losses/rank_cross_entropy_loss.py index ed1ecbe3..32b8d23d 100644 --- a/matchzoo/losses/rank_cross_entropy_loss.py +++ b/matchzoo/losses/rank_cross_entropy_loss.py @@ -53,8 +53,8 @@ def call(self, y_true: np.array, y_pred: np.array, labels.append(neg_labels) logits = K.concatenate(logits, axis=-1) labels = K.concatenate(labels, axis=-1) - - loss = -(K.sum(labels * K.log(K.softmax(logits) + np.finfo(float).eps), axis=-1)) + smoothed_prob = K.softmax(logits) + np.finfo(float).eps + loss = -(K.sum(labels * K.log(smoothed_prob), axis=-1)) return losses_utils.compute_weighted_loss( loss, sample_weight, reduction=self.reduction) From d12bfb4bd8c2f26ce2aeb2558f9d43cccfacf8e3 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Fri, 4 Oct 2019 20:34:07 +0900 Subject: [PATCH 097/100] clear session after each model test to prevent OOM during CI --- tests/unit_test/models/test_models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit_test/models/test_models.py b/tests/unit_test/models/test_models.py index 828a8b62..743fe9c0 100644 --- a/tests/unit_test/models/test_models.py +++ b/tests/unit_test/models/test_models.py @@ -9,7 +9,7 @@ import shutil import matchzoo as mz - +from keras.backend import clear_session @pytest.fixture(scope='module', params=[ mz.tasks.Ranking(loss=mz.losses.RankCrossEntropyLoss(num_neg=2)), @@ -36,6 +36,7 @@ def embedding(): @pytest.fixture(scope='module') def setup(task, model_class, train_raw, embedding): + clear_session() # prevent OOM during CI tests return mz.auto.prepare( task=task, model_class=model_class, From 5fae55a1e59a647d138f1a066c331e940c007dd4 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Fri, 4 Oct 2019 20:35:28 +0900 Subject: [PATCH 098/100] upgrade keras to 2.3.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 40a70fd5..f99f2f42 100644 --- a/setup.py +++ b/setup.py @@ -17,7 +17,7 @@ long_description = f.read() install_requires = [ - 'keras >= 2.2.4', + 'keras >= 2.3.0', 'nltk >= 3.2.3', 'numpy >= 1.14', 'tqdm >= 4.19.4', From e1b38e326acb2c536717c9592de5550e6eaa714c Mon Sep 17 00:00:00 2001 From: zhaohao Date: Sat, 5 Oct 2019 02:31:14 +0900 Subject: [PATCH 099/100] replace most K.* with tf.* --- README.md | 2 +- matchzoo/contrib/layers/attention_layer.py | 25 ++++---- .../contrib/layers/decaying_dropout_layer.py | 8 +-- .../contrib/layers/multi_perspective_layer.py | 60 +++++++++---------- .../layers/semantic_composite_layer.py | 23 ++++--- matchzoo/contrib/models/diin.py | 15 ++--- matchzoo/contrib/models/esim.py | 8 +-- matchzoo/contrib/models/match_lstm.py | 15 ++--- matchzoo/contrib/models/match_srnn.py | 9 +-- matchzoo/layers/matching_layer.py | 11 ++-- matchzoo/losses/rank_cross_entropy_loss.py | 11 ++-- matchzoo/losses/rank_hinge_loss.py | 7 ++- matchzoo/models/conv_knrm.py | 7 +-- matchzoo/models/drmm.py | 10 ++-- matchzoo/models/drmmtks.py | 2 +- matchzoo/models/duet.py | 4 +- matchzoo/models/knrm.py | 10 ++-- matchzoo/models/mvlstm.py | 4 +- 18 files changed, 112 insertions(+), 119 deletions(-) diff --git a/README.md b/README.md index 14900a0e..26e7171d 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ If you're interested in the cutting-edge research progress, please take a look a ## Install -MatchZoo is dependent on [Keras](https://github.com/keras-team/keras), please install one of its backend engines: TensorFlow, Theano, or CNTK. We recommend the TensorFlow backend. Two ways to install MatchZoo: +MatchZoo is dependent on [Keras](https://github.com/keras-team/keras) and [Tensorflow](https://github.com/tensorflow/tensorflow). Two ways to install MatchZoo: **Install MatchZoo from Pypi:** diff --git a/matchzoo/contrib/layers/attention_layer.py b/matchzoo/contrib/layers/attention_layer.py index 53714f06..049d72dc 100644 --- a/matchzoo/contrib/layers/attention_layer.py +++ b/matchzoo/contrib/layers/attention_layer.py @@ -1,5 +1,6 @@ """An implementation of Attention Layer for Bimpm model.""" +import tensorflow as tf from keras import backend as K from keras.engine import Layer @@ -97,40 +98,40 @@ def call(self, x: list, **kwargs): reps_lt, reps_rt = x attn_w1 = self.attn_w1 - attn_w1 = K.expand_dims(K.expand_dims(attn_w1, axis=0), axis=0) + attn_w1 = tf.expand_dims(tf.expand_dims(attn_w1, axis=0), axis=0) # => [1, 1, d, a] - reps_lt = K.expand_dims(reps_lt, axis=-1) - attn_reps_lt = K.sum(reps_lt * attn_w1, axis=2) + reps_lt = tf.expand_dims(reps_lt, axis=-1) + attn_reps_lt = tf.reduce_sum(reps_lt * attn_w1, axis=2) # => [b, s_lt, d, -1] attn_w2 = self.attn_w2 - attn_w2 = K.expand_dims(K.expand_dims(attn_w2, axis=0), axis=0) + attn_w2 = tf.expand_dims(tf.expand_dims(attn_w2, axis=0), axis=0) # => [1, 1, d, a] - reps_rt = K.expand_dims(reps_rt, axis=-1) - attn_reps_rt = K.sum(reps_rt * attn_w2, axis=2) # [b, s_rt, d, -1] + reps_rt = tf.expand_dims(reps_rt, axis=-1) + attn_reps_rt = tf.reduce_sum(reps_rt * attn_w2, axis=2) # [b, s_rt, d, -1] - attn_reps_lt = K.tanh(attn_reps_lt) # [b, s_lt, a] - attn_reps_rt = K.tanh(attn_reps_rt) # [b, s_rt, a] + attn_reps_lt = tf.tanh(attn_reps_lt) # [b, s_lt, a] + attn_reps_rt = tf.tanh(attn_reps_rt) # [b, s_rt, a] # diagonal_W attn_reps_lt = attn_reps_lt * self.diagonal_W # [b, s_lt, a] - attn_reps_rt = K.permute_dimensions(attn_reps_rt, (0, 2, 1)) + attn_reps_rt = tf.transpose(attn_reps_rt, (0, 2, 1)) # => [b, a, s_rt] attn_value = K.batch_dot(attn_reps_lt, attn_reps_rt) # [b, s_lt, s_rt] # Softmax operation - attn_prob = K.softmax(attn_value) # [b, s_lt, s_rt] + attn_prob = tf.nn.softmax(attn_value) # [b, s_lt, s_rt] # TODO(tjf) remove diagonal or not for normalization # if remove_diagonal: attn_value = attn_value * diagonal if len(x) == 4: mask_lt, mask_rt = x[2], x[3] - attn_prob *= K.expand_dims(mask_lt, axis=2) - attn_prob *= K.expand_dims(mask_rt, axis=1) + attn_prob *= tf.expand_dims(mask_lt, axis=2) + attn_prob *= tf.expand_dims(mask_rt, axis=1) return attn_prob diff --git a/matchzoo/contrib/layers/decaying_dropout_layer.py b/matchzoo/contrib/layers/decaying_dropout_layer.py index 2cb7d961..152b4a31 100644 --- a/matchzoo/contrib/layers/decaying_dropout_layer.py +++ b/matchzoo/contrib/layers/decaying_dropout_layer.py @@ -48,7 +48,7 @@ def _get_noise_shape(self, inputs): if self._noise_shape is None: return self._noise_shape - symbolic_shape = K.shape(inputs) + symbolic_shape = tf.shape(inputs) noise_shape = [symbolic_shape[axis] if shape is None else shape for axis, shape in enumerate(self._noise_shape)] return tuple(noise_shape) @@ -75,15 +75,15 @@ def call(self, inputs, training=None): :param inputs: an input tensor. """ noise_shape = self._get_noise_shape(inputs) - t = K.cast(self._iterations, K.floatx()) + 1 + t = tf.cast(self._iterations, K.floatx()) + 1 p = t / float(self._decay_interval) - keep_rate = self._initial_keep_rate * K.pow(self._decay_rate, p) + keep_rate = self._initial_keep_rate * tf.pow(self._decay_rate, p) def dropped_inputs(): update_op = self._iterations.assign_add([1]) with tf.control_dependencies([update_op]): - return K.dropout(inputs, 1 - keep_rate[0], noise_shape, + return tf.nn.dropout(inputs, 1 - keep_rate[0], noise_shape, seed=self._seed) return K.in_train_phase(dropped_inputs, inputs, training=training) diff --git a/matchzoo/contrib/layers/multi_perspective_layer.py b/matchzoo/contrib/layers/multi_perspective_layer.py index f9f1dcac..64cfd338 100644 --- a/matchzoo/contrib/layers/multi_perspective_layer.py +++ b/matchzoo/contrib/layers/multi_perspective_layer.py @@ -79,7 +79,7 @@ def call(self, x: list, **kwargs): if self._perspective.get('full'): # Each forward & backward contextual embedding compare # with the last step of the last time step of the other sentence. - h_lt = K.concatenate([forward_h_lt, backward_h_lt], axis=-1) + h_lt = tf.concat([forward_h_lt, backward_h_lt], axis=-1) full_match_tensor = self.full_match([h_lt, lstm_reps_rt]) match_tensor_list.append(full_match_tensor) match_dim += self._mp_dim + 1 @@ -111,7 +111,7 @@ def call(self, x: list, **kwargs): match_tensor_list.append(max_attentive_tensor) match_dim += self._mp_dim + 1 - mp_tensor = K.concatenate(match_tensor_list, axis=-1) + mp_tensor = tf.concat(match_tensor_list, axis=-1) return mp_tensor def compute_output_shape(self, input_shape: list): @@ -148,7 +148,7 @@ def call(self, x, **kwargs): """Call. """ rep_lt, reps_rt = x - att_lt = K.expand_dims(rep_lt, 1) + att_lt = tf.expand_dims(rep_lt, 1) match_tensor, match_dim = _multi_perspective_match(self.mp_dim, reps_rt, @@ -184,16 +184,16 @@ def call(self, x, **kwargs): # kernel: [1, 1, 1, mp_dim, d] # lstm_lt => [b, len_lt, 1, 1, d] - reps_lt = K.expand_dims(reps_lt, axis=2) - reps_lt = K.expand_dims(reps_lt, axis=2) + reps_lt = tf.expand_dims(reps_lt, axis=2) + reps_lt = tf.expand_dims(reps_lt, axis=2) reps_lt = reps_lt * self.kernel # lstm_rt -> [b, 1, len_rt, 1, d] - reps_rt = K.expand_dims(reps_rt, axis=2) - reps_rt = K.expand_dims(reps_rt, axis=1) + reps_rt = tf.expand_dims(reps_rt, axis=2) + reps_rt = tf.expand_dims(reps_rt, axis=1) match_tensor = _cosine_distance(reps_lt, reps_rt, cosine_norm=False) - max_match_tensor = K.max(match_tensor, axis=1) + max_match_tensor = tf.reduce_max(match_tensor, axis=1) # match_tensor => [b, len_rt, m] return max_match_tensor @@ -280,7 +280,7 @@ def cal_max_question_representation(reps_lt, attn_scores): :param attn_scores: [] :return: [batch_size, passage_len, hidden_size]. """ - attn_positions = K.argmax(attn_scores, axis=2) + attn_positions = tf.argmax(attn_scores, axis=2) max_reps_lt = collect_representation(reps_lt, attn_positions) return max_reps_lt @@ -304,13 +304,13 @@ def collect_final_step_of_lstm(lstm_representation, lengths): :param lengths: [batch_size] :return: [batch_size, dim] """ - lengths = K.maximum(lengths, K.zeros_like(lengths)) + lengths = tf.maximum(lengths, K.zeros_like(lengths)) - batch_size = K.shape(lengths)[0] + batch_size = tf.shape(lengths)[0] # shape (batch_size) batch_nums = tf.range(0, limit=batch_size) # shape (batch_size, 2) - indices = K.stack((batch_nums, lengths), axis=1) + indices = tf.stack((batch_nums, lengths), axis=1) result = tf.gather_nd(lstm_representation, indices, name='last-forwar-lstm') # [batch_size, dim] @@ -327,19 +327,19 @@ def collect_probs(probs, positions): :param positions: [batch_size, pair_size] :return: [batch_size, pair_size] """ - batch_size = K.shape(probs)[0] - pair_size = K.shape(positions)[1] + batch_size = tf.shape(probs)[0] + pair_size = tf.shape(positions)[1] # shape (batch_size) batch_nums = K.arange(0, batch_size) # [batch_size, 1] - batch_nums = K.reshape(batch_nums, shape=[-1, 1]) + batch_nums = tf.reshape(batch_nums, shape=[-1, 1]) # [batch_size, pair_size] batch_nums = K.tile(batch_nums, [1, pair_size]) # shape (batch_size, pair_size, 2) # Alert: to solve error message positions = tf.cast(positions, tf.int32) - indices = K.stack([batch_nums, positions], axis=2) + indices = tf.stack([batch_nums, positions], axis=2) pair_probs = tf.gather_nd(probs, indices) # pair_probs = tf.reshape(pair_probs, shape=[batch_size, pair_size]) @@ -360,7 +360,7 @@ def _multi_perspective_match(mp_dim, reps_rt, att_lt, :param with_mp_cosine: True :return: [batch, len, 1 + mp_dim] """ - shape_rt = K.shape(reps_rt) + shape_rt = tf.shape(reps_rt) batch_size = shape_rt[0] len_lt = shape_rt[1] @@ -368,7 +368,7 @@ def _multi_perspective_match(mp_dim, reps_rt, att_lt, match_result_list = [] if with_cosine: cosine_tensor = _cosine_distance(reps_rt, att_lt, False) - cosine_tensor = K.reshape(cosine_tensor, + cosine_tensor = tf.reshape(cosine_tensor, [batch_size, len_lt, 1]) match_result_list.append(cosine_tensor) match_dim += 1 @@ -376,12 +376,12 @@ def _multi_perspective_match(mp_dim, reps_rt, att_lt, if with_mp_cosine: mp_cosine_layer = MpCosineLayer(mp_dim) mp_cosine_tensor = mp_cosine_layer([reps_rt, att_lt]) - mp_cosine_tensor = K.reshape(mp_cosine_tensor, + mp_cosine_tensor = tf.reshape(mp_cosine_tensor, [batch_size, len_lt, mp_dim]) match_result_list.append(mp_cosine_tensor) match_dim += mp_cosine_layer.mp_dim - match_result = K.concatenate(match_result_list, 2) + match_result = tf.concat(match_result_list, 2) return match_result, match_dim @@ -418,8 +418,8 @@ def build(self, input_shape): def call(self, x, **kwargs): """Call.""" v1, v2 = x - v1 = K.expand_dims(v1, 2) * self.kernel # [b, s_lt, m, d] - v2 = K.expand_dims(v2, 2) # [b, s_lt, 1, d] + v1 = tf.expand_dims(v1, 2) * self.kernel # [b, s_lt, m, d] + v2 = tf.expand_dims(v2, 2) # [b, s_lt, 1, d] return _cosine_distance(v1, v2, False) def compute_output_shape(self, input_shape): @@ -428,8 +428,8 @@ def compute_output_shape(self, input_shape): def _calc_relevancy_matrix(reps_lt, reps_rt): - reps_lt = K.expand_dims(reps_lt, 1) # [b, 1, len_lt, d] - reps_rt = K.expand_dims(reps_rt, 2) # [b, len_rt, 1, d] + reps_lt = tf.expand_dims(reps_lt, 1) # [b, 1, len_lt, d] + reps_rt = tf.expand_dims(reps_rt, 2) # [b, len_rt, 1, d] relevancy_matrix = _cosine_distance(reps_lt, reps_rt) # => [b, len_rt, len_lt, d] return relevancy_matrix @@ -445,14 +445,14 @@ def _mask_relevancy_matrix(relevancy_matrix, mask_lt, mask_rt): :return: masked_matrix: [b, len_rt, len_lt] """ if mask_lt is not None: - relevancy_matrix = relevancy_matrix * K.expand_dims(mask_lt, 1) - relevancy_matrix = relevancy_matrix * K.expand_dims(mask_rt, 2) + relevancy_matrix = relevancy_matrix * tf.expand_dims(mask_lt, 1) + relevancy_matrix = relevancy_matrix * tf.expand_dims(mask_rt, 2) return relevancy_matrix def _cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): """ - Only requires `K.sum(v1 * v2, axis=-1)`. + Only requires `tf.reduce_sum(v1 * v2, axis=-1)`. :param v1: [batch, time_steps(v1), 1, m, d] :param v2: [batch, 1, time_steps(v2), m, d] @@ -460,9 +460,9 @@ def _cosine_distance(v1, v2, cosine_norm=True, eps=1e-6): :param eps: 1e-6 :return: [batch, time_steps(v1), time_steps(v2), m] """ - cosine_numerator = K.sum(v1 * v2, axis=-1) + cosine_numerator = tf.reduce_sum(v1 * v2, axis=-1) if not cosine_norm: return K.tanh(cosine_numerator) - v1_norm = K.sqrt(K.maximum(K.sum(K.square(v1), axis=-1), eps)) - v2_norm = K.sqrt(K.maximum(K.sum(K.square(v2), axis=-1), eps)) + v1_norm = K.sqrt(tf.maximum(tf.reduce_sum(tf.square(v1), axis=-1), eps)) + v2_norm = K.sqrt(tf.maximum(tf.reduce_sum(tf.square(v2), axis=-1), eps)) return cosine_numerator / v1_norm / v2_norm diff --git a/matchzoo/contrib/layers/semantic_composite_layer.py b/matchzoo/contrib/layers/semantic_composite_layer.py index 13bf6f29..bda4834b 100644 --- a/matchzoo/contrib/layers/semantic_composite_layer.py +++ b/matchzoo/contrib/layers/semantic_composite_layer.py @@ -1,8 +1,7 @@ """An implementation of EncodingModule for DIIN model.""" -import typing -import keras import keras.backend as K +import tensorflow as tf from keras.engine import Layer from matchzoo.contrib.layers import DecayingDropoutLayer @@ -84,38 +83,38 @@ def call(self, inputs, **kwargs): # The input shape is [b, p, d] # shape = [b, 1, p, d] - x = K.expand_dims(inputs, 1) * 0 + x = tf.expand_dims(inputs, 1) * 0 # shape = [b, 1, d, p] - x = K.permute_dimensions(x, (0, 1, 3, 2)) + x = tf.transpose(x, (0, 1, 3, 2)) # shape = [b, p, d, p] - mid = x + K.expand_dims(inputs) + mid = x + tf.expand_dims(inputs, -1) # shape = [b, p, d, p] - up = K.permute_dimensions(mid, pattern=(0, 3, 2, 1)) + up = tf.transpose(mid, (0, 3, 2, 1)) # shape = [b, p, 3d, p] - inputs_concat = K.concatenate([up, mid, up * mid], axis=2) + inputs_concat = tf.concat([up, mid, up * mid], axis=2) # Self-attention layer. # shape = [b, p, p] A = K.dot(self._w_itr_att, inputs_concat) # shape = [b, p, p] - SA = keras.activations.softmax(A, axis=2) + SA = tf.nn.softmax(A, axis=2) # shape = [b, p, d] itr_attn = K.batch_dot(SA, inputs) # Semantic composite fuse gate. # shape = [b, p, 2d] - inputs_attn_concat = K.concatenate([inputs, itr_attn], axis=2) + inputs_attn_concat = tf.concat([inputs, itr_attn], axis=2) concat_dropout = DecayingDropoutLayer( initial_keep_rate=self._initial_keep_rate, decay_interval=self._decay_interval, decay_rate=self._decay_rate )(inputs_attn_concat) # shape = [b, p, d] - z = K.tanh(K.dot(concat_dropout, self._w1) + self._b1) + z = tf.tanh(K.dot(concat_dropout, self._w1) + self._b1) # shape = [b, p, d] - r = K.sigmoid(K.dot(concat_dropout, self._w2) + self._b2) + r = tf.sigmoid(K.dot(concat_dropout, self._w2) + self._b2) # shape = [b, p, d] - f = K.sigmoid(K.dot(concat_dropout, self._w3) + self._b3) + f = tf.sigmoid(K.dot(concat_dropout, self._w3) + self._b3) # shape = [b, p, d] encoding = r * inputs + f * z diff --git a/matchzoo/contrib/models/diin.py b/matchzoo/contrib/models/diin.py index 3ab3632b..a346c84c 100644 --- a/matchzoo/contrib/models/diin.py +++ b/matchzoo/contrib/models/diin.py @@ -3,14 +3,15 @@ import keras import keras.backend as K +import tensorflow as tf -from matchzoo.engine import hyper_spaces -from matchzoo.engine.param_table import ParamTable -from matchzoo.engine.param import Param -from matchzoo.engine.base_model import BaseModel +from matchzoo import preprocessors from matchzoo.contrib.layers import DecayingDropoutLayer from matchzoo.contrib.layers import EncodingLayer -from matchzoo import preprocessors +from matchzoo.engine import hyper_spaces +from matchzoo.engine.base_model import BaseModel +from matchzoo.engine.param import Param +from matchzoo.engine.param_table import ParamTable class DIIN(BaseModel): @@ -270,8 +271,8 @@ def _make_interaction(self, inputs_) -> typing.Any: left_encoding = inputs_[0] right_encoding = inputs_[1] - left_encoding = K.expand_dims(left_encoding, axis=2) - right_encoding = K.expand_dims(right_encoding, axis=1) + left_encoding = tf.expand_dims(left_encoding, axis=2) + right_encoding = tf.expand_dims(right_encoding, axis=1) interaction = left_encoding * right_encoding return interaction diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index e5e5f851..d7e8eda5 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -66,7 +66,7 @@ def _expand_dim(self, inp: tf.Tensor, axis: int) -> keras.layers.Layer: :param inp: input tensor to expand the dimension :param axis: the axis of new dimension """ - return keras.layers.Lambda(lambda x: K.expand_dims(x, axis=axis))(inp) + return keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=axis))(inp) def _make_atten_mask_layer(self) -> keras.layers.Layer: """ @@ -100,7 +100,7 @@ def _max(self, texts: tf.Tensor, mask: tf.Tensor) -> tf.Tensor: new_texts = keras.layers.Multiply()([texts, mask]) text_max = keras.layers.Lambda( - lambda x: K.max(x, axis=1), + lambda x: tf.reduce_max(x, axis=1), )(new_texts) return text_max @@ -119,7 +119,7 @@ def _avg(self, texts: tf.Tensor, mask: tf.Tensor) -> tf.Tensor: # timestep-wise division, exclude the PAD number when calc avg text_avg = keras.layers.Lambda( lambda text_mask: - K.sum(text_mask[0], axis=1) / K.sum(text_mask[1], axis=1), + tf.reduce_sum(text_mask[0], axis=1) / tf.reduce_sum(text_mask[1], axis=1), )([new_texts, mask]) return text_avg @@ -133,7 +133,7 @@ def build(self): # layers create_mask = keras.layers.Lambda( lambda x: - K.cast(K.not_equal(x, self._params['mask_value']), K.floatx()) + tf.cast(tf.not_equal(x, self._params['mask_value']), K.floatx()) ) embedding = self._make_embedding_layer() lstm_compare = self._make_bilstm_layer(lstm_dim) diff --git a/matchzoo/contrib/models/match_lstm.py b/matchzoo/contrib/models/match_lstm.py index e1150afb..933451fc 100644 --- a/matchzoo/contrib/models/match_lstm.py +++ b/matchzoo/contrib/models/match_lstm.py @@ -1,5 +1,6 @@ """Match LSTM model.""" import keras +import tensorflow as tf import keras.backend as K from matchzoo.engine.base_model import BaseModel @@ -68,19 +69,19 @@ def build(self): def attention(tensors): """Attention layer.""" left, right = tensors - tensor_left = K.expand_dims(left, axis=2) - tensor_right = K.expand_dims(right, axis=1) + tensor_left = tf.expand_dims(left, axis=2) + tensor_right = tf.expand_dims(right, axis=1) tensor_left = K.repeat_elements(tensor_left, len_right, 2) tensor_right = K.repeat_elements(tensor_right, len_left, 1) - tensor_merged = K.concatenate([tensor_left, tensor_right], axis=-1) + tensor_merged = tf.concat([tensor_left, tensor_right], axis=-1) middle_output = keras.layers.Dense(self._params['fc_num_units'], activation='tanh')( tensor_merged) attn_scores = keras.layers.Dense(1)(middle_output) - attn_scores = K.squeeze(attn_scores, axis=3) - exp_attn_scores = K.exp( - attn_scores - K.max(attn_scores, axis=-1, keepdims=True)) - exp_sum = K.sum(exp_attn_scores, axis=-1, keepdims=True) + attn_scores = tf.squeeze(attn_scores, axis=3) + exp_attn_scores = tf.math.exp( + attn_scores - tf.reduce_max(attn_scores, axis=-1, keepdims=True)) + exp_sum = tf.reduce_sum(exp_attn_scores, axis=-1, keepdims=True) attention_weights = exp_attn_scores / exp_sum return K.batch_dot(attention_weights, right) diff --git a/matchzoo/contrib/models/match_srnn.py b/matchzoo/contrib/models/match_srnn.py index 833581b2..66ae800a 100644 --- a/matchzoo/contrib/models/match_srnn.py +++ b/matchzoo/contrib/models/match_srnn.py @@ -1,16 +1,13 @@ """An implementation of Match-SRNN Model.""" -import typing import keras -import keras.backend as K -import matchzoo +from matchzoo.contrib.layers import MatchingTensorLayer +from matchzoo.contrib.layers import SpatialGRU +from matchzoo.engine import hyper_spaces from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param from matchzoo.engine.param_table import ParamTable -from matchzoo.engine import hyper_spaces -from matchzoo.contrib.layers import SpatialGRU -from matchzoo.contrib.layers import MatchingTensorLayer class MatchSRNN(BaseModel): diff --git a/matchzoo/layers/matching_layer.py b/matchzoo/layers/matching_layer.py index 0f2ce782..54dead2a 100644 --- a/matchzoo/layers/matching_layer.py +++ b/matchzoo/layers/matching_layer.py @@ -2,7 +2,6 @@ import typing import tensorflow as tf -from keras import backend as K from keras.engine import Layer @@ -75,9 +74,9 @@ def call(self, inputs: list, **kwargs) -> typing.Any: x2 = inputs[1] if self._matching_type == 'dot': if self._normalize: - x1 = K.l2_normalize(x1, axis=2) - x2 = K.l2_normalize(x2, axis=2) - return K.expand_dims(tf.einsum('abd,acd->abc', x1, x2), 3) + x1 = tf.math.l2_normalize(x1, axis=2) + x2 = tf.math.l2_normalize(x2, axis=2) + return tf.expand_dims(tf.einsum('abd,acd->abc', x1, x2), 3) else: if self._matching_type == 'mul': def func(x, y): @@ -96,8 +95,8 @@ def func(x, y): f"{self._matching_type} received." f"Mut be in `dot`, `mul`, `plus`, " f"`minus` and `concat`.") - x1_exp = K.stack([x1] * self._shape2[1], 2) - x2_exp = K.stack([x2] * self._shape1[1], 1) + x1_exp = tf.stack([x1] * self._shape2[1], 2) + x2_exp = tf.stack([x2] * self._shape1[1], 1) return func(x1_exp, x2_exp) def compute_output_shape(self, input_shape: list) -> tuple: diff --git a/matchzoo/losses/rank_cross_entropy_loss.py b/matchzoo/losses/rank_cross_entropy_loss.py index 32b8d23d..97e13fe0 100644 --- a/matchzoo/losses/rank_cross_entropy_loss.py +++ b/matchzoo/losses/rank_cross_entropy_loss.py @@ -1,7 +1,8 @@ """The rank cross entropy loss.""" -from keras import layers, backend as K import numpy as np +import tensorflow as tf +from keras import layers, backend as K from keras.losses import Loss from keras.utils import losses_utils @@ -51,10 +52,10 @@ def call(self, y_true: np.array, y_pred: np.array, lambda a: a[neg_idx + 1::(self._num_neg + 1), :])(y_true) logits.append(neg_logits) labels.append(neg_labels) - logits = K.concatenate(logits, axis=-1) - labels = K.concatenate(labels, axis=-1) - smoothed_prob = K.softmax(logits) + np.finfo(float).eps - loss = -(K.sum(labels * K.log(smoothed_prob), axis=-1)) + logits = tf.concat(logits, axis=-1) + labels = tf.concat(labels, axis=-1) + smoothed_prob = tf.nn.softmax(logits) + np.finfo(float).eps + loss = -(tf.reduce_sum(labels * tf.math.log(smoothed_prob), axis=-1)) return losses_utils.compute_weighted_loss( loss, sample_weight, reduction=self.reduction) diff --git a/matchzoo/losses/rank_hinge_loss.py b/matchzoo/losses/rank_hinge_loss.py index 7b74887d..157f8a85 100644 --- a/matchzoo/losses/rank_hinge_loss.py +++ b/matchzoo/losses/rank_hinge_loss.py @@ -1,6 +1,7 @@ """The rank hinge loss.""" import numpy as np +import tensorflow as tf from keras import layers, backend as K from keras.losses import Loss from keras.utils import losses_utils @@ -41,7 +42,6 @@ def call(self, y_true: np.array, y_pred: np.array, """ Calculate rank hinge loss. - :param **kwargs: :param y_true: Label. :param y_pred: Predicted result. :return: Hinge loss computed by user-defined margin. @@ -54,8 +54,9 @@ def call(self, y_true: np.array, y_pred: np.array, layers.Lambda( lambda a: a[(neg_idx + 1)::(self._num_neg + 1), :], output_shape=(1,))(y_pred)) - y_neg = K.mean(K.concatenate(y_neg, axis=-1), axis=-1, keepdims=True) - loss = K.maximum(0., self._margin + y_neg - y_pos) + y_neg = tf.concat(y_neg, axis=-1) + y_neg = tf.reduce_mean(y_neg, axis=-1, keepdims=True) + loss = tf.maximum(0., self._margin + y_neg - y_pos) return losses_utils.compute_weighted_loss( loss, sample_weight, reduction=self.reduction) diff --git a/matchzoo/models/conv_knrm.py b/matchzoo/models/conv_knrm.py index 19e07eaa..c074371e 100644 --- a/matchzoo/models/conv_knrm.py +++ b/matchzoo/models/conv_knrm.py @@ -1,7 +1,6 @@ """ConvKNRM model.""" import keras -import keras.backend as K import tensorflow as tf from .knrm import KNRM @@ -86,13 +85,13 @@ def build(self): mu = 1.0 mm_exp = self._kernel_layer(mu, sigma)(mm) mm_doc_sum = keras.layers.Lambda( - lambda x: K.sum(x, 2))( + lambda x: tf.reduce_sum(x, 2))( mm_exp) mm_log = keras.layers.Activation(tf.math.log1p)(mm_doc_sum) mm_sum = keras.layers.Lambda( - lambda x: K.sum(x, 1))(mm_log) + lambda x: tf.reduce_sum(x, 1))(mm_log) KM.append(mm_sum) - phi = keras.layers.Lambda(lambda x: K.stack(x, 1))(KM) + phi = keras.layers.Lambda(lambda x: tf.stack(x, 1))(KM) out = self._make_output_layer()(phi) self._backend = keras.Model(inputs=[query, doc], outputs=[out]) diff --git a/matchzoo/models/drmm.py b/matchzoo/models/drmm.py index e302062d..f1b19b48 100644 --- a/matchzoo/models/drmm.py +++ b/matchzoo/models/drmm.py @@ -3,11 +3,11 @@ import keras import keras.backend as K +import tensorflow as tf from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param from matchzoo.engine.param_table import ParamTable -from matchzoo.engine import hyper_spaces class DRMM(BaseModel): @@ -67,11 +67,11 @@ def build(self): # shape = [B, L, D] embed_query = embedding(query) # shape = [B, L] - atten_mask = K.not_equal(query, self._params['mask_value']) + atten_mask = tf.not_equal(query, self._params['mask_value']) # shape = [B, L] - atten_mask = K.cast(atten_mask, K.floatx()) + atten_mask = tf.cast(atten_mask, K.floatx()) # shape = [B, L, D] - atten_mask = K.expand_dims(atten_mask, axis=2) + atten_mask = tf.expand_dims(atten_mask, axis=2) # shape = [B, L, D] attention_probs = self.attention_layer(embed_query, atten_mask) @@ -114,7 +114,7 @@ def attention_layer(cls, attention_input: typing.Any, )(dense_input) # shape = [B, L, 1] attention_probs = keras.layers.Lambda( - lambda x: keras.activations.softmax(x, axis=1), + lambda x: tf.nn.softmax(x, axis=1), output_shape=lambda s: (s[0], s[1], s[2]), name="attention_probs" )(dense_input) diff --git a/matchzoo/models/drmmtks.py b/matchzoo/models/drmmtks.py index 3bfae201..4ce5edee 100644 --- a/matchzoo/models/drmmtks.py +++ b/matchzoo/models/drmmtks.py @@ -127,7 +127,7 @@ def attention_layer(cls, attention_input: typing.Any, )(dense_input) # shape = [B, L, 1] attention_probs = keras.layers.Lambda( - lambda x: keras.activations.softmax(x, axis=1), + lambda x: tf.nn.softmax(x, axis=1), output_shape=lambda s: (s[0], s[1], s[2]), name="attention_probs" )(dense_input) diff --git a/matchzoo/models/duet.py b/matchzoo/models/duet.py index bce9e9a3..22783fac 100644 --- a/matchzoo/models/duet.py +++ b/matchzoo/models/duet.py @@ -1,13 +1,11 @@ """DUET Model.""" import keras -import keras.backend as K import tensorflow as tf +from matchzoo.engine import hyper_spaces from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param -from matchzoo.engine.param_table import ParamTable -from matchzoo.engine import hyper_spaces class DUET(BaseModel): diff --git a/matchzoo/models/knrm.py b/matchzoo/models/knrm.py index 1aefee44..7d1ff915 100644 --- a/matchzoo/models/knrm.py +++ b/matchzoo/models/knrm.py @@ -1,11 +1,9 @@ """KNRM model.""" import keras -import keras.backend as K import tensorflow as tf from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param -from matchzoo.engine.param_table import ParamTable from matchzoo.engine import hyper_spaces @@ -70,13 +68,13 @@ def build(self): mu = 1.0 mm_exp = self._kernel_layer(mu, sigma)(mm) mm_doc_sum = keras.layers.Lambda( - lambda x: K.sum(x, 2))(mm_exp) + lambda x: tf.reduce_sum(x, 2))(mm_exp) mm_log = keras.layers.Activation(tf.math.log1p)(mm_doc_sum) mm_sum = keras.layers.Lambda( - lambda x: K.sum(x, 1))(mm_log) + lambda x: tf.reduce_sum(x, 1))(mm_log) KM.append(mm_sum) - phi = keras.layers.Lambda(lambda x: K.stack(x, 1))(KM) + phi = keras.layers.Lambda(lambda x: tf.stack(x, 1))(KM) out = self._make_output_layer()(phi) self._backend = keras.Model(inputs=[query, doc], outputs=[out]) @@ -91,6 +89,6 @@ def _kernel_layer(cls, mu: float, sigma: float) -> keras.layers.Layer: """ def kernel(x): - return K.exp(-0.5 * (x - mu) * (x - mu) / sigma / sigma) + return tf.math.exp(-0.5 * (x - mu) * (x - mu) / sigma / sigma) return keras.layers.Activation(kernel) diff --git a/matchzoo/models/mvlstm.py b/matchzoo/models/mvlstm.py index bb7f8fba..425a2b97 100644 --- a/matchzoo/models/mvlstm.py +++ b/matchzoo/models/mvlstm.py @@ -1,14 +1,12 @@ """An implementation of MVLSTM Model.""" -import typing import keras import tensorflow as tf -import matchzoo +from matchzoo.engine import hyper_spaces from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param from matchzoo.engine.param_table import ParamTable -from matchzoo.engine import hyper_spaces class MVLSTM(BaseModel): From 4ca0ddc56ab5d42b57b03538477f2bddde56caf8 Mon Sep 17 00:00:00 2001 From: zhaohao Date: Tue, 8 Oct 2019 17:40:43 +0900 Subject: [PATCH 100/100] optimize import --- matchzoo/contrib/layers/decaying_dropout_layer.py | 2 +- matchzoo/contrib/layers/semantic_composite_layer.py | 2 +- matchzoo/contrib/models/esim.py | 5 +++-- matchzoo/contrib/models/match_lstm.py | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/matchzoo/contrib/layers/decaying_dropout_layer.py b/matchzoo/contrib/layers/decaying_dropout_layer.py index 152b4a31..eb3f5949 100644 --- a/matchzoo/contrib/layers/decaying_dropout_layer.py +++ b/matchzoo/contrib/layers/decaying_dropout_layer.py @@ -1,7 +1,7 @@ """An implementation of Decaying Dropout Layer.""" -import keras.backend as K import tensorflow as tf +from keras import backend as K from keras.engine import Layer class DecayingDropoutLayer(Layer): diff --git a/matchzoo/contrib/layers/semantic_composite_layer.py b/matchzoo/contrib/layers/semantic_composite_layer.py index bda4834b..9f6cb5b4 100644 --- a/matchzoo/contrib/layers/semantic_composite_layer.py +++ b/matchzoo/contrib/layers/semantic_composite_layer.py @@ -1,7 +1,7 @@ """An implementation of EncodingModule for DIIN model.""" -import keras.backend as K import tensorflow as tf +from keras import backend as K from keras.engine import Layer from matchzoo.contrib.layers import DecayingDropoutLayer diff --git a/matchzoo/contrib/models/esim.py b/matchzoo/contrib/models/esim.py index d7e8eda5..539903ba 100644 --- a/matchzoo/contrib/models/esim.py +++ b/matchzoo/contrib/models/esim.py @@ -1,11 +1,12 @@ """ESIM model.""" + import keras -import tensorflow as tf import keras.backend as K +import tensorflow as tf import matchzoo as mz -from matchzoo.engine.param import Param from matchzoo.engine.base_model import BaseModel +from matchzoo.engine.param import Param from matchzoo.engine.param_table import ParamTable diff --git a/matchzoo/contrib/models/match_lstm.py b/matchzoo/contrib/models/match_lstm.py index 933451fc..f8c073d3 100644 --- a/matchzoo/contrib/models/match_lstm.py +++ b/matchzoo/contrib/models/match_lstm.py @@ -1,7 +1,7 @@ """Match LSTM model.""" import keras -import tensorflow as tf import keras.backend as K +import tensorflow as tf from matchzoo.engine.base_model import BaseModel from matchzoo.engine.param import Param