0

我正在编写一个使用 NLP(自然语言解析器)的项目。我正在使用斯坦福解析器。

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

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 "";

}

我遇到的错误是:

在 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)

4

2 回答 2

4

你不能调用LexicalizedParser.parsea Listof Strings; 它需要一个HasWord对象列表。apply在输入字符串上调用该方法要容易得多。这还将在您的输入上运行适当的标记器(而不是简单split的空格)。

要从返回的对象中获取诸如主体性之类的关系Tree,请调用其dependencies成员。

于 2011-01-22T18:01:24.537 回答
1

嗯,我目睹了相同的堆栈跟踪。结果我在同一个 JVM 中加载了 LexicalizedParser 的两个实例。这似乎是问题所在。当我确定只创建了一个实例时,我就可以正常调用lp.apply(Arrays.asList(sent))了。

于 2011-04-05T02:15:53.587 回答