使用MultinomialNB处理CSV时出现TypeError: string indices must be integers如何修复
问题修复方案
错误原因
你当前触发报错的核心问题是Pandas DataFrame的遍历方式错误:直接写for row in dataset时,遍历返回的是每列的列名字符串,而非行数据,因此你尝试用row['Text']对字符串做索引时就会触发TypeError: string indices must be integers。
除此之外你的代码还存在3处逻辑问题:
CountVectorizer没有先拟合(fit)语料生成词汇表,直接调用transform会报错MultinomialNB模型没有提前使用标注好的训练数据拟合,无法直接执行预测- 循环内直接给
dataset['Type']赋值会覆盖整个列的内容,无法实现逐行写入预测结果的需求
修复代码
Pandas支持向量化操作,不需要写循环遍历每行,直接批量处理整列数据即可,修复后代码如下:
from sklearn.naive_bayes import MultinomialNB import pandas as pd from sklearn.feature_extraction.text import CountVectorizer # 读取数据 dataset = pd.read_csv("Test.csv", encoding='latin-1') # 初始化特征提取器和分类器 cv = CountVectorizer() clf = MultinomialNB() # -------------------------- # 注意:此处需要补充你的训练逻辑,你需要有标注好的训练数据先拟合cv和clf # 示例训练逻辑(替换为你自己的训练数据): # X_train = cv.fit_transform(训练数据的文本列) # y_train = 训练数据的标注列 # clf.fit(X_train, y_train) # -------------------------- # 批量预测测试集文本类型 X_test = cv.transform(dataset['Text']) dataset['Type'] = clf.predict(X_test) # 保存结果到新文件 dataset.to_csv("Test_with_Type.csv", index=False, encoding='latin-1')
如果你确实需要逐行遍历(不推荐,效率远低于向量化操作),可以改用iterrows()方法遍历,示例如下:
pred_list = [] for idx, row in dataset.iterrows(): text = row['Text'] data = cv.transform([text]) pred_list.append(clf.predict(data)[0]) dataset['Type'] = pred_list
内容的提问来源于stack exchange,提问作者Heleneh
相关产品推荐
相关产品推荐

