我已将 DKPro Core 设置为 Web 服务,以获取输入并提供标记化的输出。服务本身设置为 Jersey 资源:
@Path("/")
public class MyResource
{
public MyResource()
{
// Nothing here
}
@GET
public String generate(@QueryParam("q") final String input)
{
try
{
final JCasIterable en = iteratePipeline(
createReaderDescription(StringReader.class, StringReader.PARAM_DOCUMENT_TEXT, input, StringReader.PARAM_LANGUAGE, "en")
,createEngineDescription(StanfordSegmenter.class)
,createEngineDescription(StanfordPosTagger.class)
,createEngineDescription(StanfordParser.class)
,createEngineDescription(StanfordNamedEntityRecognizer.class)
);
final StringBuilder sb = new StringBuilder();
for (final JCas jCas : en)
{
for (final Token token : select(jCas, Token.class))
{
sb.append('[');
sb.append(token.getCoveredText());
sb.append(' ');
sb.append(token.getPos().getPosValue());
sb.append(']');
}
}
return sb.toString();
}
catch (final Exception e)
{
throw new RuntimeException("Problem", e);
}
}
}
一切正常,但速度很慢,每次输入需要 7-10 秒。我认为这是因为正在为每个请求重新创建管道。
如何重新编写此代码以将管道创建移至构造函数并减少单个请求的负载?请注意,可能有多个同时请求,因此任何不是线程安全的都需要在请求中。