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

调用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. 步骤1的列表推导式未处理原数据中的空值,若title列存在缺失,s可能是None而非字符串
  2. 步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:10:28