Python中对字符串ndarray执行lemmatize操作时遭遇TypeError的解决方法问询
问题解析与解决办法
Hey Juan, let's break down your problem and fix it step by step.
一、为什么会抛出TypeError?
你这里其实踩了两个小坑:
- 字符串是不可变对象:Python里的字符串一旦创建,就没法直接修改它的单个字符。你写的
X[i][j]是在取X[i]这条短信(字符串)的第j个字符,然后试图给这个字符赋值——这就触碰了字符串不可变的特性,所以报错。而你说的x = "xyz"再x = "lkjsl"是给变量x重新绑定一个全新的字符串,不是修改原有字符串的内部元素,这俩操作本质完全不一样。 - 循环逻辑多余:你的内层
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
相关产品推荐
相关产品推荐

