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

如何通过词列表对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()遍历行,比手动索引更清晰易用
  • 匹配词还原:如果需要保留原分类词的大小写,找到匹配的小写词后会还原为原列表中的对应词

测试你给出的示例数据,运行代码后就能得到期望的结果:

TextClassify
"The food is bad"food
"He parked the car"none

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:36:34