下面是我使用多处理模块池的并行代码。在这里,参数 d 是一个元组,其word_number是一个整数,word_count是一个文档。
def perDoc(d):
score = 0.0
word_count = d.word_count
word_number = d.word_number
for i, word in enumerate(q):
if word not in corpus_query_min:
continue
if word not in word_count:
frequency = 0
else:
frequency = word_count.get(word)
score += np.log(np.float(frequency + miu * corpus_word_count[i]/corpus_number)/
(word_number + miu))
#loglh[d.docID] = score
if __name__ == '__main__':
pool = Pool(4)
pool.map(perDoc, doc_query_list)
pool.close()
我得到了这样的错误:
cPickle.PicklingError: Can't pickle <class '__main__.doc_'>: attribute lookup __main__.doc_ failed
这是我的参数 d 是带有文档的元组的问题吗?
心理调试,因为您提供了更多信息(但仍然不是 MCVE(:
您使用以下命令创建了doc_tuple
的类:
doc_tuple = collections.namedtuple('doc_', ... attributes here ...)
传递的字符串名称 ('doc_'
( 和分配给它的名称 (doc_tuple
( 之间的不匹配会导致此问题;这两个名称必须匹配才能使namedtuple
实例可挑剔。将其更改为:
# Binding matches name passed to namedtuple constructor now
doc_tuple = collections.namedtuple('doc_tuple', ... attributes here ...)
并确保它是在模块的顶层(而不是在另一个类或函数中(定义的,并且它应该可以工作。
如果脚本中有import ipdb
,请将其删除。