我该怎么做才能加快斯坦福CoreNLP(dcoref / ner)的速度?

时间:2015-07-22 12:16:38

标签: python nlp stanford-nlp

我使用斯坦福的CoreNLP库和Stanford CoreNLP Python Wrapper一起处理大量文档。我使用以下注释器:

tokenize, ssplit, pos, lemma, ner, entitymentions, parse, dcoref

以及shift-reduce解析器模型englishSR.ser.gz。我主要使用CoreNLP进行共同参考分辨率/命名实体识别,并且据我所知,我为此目的使用了最小的注释器集。

我可以采取哪些方法来加快文档注释?

其他SO答案都建议不要为每个文档加载模型,但我已经这样做了(因为包装器启动服务器一次,然后来回传递文档/结果)。

我正在处理的文件平均长度为20个句子,有些句子长达400个句子,有些句子短至1.每个句子的平均解析时间为1秒。我可以在一台机器上运行一个单线程进程,每天解析~2500个文档,但我想加倍(如果不是更多)。

2 个答案:

答案 0 :(得分:1)

尝试设置Stanford CoreNLP服务器,而不是在每次运行时加载注释器。这样,您可以加载一次注释器并更快地处理文档。第一个过程会更慢,但其余的要快得多。查看Stanford CoreNLP server的更多详细信息。

话虽如此,通常需要在准确性和速度之间进行权衡。因此,您可能希望使用NLTK和spacy等其他工具进行尽职调查,以了解哪种工具最适合您。

答案 1 :(得分:1)

需要注意的一点是,句子的长度对核心NLP库的某些部分的解析时间有很大的影响。我建议不要试图解析超过100令牌的句子。

解决此问题的一种方法是使用两个不同的管道:标记器/句子拆分器和完整管道。句子分割器管道可以确定句子的长度,然后你可以决定是否要以某种方式减轻其长度(例如,通过忽略句子,或将其分成多个句子)。第二个管道仅适用于小于您允许的最大长度的文档/句子。

虽然这种方法并没有加快平均情况,但它可以大大改善最坏情况的性能。权衡的是,合法的句子比你预期的要长。