如何通过词列表对DataFrame文本分类?求修正代码
修正文本分类代码的解决方案
先梳理下你原代码里存在的几个关键问题:
- pandas读取方法写错了:应该是
pd.read_csv()而非pd_read_csv() - 遍历DataFrame行的方式错误:
df[i]无法正确获取每行的文本内容,得用行迭代或者索引定位的方式 - 变量名不匹配:你定义的分类词列表是
Product,但代码里用到了未定义的positive变量 - 链式索引有风险:
df['classify'][i]这种写法容易触发SettingWithCopyWarning,推荐用更安全的df.loc[i, 'classify'] - 标点处理不彻底:只去除了单词末尾的标点,应该覆盖所有位置的标点,还要考虑大小写匹配问题
- 默认值不符合需求:原代码把
classify初始化为空字符串,而你需要默认填充none
下面是修复后的完整代码:
import pandas as pd from collections import Counter import string # 定义分类词列表 class_words = ['Fish','food','Product','Expensive','cheap','expensive','seafood','ice cream','delicious','taste','smell','selection','price','grilled'] # 统一转为小写,避免大小写导致的匹配失败 class_words_lower = [word.lower() for word in class_words] # 读取CSV文件 df = pd.read_csv("text.csv") # 直接初始化classify列为'none' df['classify'] = 'none' # 遍历每行数据 for idx, row in df.iterrows(): paragraph = row['Text'] # 去除所有标点并转为小写 translator = str.maketrans('', '', string.punctuation) cleaned_text = paragraph.translate(translator).lower() # 拆分单词 words = cleaned_text.split() # 检查每个单词是否在分类词列表中 for word in words: if word in class_words_lower: # 还原为原列表中的对应词(保留原大小写) original_word = next(w for w in class_words if w.lower() == word) df.loc[idx, 'classify'] = original_word # 找到第一个匹配就退出循环,避免后续匹配覆盖结果 break
关键改进说明:
- 大小写统一处理:把分类词和文本都转为小写,解决像
Expensive和expensive这类大小写不同导致的匹配失败问题 - 彻底的标点清除:用
string.punctuation去除所有标点,比只处理末尾标点更全面 - 安全的赋值方式:用
df.loc[idx, 'classify']修改DataFrame,避免链式索引带来的警告和潜在错误 - 直观的行迭代:用
df.iterrows()遍历行,比手动索引更清晰易用 - 匹配词还原:如果需要保留原分类词的大小写,找到匹配的小写词后会还原为原列表中的对应词
测试你给出的示例数据,运行代码后就能得到期望的结果:
| Text | Classify |
|---|---|
| "The food is bad" | food |
| "He parked the car" | none |
内容的提问来源于stack exchange,提问作者Kashan
相关产品推荐
相关产品推荐

