说在前面
最近在使用langchain
框架来学习一些ai
应用的开发,在调用下面的方法读取markdown文件时遇到了一个奇怪的报错:
代码如下:
from langchain_community.document_loaders.markdown import UnstructuredMarkdownLoader
loader = UnstructuredMarkdownLoader("..//Introduction.md")
md_pages = loader.load()
报错信息如下:
BadZipFile: File is not a zip file
因为本身要读取的文档是markdown
格式,这里却反馈文件不是压缩文件。
解决思路
通过错误堆栈分析,问题正式出在了NLTK数据包自动下载的环节,其中正有一句话是
//...
nltk.download("averaged_perceptron_tagger_eng", quiet=True)
//...
modified_name = "/".join(pieces[:i] + [pieces[i] + ".zip"] + pieces[i:])
我的猜想是他执行download方法,然后失败了(因为需要科学上网),然后去找下载的zipfile的时候报的错误,不管怎么样,问题出在NLTK数据包自动下载环节。
我中间尝试了
import nltk
nltk.download('punkt') # 分词必需(约 40MB)
nltk.download('stopwords') # 停用词(约 1MB)
再或者将相关文件下载到指定目录下
python -m nltk.downloader -d "F:\nltk_data" punkt averaged_perceptron_tagger
当然,如果使用上述方式能下载成功,请记得将路径加入到nltk的path
import nltk
nltk.data.path.append(r"F:\nltk_data")
这两种方式最终都没能成功,明明有在科学上网,但是速度出奇的慢,索性我也不等了,直接去github上下载了下来,以要下载的punkt
为例,路径是:https://github.com/nltk/nltk_data/tree/gh-pages/packages/tokenizers
然后挨个下载以后,放到了对应的位置。
那么放到哪里呢?
import nltk
print(nltk.data.path)
打印出来的路径随便选择一个即可,或者你手动指定一个
import nltk
nltk.data.path.append(r"F:\nltk_data")
那我要是不能科学上网呢?
我发现即便是科学上网了直接下载压缩包也会失败,如果大家真有需求,可以留言,我帮你下载放到个百度网盘这种的地方。
再次报错
将文件都放到指定位置又报了一个错,最后定位到问题是zip文件没有解压缩,解压缩之后就可以正常运行了。最后的样子大概是这样:
说到最后
这一系列问题算上问大模型,和自己思考,前后用了小半天,挺尴尬的,如果你遇到相同的问题,希望可以帮助你快速解决问题。