在主类外部调用Parser方法时出现异常

时间:2017-06-09 09:34:01

标签: java exception servlets model nlp

在我的应用程序中,我有一个方法,我无法在没有main方法的情况下执行。它只在main方法中运行。当我在servlet类中调用该方法时。它显示异常

  
      
  1. 我的主要方法课程
  2.   
    package com.books.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.HashSet;
import java.util.Set;

import opennlp.tools.cmdline.parser.ParserTool;
import opennlp.tools.parser.Parse;
import opennlp.tools.parser.Parser;
import opennlp.tools.parser.ParserFactory;
import opennlp.tools.parser.ParserModel;

public class ParserTest {

    // download

    public void download(String url, File destination) throws IOException, Exception {
        URL website = new URL(url);
        ReadableByteChannel rbc = Channels.newChannel(website.openStream());
        FileOutputStream fos = new FileOutputStream(destination);
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        fos.close();
        rbc.close();

    }

    public static Set<String> nounPhrases = new HashSet<>();

    private static String line = "The Moon is a barren, rocky world ";

    public void getNounPhrases(Parse p) {
        if (p.getType().equals("NN") || p.getType().equals("NNS") || p.getType().equals("NNP")
                || p.getType().equals("NNPS")) {
            nounPhrases.add(p.getCoveredText());
        }

        for (Parse child : p.getChildren()) {
            getNounPhrases(child);
        }
    }

    public void parserAction() throws Exception {
        // InputStream is = new FileInputStream("en-parser-chunking.bin");
        File modelFile = new File("en-parser-chunking.bin");

        if (!modelFile.exists()) {
            System.out.println("Downloading model.");
            download("https://drive.google.com/uc?export=download&id=0B4uQtYVPbChrY2ZIWmpRQ1FSVVk", modelFile);

        }
        ParserModel model = new ParserModel(modelFile);
        Parser parser = ParserFactory.create(model);
        Parse topParses[] = ParserTool.parseLine(line, parser, 1);
        for (Parse p : topParses) {
            // p.show();
            getNounPhrases(p);
        }
    }


    public static void main(String[] args) throws Exception {
        new ParserTest().parserAction();
        System.out.println("List of Noun Parse : " + nounPhrases);

    }
}

它给我低于输出

  

Noun Parse名单:[barren ,, world,Moon]

然后我评论了主要方法和。在我的servlet类中调用ParserAction()方法

if (name.equals("bkDescription")) {

                    bookDes = value;

                    try {

                        new ParserTest().parserAction(); 

                        System.out.println("Nouns Are"+ParserTest.nounPhrases);

                    } catch (Exception e) {

                    }

它给了我以下例外

EXception

我的浏览器中出现以下错误

Error in browser

为什么会这样?我可以用main方法运行它。但是当我删除main方法并在我的servlet中调用时。它给了一个例外。有没有办法解决这个问题?

注意 - 我在OpenNLP文档中已阅读以下说明,但我对此并不清楚。请帮我解决他的问题。

  

与实例化Parser工厂方法的其他组件不同   应该使用而不是通过new运算符创建Parser。   解析器模型要么针对分块解析器或树进行训练   插入解析器必须正确选择解析器实现。该   factory方法将从模型中读取一个类型参数并创建一个   相应解析器实现的实例。

1 个答案:

答案 0 :(得分:0)

创建ParserTest类的对象或删除此行中的新关键字new ParserTest().parserAction();