斯坦福分析师的问题

时间:2011-01-22 16:31:11

标签: java nlp stanford-nlp

我正在编写一个与NLP(自然语言解析器)一起工作的项目。我正在使用stanford解析器。

我创建了一个线程池,它接受句子并用它们运行解析器。 当我创建一个线程时,它的工作正常,但是当我创建更多时,我会遇到错误。 “测试”程序是找到有一些联系的单词。 如果我做了一个同步它应该像一个线程一样工作,但我仍然得到错误。 我的问题是我的代码有错误:

public synchronized String test(String s,LexicalizedParser lp )
{

    if (s.isEmpty()) return "";
    if (s.length()>80) return "";
    System.out.println(s);
    String[] sent = s.split(" ");
 Tree parse = (Tree) lp.apply(Arrays.asList(sent));
TreebankLanguagePack tlp = new PennTreebankLanguagePack();
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
GrammaticalStructure gs = gsf.newGrammaticalStructure(parse);
Collection tdl = gs.typedDependenciesCollapsed();
List list = new ArrayList(tdl);


//for (int i=0;i<list.size();i++)
//System.out.println(list.get(1).toString());

//remove scops and numbers like sbj(screen-4,good-6)->screen good

 Pattern p = Pattern.compile(".*\\((.*?)\\-\\d+,(.*?)\\-\\d+\\).*");

       if (list.size()>2){
    // Split input with the pattern
        Matcher m = p.matcher(list.get(1).toString());
        //check if the result have more than  1 groups
       if (m.find()&& m.groupCount()>1){
           if (m.groupCount()>1)
           {
               System.out.println(list);
 return  m.group(1)+m.group(2);
    }}
}
        return "";

}

我遇到的错误是:

  

at blogsOpinions.ParserText。(ParserText.java:47)     在blogsOpinions.ThreadPoolTest $ 1.run(ThreadPoolTest.java:50)     在blogsOpinions.ThreadPool $ PooledThread.run(ThreadPoolTest.java:196)   使用堕落恢复   策略:将构建一个(X ...)   树。线程中的异常   “PooledThread-21”   java.lang.ClassCastException:   java.lang.String无法强制转换为   edu.stanford.nlp.ling.HasWord

     

在   edu.stanford.nlp.parser.lexparser.LexicalizedParser.apply(LexicalizedParser.java:289)       在blogsOpinions.ParserText.test(ParserText.java:174)       在blogsOpinions.ParserText.insertDb(ParserText.java:76)       在blogsOpinions.ParserText。(ParserText.java:47)       在blogsOpinions.ThreadPoolTest $ 1.run(ThreadPoolTest.java:50)       在blogsOpinions.ThreadPool $ PooledThread.run(ThreadPoolTest.java:196)

如何获得主题的描述,就像屏幕非常好,我希望从列表中得到的屏幕很好,而不是list.get(1)

2 个答案:

答案 0 :(得分:4)

您无法在LexicalizedParser.parse List上致电String;它需要一个HasWord个对象的列表。在输入字符串上调用apply方法要容易得多。这也将在您的输入上运行适当的标记器(而不是空格上的简单split)。

要从返回的Tree中获取诸如主题之类的关系,请致电其dependencies成员。

答案 1 :(得分:1)

嗯,我亲眼目睹了相同的堆栈痕迹。原来我在同一个JVM中加载了两个LexicalizedParser实例。这似乎是个问题。当我确定只创建了一个实例时,我能够很好地调用lp.apply(Arrays.asList(sent))