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

词形还原时出现'list'无lower属性错误的解决方法

错误分析与修复方案

1. 核心错误原因

触发AttributeError: 'list' object has no attribute 'lower'的直接原因是代码逻辑错误:

word_patterns = documents[0]
word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]

documents中的每个元素是(word_list, tag)格式的元组,documents[0]会固定取数据集的第一个元组。遍历这个元组时,第一个元素是word_list(列表类型),尝试对列表调用lower()方法自然会报错——列表没有这个字符串方法。同时这里还存在逻辑错误:循环遍历documents时,应该处理当前迭代的document,而非固定取第一个文档。

除此之外,代码还有两处隐性错误会导致后续运行失败:

  • training.append(bag, output_row):list.append()仅接受一个参数,直接传两个参数会触发语法错误
  • pickle.dump(words, open('classes.pkl', 'wb')):错误地将words重复存入classes.pkl,应该存储classes数组

2. 分步修复方案

步骤1:修正文档词列表获取逻辑

将固定取第一个文档改为取当前循环的文档词列表:

for document in documents:
    bag = []
    word_patterns = document[0]  # 改为当前document的词列表
    word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
    # 后续代码不变

步骤2:修复训练数据存储方式

将bag和output_row打包成列表后再存入training:

training.append([bag, output_row])

步骤3:修正Pickle存储错误

将classes存入对应的classes.pkl文件:

pickle.dump(words, open('words.pkl', 'wb'))
pickle.dump(classes, open('classes.pkl', 'wb'))  # 替换为classes

3. 修复后的关键代码片段

# ... 前面导入、数据预处理代码不变

pickle.dump(words, open('words.pkl', 'wb'))
pickle.dump(classes, open('classes.pkl', 'wb'))

training=[]
output_empty = [0] * len(classes)

for document in documents:
    bag = []
    word_patterns = document[0]
    word_patterns = [lemmatizer.lemmatize(word.lower()) for word in word_patterns]
    for word in words:
        bag.append(1) if word in word_patterns else bag.append(0)
    
    output_row = list(output_empty )
    output_row[classes.index(document[1])] = 1
    training.append([bag, output_row])

# ... 后面神经网络构建、训练代码不变

内容的提问来源于stack exchange,提问作者L bozo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:53:22