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 可序列化的的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:str()最多使用1个参数(给定2个,TypeError:需要一个整数)

TypeError:无法使用玩笑读取未定义的属性“原型”

TypeError:“图像”对象不能使用 PIL 进行下标

使用敲除和微风时“TypeError:对象不是函数”

TypeError:无法使用 React 读取未定义的属性

TypeError:无法使用 discord.js 读取属性“”错误