NLP聊天机器人训练报错:ValueError数组形状不均匀问题
报错原因分析
这个ValueError的核心原因是你试图将形状不均匀的列表转换为NumPy数组。具体来说,training列表中的每个元素是[bag, cikti_sira],但其中部分bag或cikti_sira的长度不一致,导致NumPy无法创建规整的二维数组(报错提示检测到形状为(20, 2) + 不均匀部分,说明前两维是20行2列,但内部元素长度不统一)。
大概率是bag的长度出现了不一致:bag通过遍历kelimeler生成,如果kelimeler在循环过程中被修改(比如动态添加/删除元素),或是本身是长度不固定的集合,就会导致不同belge生成的bag长度不一样。
解决方法
方法1:跳过将整个training转为NumPy数组的步骤(推荐)
你的后续代码仅需从training中拆分出train_x和train_y,完全不需要先把整个列表转成NumPy数组。直接在列表层面拆分即可,避免不均匀形状的问题:
修改代码如下:
random.shuffle(training) # 移除 training = np.array(training) 这一行 train_x = [item[0] for item in training] train_y = [item[1] for item in training]
后续的神经网络训练代码无需改动,model.fit会自动将列表处理为规整的NumPy数组。
方法2:确保所有bag和cikti_sira长度统一
如果你一定要保留将training转为NumPy数组的步骤,需先排查并修复长度不一致的问题:
- 检查
kelimeler是否是固定长度的词汇表:确保它在循环开始前就已预处理完成,循环过程中不会被修改。 - 在循环中添加长度校验,定位异常数据:
for belge in belgeler: bag = [] kelime_patternleri = belge[0] kelime_patternleri = [ayristirici.lemmatize(kelime.lower()) for kelime in kelime_patternleri] for kelime in kelimeler: bag.append(1) if kelime in kelime_patternleri else bag.append(0) cikti_sira = list(bos_cikti) cikti_sira[siniflar.index(belge[1])] = 1 # 添加长度校验,定位异常数据 assert len(bag) == len(kelimeler), f"Bag长度不匹配,问题数据:{belge}" assert len(cikti_sira) == len(siniflar), f"Cikti_sira长度不匹配,问题数据:{belge}" training.append([bag, cikti_sira])
运行后如果触发断言错误,就能定位到导致长度不一致的具体belge数据,进而修复数据或预处理逻辑。
内容的提问来源于stack exchange,提问作者Elvan Ersöz
相关产品推荐
相关产品推荐

