Как генерировать предложения в чате на уровне символов? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь реализовать чат-бот на основе символов на турецком языке.Я использую пример генерации текста TFLearn по этой ссылке .

Я отредактировал функцию string_to_semi_redundant_sequences, так как хочу создать чат-бота.Первоначально эта модель создает один символ для последовательности символов, поэтому X сохраняет один горячий вектор последовательности символов каждого входного предложения, а Y сохраняет один горячий вектор одного символа, соответствующий этим последовательностям.Я изменил функцию следующим образом:

    def my_string_to_semi_redundant_sequences(inputs, targets, 
                                      seq_maxlen, char_idx):

      print('Vectorizing text...')

      len_chars = len(char_idx)

      X = numpy.zeros((len(inputs), seq_maxlen, len_chars), dtype=numpy.bool)
      Y = numpy.zeros((len(targets), seq_maxlen, len_chars), dtype=numpy.bool)

      for i, seq in enumerate(inputs):
        for t in range(seq_maxlen):

          if(seq[t] != '0'):
            X[i, t, char_idx[seq[t]]] = 1

          if(targets[i][t] != '0'):
            Y[i, t, char_idx[targets[i][t]]] = 1

      Y = Y.reshape([-1, seq_maxlen*len_chars ])

      print('Text vectorized.')
      print('Total sequences  : {:,}'.format(len(targets)))
      print('Distinct chars   : {:,}'.format(len_chars))

      return X, Y

Как видите, мой Y хранит более одного горячо закодированного символа.Он сохраняет цель (предложение) для соответствующего ввода (может рассматриваться как вопрос-ответ).И я изменил Y в [batch_size, seq_maxlen*len_chars], думая, что модель будет генерировать символы «seq_maxlen» для формирования предложения.А вот детали моей модели:

    maxlen = 50

    X, Y = my_string_to_semi_redundant_sequences(inputs, targets, 
                                         maxlen, char_idx)
    q = tflearn.input_data([None, maxlen, len(char_idx)])
    q = tflearn.lstm(q, 128, return_seq=True)
    q = tflearn.dropout(q, 0.2)
    q = tflearn.lstm(q, 128, return_seq=True)
    q = tflearn.dropout(q, 0.2)
    q = tflearn.lstm(q, 128)
    q = tflearn.dropout(q, 0.2)

    q = tflearn.fully_connected(q, maxlen*len(char_idx), activation='softmax')
    q = tflearn.regression(q, optimizer='adam', 
                           loss='categorical_crossentropy', 
                           learning_rate=0.001)

    m = tflearn.SequenceGenerator(q, dictionary=char_idx, 
                                  seq_maxlen=maxlen, 
                                  clip_gradients=5.0,  
                                  checkpoint_path='model_mentalist')
    m.fit(X, Y, validation_set=0.1, batch_size=32, n_epoch=500, 
  run_id='mentalist', snapshot_epoch=False, snapshot_step=2000)

Длина моего словаря символов составляет 94. И так как я хочу, чтобы модель производила 50 (максленовых) символов, я установил количество единиц maxlen*len(char_idx) вfully_connected_layer.

Я обучил модель около 2000 шагов, просто убедитесь, что все в порядке.И я хотел увидеть какой-то результат.Но когда я попытался сгенерировать ответ с:

    m.generate(maxlen, temperature=0.5, seq_seed=string))

, я получил эту ошибку:

    KeyError                                  Traceback (most recent call last)
    <ipython-input-9-fbc4c70d085d> in <module>()
          5   string = input('Sen: ')
          6   if string != 'çıkış':
    ----> 7     print('Jane: ' + m.generate(50, temperature=0.5, seq_seed=string))

    /usr/local/lib/python3.6/dist-packages/tflearn/models/generator.py in generate(self, seq_length, temperature, seq_seed, display)
        216             preds = self._predict(x)[0].tolist()
        217             next_index = _sample(preds, temperature)
    --> 218             next_char = self.rev_dic[next_index]
        219 
        220             try: #Python 2

    KeyError: 3274

Я думаю, что это как-то связано с размерами моих входов (X и Y) и размерность complete_connected_layer.Потому что, когда я пытался изменить Y в [-1,len(char_idx)] и установить n_units из fully_connected_layer в len(char_idx), я не получил никакой ошибки, но результаты казались очень плохими даже с более чем 40 000 шагов обучения.

ТакМожете ли вы помочь мне понять, что я делаю неправильно?

Спасибо.

...