调用NLTK word_tokenize触发TypeError:预期字符串/类字节对象
解决NLTK word_tokenize触发的TypeError问题
问题场景
执行以下文本处理流程时,最后一步调用word_tokenize触发TypeError:
步骤1:正则处理文本
all_data_article['title']=[r.sub( '', s) for s in all_data_article['title'].tolist()] all_data_article['url']=[r.sub( '', str(s)) for s in all_data_article['url'].tolist()] all_data_article.head()
步骤2:分割标题
all_data_title= all_data_article['title'].str.split(" ", n = 1, expand = True) print(all_data_title)
步骤3:预处理准备分词
all_data_title[1].str.lower() import nltk from nltk.tokenize import word_tokenize nltk.download('stopwords') nltk.download('punkt') f = open("tala-stopwords-idn.txt", "r") stopword_list = [] for line in f: stripped_line = line.strip() line_list = stripped_line.split() stopword_list.append(line_list[0]) f.close() len(stopword_list) data_article = [] data_article = all_data_title[1].str.lower() print(data_article)
触发错误的代码
results_token = [] for sentence in data_article: results_token.append(word_tokenize(sentence))
错误信息
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-37-f435928e3594> in <module> 1 results_token = [] 2 for sentence in data_article: ----> 3 results_token.append(word_tokenize(sentence)) 9 frames /usr/local/lib/python3.7/dist-packages/nltk/tokenize/punkt.py in _match_potential_end_contexts(self, text) 1373 before_words = {} 1374 matches = [] -> 1375 for match in reversed(list(self._lang_vars.period_context_re().finditer(text))): 1376 # Ignore matches that have already been captured by matches to the right of this match 1377 if matches and match.end() > before_start: TypeError: expected string or bytes-like object
错误原因
word_tokenize仅支持字符串类型输入,但data_article中存在非字符串值(如NaN/None)。根源包括:
- 步骤1的列表推导式未处理原数据中的空值,若
title列存在缺失,s可能是None而非字符串 - 步骤2的
str.split分割后,部分行可能生成空值(比如标题只有单个词时,all_data_title[1]会返回NaN)
解决方案
1. 优化步骤1的正则处理,确保全为字符串
改用astype(str)+apply的方式,强制所有值转为字符串后再做正则替换,避免空值残留:
# 步骤1修复版 all_data_article['title'] = all_data_article['title'].astype(str).apply(lambda s: r.sub('', s)) all_data_article['url'] = all_data_article['url'].astype(str).apply(lambda s: r.sub('', s))
2. 清理data_article中的空值
生成data_article时,直接过滤NaN并强制转为字符串:
# 步骤3修复版 data_article = all_data_title[1].str.lower().dropna().astype(str)
3. 循环中加入安全判断(双重保障)
即使前面的清理有遗漏,循环内判断输入类型,避免报错:
results_token = [] for sentence in data_article: # 仅处理非空字符串 if isinstance(sentence, str) and sentence.strip(): results_token.append(word_tokenize(sentence)) else: results_token.append([]) # 用空列表占位,或直接跳过该条数据
内容的提问来源于stack exchange,提问作者Xalvetra
相关产品推荐
相关产品推荐

