2012-04-24 67 views
1

我正在编写一个应用程序,该程序在许多其他库中使用了Stanford CoreNLP库。应用程序接受一个URL,从中提取文本,然后使用CoreNLP处理文本。问题在于,CoreNLP库在注释文本之前需要大量时间将其模型加载到内存中。我正在寻找最好的方法来执行初始化步骤只有一次,并在下一次我想要使用应用程序,我输入一个URL它不会再次加载模型。初始化Java程序并侦听查询

+0

得到一个有用的答案,你应该解释一下你如何启动应用程序 - 没有使用的API自己,这很难说,但可以保留一个JVM在内存初始化运行库,并重新 - 每次以某种方式使用相同的JVM – ianpojman 2012-04-24 20:53:25

+0

我要求最好的方式来做到这一点,我需要的是应用程序将采取一个URL并尽快处理它,并等待其他网址(结果将存储在一个数据库)。 – madmed 2012-04-24 22:33:36

回答

1

也许你应该尝试在容器内运行你的应用程序 - Servlet Container甚至Web ContainerApache Tomcat?您可以将应用程序打包为simple WAR,然后容器将初始化所有的java类,并假设您公开一个可触发单个URL的NLP处理的servlet,您将节省所有后续NLP处理调用的初始化时间。

编辑:

您不必使用Servlet的。 或者,您可以执行下列操作之一:在您

  1. 运行WAR一个循环,会读一些配置源URL(数据库或文件),并为每个URL会做NLP和解析(存储结果用于后续分析?)
  2. 更高级的解决方案可能包括与Quartz联合的现有Java程序,它将每X秒/分钟/小时运行一个NLP +解析器等。更高级的版本将使用带有Spring Batch的Quartz。

祝你好运!在该示例

+0

好吧,我有同样的想法,但有没有办法做同样的事情没有servlet? – madmed 2012-04-24 21:24:42

+0

@madmed,请看到我的编辑 – aviad 2012-04-24 21:34:15

+0

感谢您的回答,你知道我是怎么安排的,而不是监视更改(即当我添加一个新的URL到程序运行使用添加的URL文件) – madmed 2012-04-24 22:29:28

0

展望从Stanford CoreNLP页,下面是用来注释文本:

Properties props = new Properties(); 
props.put("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref"); 
StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
String text = ... // Add your text here! 
Annotation document = new Annotation(text); 
pipeline.annotate(document); 

因此,您可以创建一个对象,并解析,当应用程序被初始化虚拟文本。您会忽略该操作的结果,因为其目的是在加载应用程序时加载所需的模块。在此之后,您可以保留“管道”对象并在需要时参考其他注释操作。