如何在字符级聊天机器人中生成句子?

时间:2018-12-24 20:21:46

标签: python tensorflow chatbot tflearn

我正在尝试用土耳其语实现基于字符的聊天机器人。我在此link上使用TFLearn的文本生成示例。

由于要创建聊天机器人,因此我编辑了string_to_semi_redundant_sequences函数。最初,此模型为一个字符序列生成单个字符,因此X保留每个输入语句的char-char序列的一个热向量,而Y保持与这些序列相对应的单个char的一个热向量。我将功能更改为:

    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保留了一个以上的单热编码字符。它保留相应输入的目标(句子)(可以认为是“问题-响应”)。我认为模型将产生“ seq_maxlen”字符以构成一个句子,从而将Y重塑为[batch_size, seq_maxlen*len_chars]。这是我的模型的详细信息:

    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)

我的char字典的长度为94。由于我希望模型产生50(最大)个char,因此我在maxlen*len(char_idx)中设置了fully_connected_layer的单位数。

我训练了该模型约2000步,只需确保一切都OK。我想看到一些结果。但是当我尝试使用以下方法生成响应时:

    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)的尺寸以及fully_connected_layer的尺寸有关。因为当我尝试将Y整形为[-1,len(char_idx)]并将n_units的{​​{1}}设置为fully_connected_layer时,我没有出现错误,但是即使经过40.000多个训练步骤,结果仍然非常糟糕

那么您能帮我看看我做错了什么吗?

谢谢。

0 个答案:

没有答案