【问题标题】:Stanford POS tagger doesn't work in servlet斯坦福 POS 标记器在 servlet 中不起作用
【发布时间】:2015-05-17 09:15:59
【问题描述】:

我正在尝试在 Java servlet 中使用 Stanford POS Tagger。我按照本教程在 J2EE 中创建了动态网页项目,并包含了 jar 文件的构建路径。 http://www.galalaly.me/index.php/2011/05/tagging-text-with-stanford-pos-tagger-in-java-applications/

如果我创建一个单独的 java 文件,我可以让 POS Tagger 工作,如下所示。

public static String tagger(String sample) throws IOException, ClassNotFoundException {

 // Initialize the tagger
 MaxentTagger tagger = new MaxentTagger("models/english-left3words-distsim.tagger");

 // The tagged string
 String tagged = tagger.tagString(sample);

 // Output the result
 return tagged;
 }

public static void main(String[] args){
    try {
        System.out.println(tagger("This is a sample."));
    } catch (ClassNotFoundException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这意味着 POS 标记器在我命名为 Taggers.java 的简单 Java 类的主要方法中工作。但是当我尝试在 servlet 中实例化 Tagger.java 类的对象时,我无法让它工作。下面的代码是一个 servlet,我试图在其中实例化 Tagger.java 的对象。

/**
 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
 */
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
    PrintWriter out = response.getWriter(); 
    try {
        out.println(Tagger.tagger("This is a sample sentence."));
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

当我在 tomcat-8 上运行上述 servlet 时,它显示以下异常。

严重:servlet [com.exp.pkg.ExpServlet] 在路径 [/webProj1] 的上下文中的 Servlet.service() 引发异常 [Servlet 执行引发异常],根本原因 java.lang.ClassNotFoundException:edu.stanford.nlp.tagger.maxent.MaxentTagger 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) 在 com.exp.pkg.Tagger.tagger(Tagger.java:17) 在 com.exp.pkg.ExpServlet.service(ExpServlet.java:34) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)

在我设置 classpath=".;..;C:\Users\Faisal\workspace_EE\webProj1\tagger\english-left3words-distim.ta‌​gger;C:\stanford-postagger-2015-01-29\ stanford-postagger-2015-01-30\stanford-post‌​agger;C:\apache-tomcat-8\apache-tomcat-8.0.20\lib\servlet-api"

堆栈跟踪如下:

严重:servlet [com.exp.pkg.ExpServlet] 在路径 [/webProj1] 的上下文中的 Servlet.service() 抛出异常 edu.stanford.nlp.io.RuntimeIOException:在 edu 加载标记器模型时出现不可恢复的错误.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:769) 在 edu.stanford.nlp.tagger.maxent.MaxentTagger.(MaxentTagger.java:297) 在 edu.stanford.nlp.tagger.maxent。 MaxentTagger.(MaxentTagger.java:262) 在 com.exp.pkg.Tagger.tagger(Tagger.java:17) 在 com.exp.pkg.ExpServlet.service(ExpServlet.java:34) 在 javax.servlet.http。 HttpServlet.service(HttpServlet.java:725) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org .apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.Applica org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 上的tionFilterChain.doFilter(ApplicationFilterChain.java:206) .apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:79) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 在 org.apache.catalina。 connector.CoyoteAdapter.service(CoyoteAdapter.java:516) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)在 org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandl er.process(Http11NioProtocol.java:223) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run( NioEndpoint.java:1515) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable .run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: Unable to resolve "tagger/english-bidirectional-distsim.tagger" as either class path, filename或 edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:463) 上的 URL edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:764) ... 27 更多

【问题讨论】:

  • CoreNLP 类似乎不在您的类路径中。是这样吗?
  • classpath 在 stanford 的网站 nlp.stanford.edu/software/pos-tagger-faq.shtml#api 上进行了解释。按照此链接上的信息,我更新了我的类路径环境。变量看起来像 ".;..;C:\Users\Faisal\workspace_EE\webProj1\tagger\english-left3words-distim.tagger;C:\stanford-postagger-2015-01-29\stanford-postagger-2015- 01-30\stanford-postagger;C:\apache-tomcat-8\apache-tomcat-8.0.20\lib\servlet-api”。这次的错误有点不同,例如“edu.stanford.nlp.io.RuntimeIOException: Unrecoverable error while loading a tagger model”
  • 请在您的问题中发布完整的堆栈跟踪。
  • 我刚刚在设置类路径后发布了整个堆栈跟踪。

标签: servlets stanford-nlp tomcat8 pos-tagger


【解决方案1】:

你需要确保你的类路径是正确的。

从您更新的帖子看来,您的型号不合适 类路径上的路径。您不应该将 .tagger 文件直接添加到 你的类路径;添加包含标记器文件夹的目录。如果 您的文件设置如下所示:

C:\mystuff 标记器\ 英语-left3words-dissim.tagger english-bidirectional-distim.tagger 那么你应该把 类路径上的目录 C:\mystuff。

根据我之前发布的link 处的说明,我在项目的根文件夹中创建了名为tagger 的文件夹,例如(C:\Users\Faisal\workspace_EE\webProj1\tagger),我将模型放在了“ english-left3words-distim.tagger" 以及它的 .props 文件,如教程链接中所述。 现在,正如您建议只将文件夹添加到类路径中那样,我的类路径变为“C:\Users\Faisal\workspace_EE\webProj1\;C:\stanford-postagger-2015-01-29\stanford-postagger-2015-01- 30\stanford-postagger;C:\apache-tomcat-8\apache-tomcat-8.0.20\lib\servlet-api"

这一次,我得到了以下堆栈跟踪:

SEVERE: Servlet.service() for servlet [com.exp.pkg.ExpServlet] in context with path [/webProj1] threw exception
edu.stanford.nlp.io.RuntimeIOException: Unrecoverable error while loading a tagger model
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:769)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:297)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.<init>(MaxentTagger.java:262)
    at com.exp.pkg.Tagger.tagger(Tagger.java:17)
    at com.exp.pkg.ExpServlet.service(ExpServlet.java:34)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Unable to resolve "tagger/english-bidirectional-distsim.tagger" as either class path, filename or URL
    at edu.stanford.nlp.io.IOUtils.getInputStreamFromURLOrClasspathOrFileSystem(IOUtils.java:463)
    at edu.stanford.nlp.tagger.maxent.MaxentTagger.readModelAndInit(MaxentTagger.java:764)
    ... 27 more

【讨论】:

    【解决方案2】:

    您需要确保您的类路径正确。

    从您更新的帖子来看,您的类路径中似乎没有正确的模型路径。您不应该将.tagger 文件直接添加到您的类路径中;添加包含tagger 文件夹的目录。如果您的文件设置如下所示:

    C:\mystuff
        tagger\
            english-left3words-distsim.tagger
            english-bidirectional-distsim.tagger
    

    那么您应该将目录C:\mystuff 放在您的类路径中。

    【讨论】:

    • 更新类路径后,我刚刚在下面发布了我的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多