【发布时间】:2019-06-04 14:15:42
【问题描述】:
我正在对我拥有的数据集运行拼写校正功能。我使用from pathos.multiprocessing import ProcessingPool as Pool 来完成这项工作。处理完成后,我想实际访问结果。这是我的代码:
import codecs
import nltk
from textblob import TextBlob
from nltk.tokenize import sent_tokenize
from pathos.multiprocessing import ProcessingPool as Pool
class SpellCorrect():
def load_data(self, path_1):
with codecs.open(path_1, "r", "utf-8") as file:
data = file.read()
return sent_tokenize(data)
def correct_spelling(self, data):
data = TextBlob(data)
return str(data.correct())
def run_clean(self, path_1):
pool = Pool()
data = self.load_data(path_1)
return pool.amap(self.correct_spelling, data)
if __name__ == "__main__":
path_1 = "../Data/training_data/training_corpus.txt"
SpellCorrect = SpellCorrect()
result = SpellCorrect.run_clean(path_1)
print(result)
result = " ".join(temp for temp in result)
with codecs.open("../Data/training_data/training_data_spell_corrected.txt", "a", "utf-8") as file:
file.write(result)
如果您查看主块,当我执行print(result) 时,我会得到一个类型为<multiprocess.pool.MapResult object at 0x1a25519f28> 的对象。
我尝试使用result = " ".join(temp for temp in result) 访问结果,但随后出现以下错误TypeError: 'MapResult' object is not iterable。我尝试将其类型转换为列表list(result),但仍然是同样的错误。我该怎么做才能解决这个问题?
【问题讨论】:
-
看起来你需要做
result = SpellCorrect.run_clean(path_1).get()(注意.get())。我猜a的意思是“异步”,所以你可能需要先确保结果已经准备好。请参阅docs。 -
感谢您的快速回复@Carcigenicate,我的意思是使用地图而不是地图(我的错)。无论如何,我按照建议使用了 .get(),现在出现以下错误:_pickle.PicklingError: Can't pickle
main.SpellCorrect'>: it's not the same object作为 main.SpellCorrect -
尝试将
SpellCorrect = SpellCorrect()更改为spellcorrect = SpellCorrect()。换句话说,消除类 (SpellCorrect) 与实例 (spellcorrect) 的歧义。然后您需要将result = SpellCorrect.run_clean(path_1)更改为result = spellcorrect.run_clean(path_1),因为它是调用方法的实例,而不是类。 -
我是
pathos作者。正如@Carcigenicate 所说,使用map(或imap),而不是amap。如果您想要非阻塞不可迭代,请仅使用amap。此外,这是来自@unutbu 的好建议,但我有一个缺点......pathos可以存储对类的引用,因为它使用dill进行序列化,而不是pickle,因此可以存储实际的类对象。 -
@MikeMcKerns:感谢您的更正。
标签: python python-3.x multiprocessing python-multiprocessing pathos