Python Keras词基聊天机器人报错ValueError: ['selam']不在列表中求修复
修复Keras词基聊天机器人的ValueError错误
我用Python Keras编写了一个词基聊天机器人程序,运行时抛出错误:ValueError: ['selam'] is not in list,完整代码如下:
import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation, Dropout from keras.optimizers import * import random import json # Veri setini oluştur. veri_seti = ['Selam', 'Merhaba','Nasılsın','İyiyim','Seni ne hakkında bilmek istersin?','Bilgisayar mühendisliği hakkında bilmek isterim','Bilgisayar mühendisliği, bilgisayar bilimleri, yazılım ve donanım temelli alanlarda çalışanlar için bir alandır.'] # Veri setinin temizlenmesi temiz_veri_seti = [] for soru in veri_seti: temiz_veri_seti.append(soru.lower().split()) # Sözlük oluşturma sozluk = {} for i in range(len(temiz_veri_seti)-1): kelime1 = " ".join(temiz_veri_seti[i]) kelime2 = " ".join(temiz_veri_seti[i+1]) if kelime1 not in sozluk.keys(): sozluk[kelime1] = [] sozluk[kelime1].append(kelime2) # Sözlüğü dosyaya kaydetme with open('sozluk.json','w') as dosya: json.dump(sozluk,dosya) # Modeli oluşturma model = Sequential() model.add(Dense(128, input_shape=(len(sozluk.keys()),))) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(len(sozluk.keys()))) model.add(Activation('softmax')) # Modeli derleme model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # Modeli eğitme X = np.zeros((len(temiz_veri_seti)-1, len(sozluk.keys())), dtype=bool) y = np.zeros((len(temiz_veri_seti)-1, len(sozluk.keys())), dtype=bool) for i, sözcükler in enumerate(temiz_veri_seti[:-1]): X[i, list(sozluk.keys()).index(sözcükler)] = 1 y[i, list(sozluk.keys()).index(temiz_veri_seti[i+1])] = 1 model.fit(X, y, epochs=500, batch_size=len(veri_seti)) def konus(): kelime1 = random.choice(list(sozluk.keys())) mesaj = kelime1.capitalize() while True: if kelime1 in sozluk.keys(): kelime2 = model.predict(np.array([X[list(sozluk.keys()).index(kelime1)]])) kelime2 = np.argmax(kelime2) kelime2 = list(sozluk.keys())[kelime2] mesaj += ' ' + kelime2 if kelime2.endswith('.'): break else: kelime1 = kelime2 else: break print(mesaj) konus()
错误信息:
File "", line 45, in ValueError: ['selam'] is not in list
错误原因
错误出现在训练数据构建的循环中:
for i, sözcükler in enumerate(temiz_veri_seti[:-1]): X[i, list(sozluk.keys()).index(sözcükler)] = 1 y[i, list(sozluk.keys()).index(temiz_veri_seti[i+1])] = 1
这里的sözcükler和temiz_veri_seti[i+1]都是列表类型(比如['selam']),但sozluk.keys()存储的是字符串类型(比如'selam'),调用index()方法时找不到匹配项,因此抛出ValueError。
修复方法
将循环中的列表对象用" ".join()转换成字符串,和sozluk的key格式保持一致:
修改后的训练循环代码
for i, sözcükler in enumerate(temiz_veri_seti[:-1]): # 将列表转为字符串,匹配sozluk的key格式 input_str = " ".join(sözcükler) target_str = " ".join(temiz_veri_seti[i+1]) X[i, list(sozluk.keys()).index(input_str)] = 1 y[i, list(sozluk.keys()).index(target_str)] = 1
完整修复后代码
import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation, Dropout from keras.optimizers import * import random import json # Veri setini oluştur. veri_seti = ['Selam', 'Merhaba','Nasılsın','İyiyim','Seni ne hakkında bilmek istersin?','Bilgisayar mühendisliği hakkında bilmek isterim','Bilgisayar mühendisliği, bilgisayar bilimleri, yazılım ve donanım temelli alanlarda çalışanlar için bir alandır.'] # Veri setinin temizlenmesi temiz_veri_seti = [] for soru in veri_seti: temiz_veri_seti.append(soru.lower().split()) # Sözlük oluşturma sozluk = {} for i in range(len(temiz_veri_seti)-1): kelime1 = " ".join(temiz_veri_seti[i]) kelime2 = " ".join(temiz_veri_seti[i+1]) if kelime1 not in sozluk.keys(): sozluk[kelime1] = [] sozluk[kelime1].append(kelime2) # Sözlüğü dosyaya kaydetme with open('sozluk.json','w') as dosya: json.dump(sozluk,dosya) # Modeli oluşturma model = Sequential() model.add(Dense(128, input_shape=(len(sozluk.keys()),))) model.add(Activation('relu')) model.add(Dropout(0.2)) model.add(Dense(len(sozluk.keys()))) model.add(Activation('softmax')) # Modeli derleme model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # Modeli eğitme - 修复部分 X = np.zeros((len(temiz_veri_seti)-1, len(sozluk.keys())), dtype=bool) y = np.zeros((len(temiz_veri_seti)-1, len(sozluk.keys())), dtype=bool) for i, sözcükler in enumerate(temiz_veri_seti[:-1]): input_str = " ".join(sözcükler) target_str = " ".join(temiz_veri_seti[i+1]) X[i, list(sozluk.keys()).index(input_str)] = 1 y[i, list(sozluk.keys()).index(target_str)] = 1 model.fit(X, y, epochs=500, batch_size=len(veri_seti)) def konus(): kelime1 = random.choice(list(sozluk.keys())) mesaj = kelime1.capitalize() while True: if kelime1 in sozluk.keys(): kelime2 = model.predict(np.array([X[list(sozluk.keys()).index(kelime1)]])) kelime2 = np.argmax(kelime2) kelime2 = list(sozluk.keys())[kelime2] mesaj += ' ' + kelime2 if kelime2.endswith('.'): break else: kelime1 = kelime2 else: break print(mesaj) konus()
内容的提问来源于stack exchange,提问作者willy.js
相关产品推荐
相关产品推荐

