如何使用stanford解析器与线程

时间:2011-02-11 16:19:59

标签: stanford-nlp

你好我想使用stanford解析器wuth线程,但我不知道如何使用线程池。我希望所有线程都能这样做:

LexicalizedParser.apply(Object in)

但我不想一直创建LexicalizedParser的新对象,因为它会加载 lp = new LexicalizedParser(“englishPCFG.ser.gz”); 每个物体需要2秒钟。 我该怎么办?

谢谢!

2 个答案:

答案 0 :(得分:2)

猜猜为时已晚,但有一个线程安全的版本:http://nlp.stanford.edu/software/lex-parser.shtml

答案 1 :(得分:1)

您可以使用ThreadLocal。 它允许您为每个线程保留一个解析器实例。因此,任何创建的解析器实例都不会从多个线程中使用。

通常它不应该创建比CPU *核心更多的实例。

对我来说这是4-5个实例(如果我在我的四核上禁用超线程)。


P.S。 与StanfordNLP无关。有时,较差的类实现包含静态字段并以非线程安全的方式修改它们。这种实现的一般安全并行化方法是:

  1. 将计算部分移动到单独的进程;
  2. 启动(CPUs *核心)计算进程数。
  3. 使用IPC技术在主要/后台进程之间进行通信。