使用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对象(也就是一整列数据),不是单个字符串,函数无法识别这种批量数据结构,因此触发类型错误。
三种写法的区别
第一种写法(报错的)
reviews_tokenized = word_tokenize(df['review'].astype(str))- 直接把整列
Series传给仅支持单个字符串的word_tokenize,属于用法错误,完全无法实现批量分词需求。
- 直接把整列
第二种写法
reviews_tokenized = df["review"].astype(str).apply(word_tokenize)- 这是Pandas处理单列批量操作的标准方式:
- 先将
review列转为字符串类型的Series; - 调用
Series.apply()会自动遍历列中每一个元素(单条评论字符串),把每个字符串单独传给word_tokenize处理; - 最终返回一个新
Series,每个元素对应原评论的分词结果列表。
- 先将
- 效率高,是处理单列文本操作的推荐写法。
- 这是Pandas处理单列批量操作的标准方式:
第三种写法
reviews_tokenized = df.apply(lambda row: nltk.word_tokenize(row['review']), axis=1)- 调用的是DataFrame的apply方法,
axis=1表示按行遍历:- 每次遍历拿到一行数据,从中提取
review字段的字符串; - 传给
word_tokenize处理; - 最终返回的也是存储分词列表的
Series。
- 每次遍历拿到一行数据,从中提取
- 这种写法是按行全量遍历,效率低于第二种写法——如果DataFrame有其他无关列,会做很多无意义的遍历,仅适合需要同时处理多列数据的场景,单列操作优先选第二种。
- 调用的是DataFrame的apply方法,
内容的提问来源于stack exchange,提问作者shallow_learning
相关产品推荐
相关产品推荐

