返回

ChatterBot 报错“OSError: [E941]”?两种方法解决兼容问题

windows

ChatterBot 与 Spacy 的爱恨情仇:解决“OSError: [E941] Can't find model 'en'”错误

不少 Python 爱好者,尤其是在自然语言处理领域初探的开发者,在启动他们首个 ChatterBot 聊天机器人程序时,或许都经历过“OSError: [E941] Can't find model 'en'”错误的“见面礼”。这个错误的罪魁祸首,其实是 ChatterBot 与其倚赖的自然语言处理库 Spacy 之间版本不兼容的“爱恨情仇”。

当你遇到这个错误时,代码通常会明确指出问题所在:

OSError: [E941] Can't find model 'en'. It looks like you're trying to load a model from a shortcut, which is deprecated as of spaCy v3.0. To load the model, use its full name instead:

nlp = spacy.load("en_core_web_sm")

Spacy 从 3.0 版本开始,便不再支持使用像 "en" 这样的简略名称加载英文模型,取而代之的是要求使用完整的模型名称,例如 "en_core_web_sm"。

想要解决这个问题,我们可以采取两种策略:

策略一:回到过去,安装指定版本的 Spacy

在 Spacy 3.0 版本之前的版本,比如 Spacy 2.x 版本,仍然坚守着使用 "en" 加载英文模型的传统。 因此,我们可以尝试卸载当前版本的 Spacy,然后穿越回 2.x 版本的怀抱:

  1. 首先,我们要和现有的 Spacy 版本说再见:

    pip uninstall spacy
    
  2. 然后,迎接我们心仪的 Spacy 2.x 版本 (可以选择任何 2.x 版本):

    pip install spacy==2.3.7  
    

    完成安装后,再次运行你的 ChatterBot 程序,"OSError: [E941]" 错误应该就会销声匿迹了。

策略二:面向未来,修改 ChatterBot 源码

如果你坚持拥抱最新版本的 Spacy,那么就需要对 ChatterBot 源码中加载 Spacy 模型的部分进行一些“手术”。

  1. 首先,找到 ChatterBot 安装目录下的 tagging.py 文件,它就如同 ChatterBot 的心脏。

  2. tagging.py 文件中找到 __init__ 方法,它就如同心脏中的一个重要阀门,将其中:

    self.nlp = spacy.load(self.language.ISO_639_1.lower())
    

    这句代码,替换成:

    self.nlp = spacy.load("en_core_web_sm")  # 或者其他你钟爱的英文模型
    

    就像为心脏更换了一个更强大的阀门,保存文件后,重新运行你的 ChatterBot 程序,它就能活力满满地运行了。

需要注意的是,修改 ChatterBot 源码如同进行一场“心脏手术”,可能会对未来的更新造成影响。建议你在“手术”前备份源码,并在更新 ChatterBot 版本后检查是否需要重新“动刀”。

总而言之,“OSError: [E941] Can't find model 'en'”错误的根源在于 Spacy 版本变更带来的兼容性问题,如同 ChatterBot 和 Spacy 之间产生了一点小矛盾。 我们可以通过安装指定版本的 Spacy 或修改 ChatterBot 源码这两种方式,化解它们的“矛盾”,让你的 ChatterBot 程序恢复和谐,顺利运行。

常见问题解答

  1. 除了 "en_core_web_sm",还有哪些英文 Spacy 模型可以选择?
    除了 "en_core_web_sm",还有 "en_core_web_md"、"en_core_web_lg" 等英文 Spacy 模型,它们的区别在于模型大小和功能的强弱。 "en_core_web_sm" 模型体积最小,功能相对简单;"en_core_web_lg" 模型体积最大,功能也最为强大。你可以根据自己的需要选择合适的模型。

  2. 修改 ChatterBot 源码后,如何更新 ChatterBot 版本?
    即使修改了 ChatterBot 源码,你仍然可以使用 pip 命令更新 ChatterBot 版本。 但是,更新后你需要检查你修改过的部分是否被覆盖,如果被覆盖了,你需要重新修改。

  3. 为什么 Spacy 3.0 版本后不再支持使用简略名称加载模型?
    Spacy 3.0 版本后,为了更好地支持多语言模型和自定义模型,决定不再支持使用简略名称加载模型。 使用完整的模型名称可以避免歧义,也更方便模型管理。

  4. ChatterBot 还有哪些依赖库?
    除了 Spacy,ChatterBot 还依赖于其他 Python 库,例如 PyYAML、SQLAlchemy 等。 在安装 ChatterBot 时,pip 会自动安装这些依赖库。

  5. 如何学习 ChatterBot 和 Spacy?
    你可以访问 ChatterBot 和 Spacy 的官方网站,查阅它们的文档和教程。 此外,网上也有很多 ChatterBot 和 Spacy 的学习资源,例如博客文章、视频教程等。