You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:50:25