TypeError:使用 pyLDAvis.display() 函数时,“复杂”类型的对象不是 JSON 可序列化的
Posted
技术标签:
【中文标题】TypeError:使用 pyLDAvis.display() 函数时,“复杂”类型的对象不是 JSON 可序列化的【英文标题】:TypeError: Object of type 'complex' is not JSON serializable while using pyLDAvis.display() function 【发布时间】:2018-03-04 22:06:39 【问题描述】:我有一个包含九个文档的文档术语矩阵:
我正在运行如下代码:
import pyLDAvis.gensim
topicData = pyLDAvis.gensim.prepare(ldamodel, docTermMatrix, dictionary)
pyLDAvis.display(topicData)
执行 pyLDAvis.display 函数时出现以下错误:
TypeError:“复杂”类型的对象不是 JSON 可序列化的
有人可以在这里指导吗?可能是什么原因?
【问题讨论】:
【参考方案1】:我遇到了同样的问题。在 user3411846 引用的 GH 问题之后,我找到了一个不同的、更简单的解决方案。
复数来自坐标计算并指定“mds”工作。
https://github.com/bmabey/pyLDAvis/issues/69#issuecomment-311337191
所以你的代码是
topicData = pyLDAvis.gensim.prepare(ldamodel, docTermMatrix, dictionary, mds='mmds')
其他 mds 选项在这里:https://pyldavis.readthedocs.io/en/latest/modules/API.html#pyLDAvis.prepare
【讨论】:
同理,我设置了mds='tsne'
,也解决了问题。【参考方案2】:
将这行代码添加到你的pyLDAvis pyLDAvis/utils.py
if np.iscomplexobj(obj):
return abs(obj)
此错误已在 GitHub 上报告GitHub Issue
【讨论】:
【参考方案3】:将此添加到您的 pyldavis/utils.py (NumPyEncoder) 如果 np.iscomplexobj(obj): 返回 abs(obj)
类 NumPyEncoder(json.JSONEncoder): 默认默认值(自我,obj): 如果 isinstance(obj, np.int64) 或 isinstance(obj, np.int32): 返回整数(obj) 如果 isinstance(obj, np.float64) 或 isinstance(obj, np.float32): 返回浮动(obj) 如果 np.iscomplexobj(obj): 返回abs(obj) 返回 json.JSONEncoder.default(self, obj)
#解决了我的问题
【讨论】:
以上是关于TypeError:使用 pyLDAvis.display() 函数时,“复杂”类型的对象不是 JSON 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章