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

Python中对字符串ndarray执行lemmatize操作时遭遇TypeError的解决方法问询

问题解析与解决办法

Hey Juan, let's break down your problem and fix it step by step.

一、为什么会抛出TypeError?

你这里其实踩了两个小坑:

  1. 字符串是不可变对象:Python里的字符串一旦创建,就没法直接修改它的单个字符。你写的X[i][j]是在取X[i]这条短信(字符串)的第j个字符,然后试图给这个字符赋值——这就触碰了字符串不可变的特性,所以报错。而你说的x = "xyz"再x = "lkjsl"是给变量x重新绑定一个全新的字符串,不是修改原有字符串的内部元素,这俩操作本质完全不一样。
  2. 循环逻辑多余:你的内层for j in range(len(X[i]))完全没必要!X[i]本身就是一条完整的短信句子,你的lemmatizeSentence函数就是用来处理整个句子的,根本不需要遍历句子里的每个字符。

二、几种可行的解决方法

方法1:修正循环逻辑,直接修改原numpy数组

既然X是numpy的字符串数组,你可以直接对每个元素(整条句子)调用词形还原函数,去掉多余的内层循环就行:

for i in range(len(X)):
    # 直接把整条句子传入函数,替换X[i]的内容
    X[i] = lemmatizeSentence(X[i])

这里是给numpy数组的元素X[i]重新赋值一个新字符串,不是修改原有字符串的内部字符,所以不会报错。

方法2:创建新数组X1(推荐更简洁的写法)

如果不想改动原数组,用列表推导式批量处理会更高效优雅:

# 遍历X里的每个句子,批量处理后转成numpy数组
X1 = numpy.array([lemmatizeSentence(sentence) for sentence in X])

这种写法比手动写循环更简洁,也符合Python的惯用风格。

方法3:直接用Pandas处理(最推荐)

其实你完全没必要转成numpy数组,直接在DataFrame上操作更省心:

df = pd.read_excel('spam.xlsx')
df['Class'] = df.Class.map({'ham':0, 'spam':1})
# 把下面的'短信内容列'换成你实际的列名(比如'text')
df['processed_text'] = df['短信内容列'].apply(lemmatizeSentence)
# 之后按需提取X和Y
X = df['processed_text'].to_numpy()
Y = df['Class'].to_numpy().astype('int')

这种方式代码更简洁,也能避免numpy数组操作的一些小坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:52:28