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

NLTK中出现TypeError: unhashable type: 'list'错误求助

解决词形还原时的“unhashable type: 'list'”错误

问题根源

你代码里的words列表存的是整个分词后的列表,不是单个单词:

  • 循环中用了words.append(word_list),把nltk.word_tokenize()返回的列表直接作为元素加入words,导致words的每个元素都是列表类型
  • lemmatizer.lemmatize()要求传入单个字符串单词,传列表必然触发错误;后续set(words)也会因为列表是不可哈希类型报错

修复步骤

1. 修正单词列表的填充方式

把append换成extend,逐个添加分词后的单词,而不是添加整个列表:

from nltk.corpus.reader import wordlist
import nltk
from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
words = []
classes = []
documents = []
ignore = ['?', '!', ',', '.']


for intent in intents['intents']:
  for pattern in intent['patterns']:
    word_list = nltk.word_tokenize(pattern)
    words.extend(word_list)  # 逐个添加单词到words
    documents.append((word_list, intent['tag']))
    if intent['tag'] not in classes:
      classes.append(intent['tag'])

2. 修正词形还原逻辑

过滤标点后执行词形还原,建议统一转小写避免重复:

# 过滤标点、转小写、词形还原
words = [lemmatizer.lemmatize(word.lower()) for word in words if word not in ignore]

# 去重并排序
words = sorted(set(words))

额外说明

  • word.lower()是为了消除大小写差异,比如"Hi"和"hi"会被处理成同一个词
  • 现在words里的元素都是字符串类型,完全符合词形还原和集合去重的要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:55:17