使用NLTK word_tokenize处理6000行文本文件时遇错误求助
嘿,来搞定这个NLTK分词报错问题!
从你贴的报错栈来看,问题出在word_tokenize内部调用sent_tokenize的时候。我帮你梳理下最可能的原因和对应的解决办法:
最常见的坑:把列表直接传给了word_tokenize
你说用split("\n")拆分了文件内容,那得到的应该是一个句子列表对吧?但word_tokenize只认字符串,直接传列表肯定炸锅!正确姿势是遍历每一行句子,逐个分词:
from nltk.tokenize import word_tokenize # 先正确读取并拆分文本 with open("你的文件.txt", "r", encoding="utf-8") as f: short_pos = f.read().split("\n") # 遍历每个句子,跳过空行再分词 short_pos_words = [] for sentence in short_pos: cleaned_sentence = sentence.strip() if cleaned_sentence: # 跳过空行避免无效操作 tokens = word_tokenize(cleaned_sentence) short_pos_words.extend(tokens)
另一种可能:文本编码搞事情
如果你的txt文件不是UTF-8编码(比如老系统常用的GBK),读取时会混入乱码字符,导致sent_tokenize解析失败。读取时指定编码就能解决:
with open("你的文件.txt", "r", encoding="utf-8") as f: # 直接读成完整字符串,让word_tokenize自己处理分句 full_text = f.read() short_pos_words = word_tokenize(full_text)
要是你已经分好行,不想再分句?
可以给word_tokenize加个preserve_line=True参数,这样它就不会多此一举调用sent_tokenize,直接对单句文本分词:
for sentence in short_pos: cleaned_sentence = sentence.strip() if cleaned_sentence: tokens = word_tokenize(cleaned_sentence, preserve_line=True) short_pos_words.extend(tokens)
处理6000行大文件的小技巧
一次性加载全部内容可能占内存,逐行读取更高效,还能定位出错行:
short_pos_words = [] with open("你的文件.txt", "r", encoding="utf-8") as f: for line_num, line in enumerate(f, 1): cleaned_line = line.strip() if not cleaned_line: continue try: tokens = word_tokenize(cleaned_line) short_pos_words.extend(tokens) except Exception as e: # 万一某行有问题,打印出来方便排查 print(f"第{line_num}行出错了:{cleaned_line}") print(f"错误信息:{str(e)}") # 可以选择跳过该行或者继续处理
内容的提问来源于stack exchange,提问作者Tuấn Mạnh Nguyễn
相关产品推荐
相关产品推荐

