使用nltk.corpus多线程



我想在多线程环境中访问nltk.corpus.wordnet。一旦我启用了多线程,synsets()之类的方法就会失败。如果我禁用它,一切都会正常工作。

错误消息会更改。例如,一个错误可能看起来像这样,在我看来很像比赛条件:

File "/home/lhk/anaconda3/envs/dlab/lib/python3.6/site-packages/nltk/corpus/reader/wordnet.py", line 1342, in synset_from_pos_and_offset
assert synset._offset == offset

还有其他问题:

  • 这里的问题也是由多线程引起的:是什么导致WordNetCorpusReader没有属性LazyCorpusLoader?

  • 这个问题有一个更通用的标题,但似乎描述了同样的问题(多线程语料库加载失败(:Python NLTK多线程

  • 这方面存在一个问题:https://github.com/nltk/nltk/issues/1576

第一个链接问题的解决方案是在程序分支到各个线程之前加载语料库。我已经做到了:在多线程之前调用wordnet.ensure_loaded()

GitHub问题中的建议是在我的线程函数中导入wordnet。但这并不能改变任何事情。

解决方法是为每个线程制作语料库的深度副本。当然,这需要大量内存,而且效率不高:

import copy
from nltk.corpus import wordnet as wn
wn.ensure_loaded()
# at the beginning of the multi-threaded environment
my_wn = copy.deepcopy(wn)

最新更新