关于pyLDAvis依赖包版本问题

老师让跑个LDA试试,跑出来感觉那几个主题好像也没什么大差别;于是乎想要可视化看一看。网上搜了下,似乎都在用pyLDAvis库做LDA的可视化,于是就想着试试呗。结果安装完之后一import pyLDAvis就会出错,错误可谓层出不穷。绕了几圈回来总算解决了。

听起来很轻松其实搞了五个小时(。
文科生解决计算机问题be like

总结下来报错内容无非这几个:

ImportError: cannot import name 'soft_unicode' from 'markupsafe'
ImportError: cannot import name '_PassArg' from 'jinja2.utils'
AttributeError: module 'numpy' has no attribute 'typeDict'

似乎是因为pyLDAvis的这几个依赖包都经历过破坏更新,网上的解决方案都是让降版本。但这里就很微妙了:前两个报错呈现互补分布状态,jinja2版本一旦高于2.11.3就会报ImportError: cannot import name '_PassArg' from 'jinja2.utils',而且更微妙的是这个错误全网找不到有人问过(。jinja2一旦固定在“能稳定工作的最新版本”(指2.11.3)就会报ImportError: cannot import name 'soft_unicode' from 'markupsafe',而且这个错误无法通过网上给出的把markupsafe版本降到2.0.1解决(意思是试遍了所有版本都没用)。

走投无路之际看到CSDN上的一篇文章1,曰弃用警告:“soft_unicode”已重命名为“soft_str”.旧名称将在 MarkupSafe 2.1 中删除. 。作者说“一个很自然的想法就是把它重命名回来——但是笔者代码水平有限怕改出问题”,然而虽然我代码水平亦有限,但我是最不怕出问题的:大不了重新装一遍。于是我进了所有报错的文件把'soft_unicode'全部查找替换成'soft_str'(。

接着又报错AttributeError: module 'numpy' has no attribute 'typeDict',不过这个把numpy版本换成1.21就行了。最后成功把结果跑出来了。其实一边运行还一边拉了一堆(字面意义上的一堆)DeprecationWarning: 'np.typeDict' is a deprecated alias for 'np.sctypeDict'.出来不过我也懒得管了。

总之这个问题肯定有不这么丑陋的解决办法,但能跑出来就是胜利(。不管怎么说我这点编程技术还是很不够看的,希望以后能多学点东西。

  1. https://blog.csdn.net/m0_73585512/article/details/131810307