Google Colab中utf-8解码错误求助:基于PyPDF4构建Word2Vec数据集的问题排查与解决
解决TensorFlow
vectorize_layer.get_vocabulary()的UTF-8解码错误及PDF文本处理优化方案 嘿,这个问题我太熟了——你踩了一个很典型的坑:用TensorFlow的纯文本数据集API去直接读PDF文件!让我给你拆解清楚问题,再给你一套可行的修复方案。
为什么会出现UTF-8解码错误?
你前面已经用PyPDF4把PDF里的文本提取成字符串了,但后面又错误地用tf.data.TextLineDataset('ITC-1.pdf')直接读取原始PDF文件。TextLineDataset是专门用来读取纯文本文件的,它会把文件内容当成UTF-8编码的文本解析,但PDF本质是二进制格式,里面包含大量非UTF-8的控制字节(比如你看到的0xb0),自然会触发解码失败。
而且你前面提取文本的步骤完全被浪费了,相当于做了无用功后又绕回错误的路径。
修复后的完整代码
下面是修正后的代码,核心思路是:用PyPDF4提取纯文本后,直接把文本转换成TensorFlow数据集,而不是去读原始PDF文件:
import PyPDF4 import tensorflow as tf from google.colab import files # 上传PDF文件 files.upload() # 用PyPDF4提取PDF中的纯文本 fileReader = PyPDF4.PdfFileReader('ITC-1.pdf') full_text = "" # 从第2页开始提取(保持你原来的页码逻辑) for i in range(2, fileReader.numPages): page_text = fileReader.getPage(i).extractText() full_text += page_text # 分割成句子(优化了空格处理,避免空句子) sentences = [] temp_text = full_text.strip() while '.' in temp_text: index = temp_text.find('.') # 提取句子并去掉前后空格 sentence = temp_text[:index].strip() if sentence: sentences.append(sentence) temp_text = temp_text[index+1:].strip() # 处理最后一段没有句号的文本 if temp_text: sentences.append(temp_text) # 用提取后的纯文本创建TensorFlow数据集 text_ds = tf.data.Dataset.from_tensor_slices(sentences) # 过滤空句子 text_ds = text_ds.filter(lambda x: tf.cast(tf.strings.length(x), bool)) # 初始化并适配文本向量化层 vectorize_layer = tf.keras.layers.TextVectorization() vectorize_layer.adapt(text_ds.batch(1024)) # 现在获取词汇表不会报错了! inverse_vocab = vectorize_layer.get_vocabulary() # 打印前10个词汇验证 print("前10个词汇:", inverse_vocab[:10])
更优的文本处理方案
你原来的按句号分割句子的逻辑比较简陋,遇到缩写(比如Mr.)、小数点(比如3.14)会错误分割句子。推荐用NLTK的专业句子分词器,在Colab里可以这样用:
# 安装并导入NLTK !pip install nltk import nltk nltk.download('punkt') from nltk.tokenize import sent_tokenize # 替换原来的句子分割部分 sentences = sent_tokenize(full_text) # 过滤空句子 sentences = [s.strip() for s in sentences if s.strip()]
这个分词器会智能识别句子边界,比手动按句号分割靠谱得多。
关键总结
- 永远不要用
TextLineDataset直接读取PDF、Word这类二进制格式的文件,必须先转换成纯文本 - 利用你已经提取好的文本创建数据集,不要做重复且错误的操作
- 复杂文本的分词尽量用专业工具,避免手动分割的缺陷
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

