斯坦福纳和芹菜 - 如何提高性能?

时间:2016-01-08 13:55:19

标签: python python-2.7 celery nltk stanford-nlp

我有一个用Python 2.7编写的软件,它大量使用Celery。我现在使用StanfordNER添加了NER支持,我想知道如何在标记多个文档时提高性能;每个标记任务都在新工作者上运行。

我像这样实施了斯坦福大学:

from nltk.tag import StanfordNERTagger
class NETagger(object):
    def __init__(self, path):
        model = '/opt/Projects/nlp/stanford-ner-2015-04-20/classifiers/german/german.hgc_175m_600.crf.ser.gz'
        jar = '/opt/Projects/nlp/stanford-ner-2015-04-20/stanford-ner.jar'
        self.tagger = StanfordNERTagger(model, jar, encoding='utf-8', java_options='-mx8000m')

    def assign_tags(self, file):
        with open(file, 'r') as f:
            tokens = f.readlines()
            ne_result = self.tagger.tag(tokens)

        [... write ne_result to file ...]

这就是Celery所发生的事情。我有一个任务,为每个将通过NER的文件排队一个子任务:

nertask = ExperimentalDataminingNER()
tagger = NETagger('path/to/files')

for file in 'path/to/files':
    [... create the task context ...]
    nertask.apply_async((context,), queue='default', task_id=id)

子任务只做这个(我剥离的行对NER没有影响):

class ExperimentalDataminingNER():
    [...]
    tagger.assign_tags(input_file_file)

基本上,我拥有的每个文档都标记在一个工作者身上。我把他们排队,工人们做他们的工作并且做得很好。

我的问题:如果我不使用Celery,并且只使用开箱即用的StanfordNER,在我的机器上处理一个文件需要4-7秒。当同时运行其中四个NER任务时(我有四个工作人员),每个任务需要12到18秒。虽然我总体上使用Celery仍然更快,但我想知道我是否可能在某处引入某种人为瓶颈?或者它是如此资源密集,以至于没有办法解决它?

顺便说一句,我正在使用ntlk

修改

我尝试在Celery之外运行四个并行的StanfordNER实例,结果是一样的,我注意到每个文件所需的时间急剧增加。

我也注意到我的测量结果是标准实现,实际上是4-7秒(现在编辑),这对Celery实现来说有点不好。

0 个答案:

没有答案