pandas Series传入word_tokenize触发TypeError类型报错问题
TypeError: expected string or bytes-like object:存储字符串数据的变量为何显示为不同类型?
问题复现
完成依赖库导入、数据集加载的前置准备后,执行如下代码:
import pandas as pd from nltk.tokenize import word_tokenize data = pd.read_csv("/content/gdrive/MyDrive/Data/tripadvisor_hotel_reviews.csv") reviews = data['Review'].str.lower() # 类型检查 print(reviews) print(type('Review')) print(type(reviews))
运行后输出如下:
0 nice hotel expensive parking got good deal sta... 1 ok nothing special charge diamond member hilto... 2 nice rooms not 4* experience hotel monaco seat... 3 unique, great stay, wonderful time hotel monac... 4 great stay great stay, went seahawk game aweso... ... 20486 best kept secret 3rd time staying charm, not 5... 20487 great location price view hotel great quick pl... 20488 ok just looks nice modern outside, desk staff ... 20489 hotel theft ruined vacation hotel opened sept ... 20490 people talking, ca n't believe excellent ratin... Name: Review, Length: 20491, dtype: object <class 'str'> <class 'pandas.core.series.Series'>
后续执行分词代码:
word_tokenize(reviews)
触发如下报错:
TypeError: expected string or bytes-like object
报错堆栈指向punkt分词器内部的正则匹配逻辑,无法在传入对象上执行finditer操作。
原因分析
type('Review')返回str是因为传入的参数是字符串字面量'Review',也就是DataFrame的列名字符串本身,和列中存储的评论数据没有任何关系。data['Review'].str.lower()返回的不是单个字符串,是pandas.core.series.Series类型的一维列对象,里面按行存储了20491条独立的字符串评论,是集合类型的容器,不是单个字符串值。- NLTK的
word_tokenize函数仅支持传入单个字符串或字节类型的文本作为输入,直接传入Series容器时,函数无法识别容器结构,自然抛出类型错误。
解决方案
根据分词需求二选一即可:
- 对每条评论单独分词,得到逐行分词后的结果:使用Series的
apply方法逐元素调用分词函数tokenized_reviews = reviews.apply(word_tokenize) - 需要把所有评论合并为单个长文本做整体分词:先把Series转为列表再拼接为单个字符串后传入
all_reviews_text = ' '.join(reviews.tolist()) tokenized_result = word_tokenize(all_reviews_text)
内容的提问来源于stack exchange,提问作者Mariangel Ibarra
相关产品推荐
相关产品推荐

