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

使用word_tokenize处理数据集列报错,求解三种写法差异

IMDB评论分词报错及三种写法差异疑问

我刚开始学习文本分析,在对IMDB电影评论数据集的review列分词时遇到问题:

我写的代码:

reviews_tokenized = word_tokenize(df['review'].astype(str))

运行后报错:

TypeError: expected string or bytes-like object

我已经用astype(str)转换了数据类型,还是搞不懂为什么出错。但用apply()就正常:

reviews_tokenized = df["review"].astype(str).apply(word_tokenize)

另外还有一段示例代码:

reviews_tokenized = df.apply(lambda row: nltk.word_tokenize(row['review']), axis=1)

想知道原代码出错的原因,以及这三种写法的区别。


原代码出错原因

nltk.word_tokenize()的设计是处理单个字符串,它只接受单个字符串作为输入参数。但你传入的df['review'].astype(str)是一个Pandas的Series对象(也就是一整列数据),不是单个字符串,函数无法识别这种批量数据结构,因此触发类型错误。

三种写法的区别

  1. 第一种写法(报错的)

    reviews_tokenized = word_tokenize(df['review'].astype(str))
    
    • 直接把整列Series传给仅支持单个字符串的word_tokenize,属于用法错误,完全无法实现批量分词需求。
  2. 第二种写法

    reviews_tokenized = df["review"].astype(str).apply(word_tokenize)
    
    • 这是Pandas处理单列批量操作的标准方式:
      • 先将review列转为字符串类型的Series;
      • 调用Series.apply()会自动遍历列中每一个元素(单条评论字符串),把每个字符串单独传给word_tokenize处理;
      • 最终返回一个新Series,每个元素对应原评论的分词结果列表。
    • 效率高,是处理单列文本操作的推荐写法。
  3. 第三种写法

    reviews_tokenized = df.apply(lambda row: nltk.word_tokenize(row['review']), axis=1)
    
    • 调用的是DataFrame的apply方法,axis=1表示按行遍历:
      • 每次遍历拿到一行数据,从中提取review字段的字符串;
      • 传给word_tokenize处理;
      • 最终返回的也是存储分词列表的Series。
    • 这种写法是按行全量遍历,效率低于第二种写法——如果DataFrame有其他无关列,会做很多无意义的遍历,仅适合需要同时处理多列数据的场景,单列操作优先选第二种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:44:58