在java中使用stanford lexicalizedparser时的性能问题

时间:2013-01-30 06:52:06

标签: java nlp stanford-nlp

我是Stanford NLP的新手。我使用词法化解析器来解析文件的内容并提取名词短语。解析该行时,生成树结构需要更多时间。

我正在使用Tregex模式从一行中获取名词短语。

我正在使用1 MB文件进行解析,因此解析和提取名词短语需要两个多小时。

这是我正在使用的完整代码。

        Tree x = parser.apply(line);
        System.out.println("tree s=="+x);
        TregexPattern NPpattern = TregexPattern.compile("@NP <@/NN.?/");
        TregexMatcher matcher = NPpattern.matcher(x);

        while (matcher.findNextMatchingNode()) {
            Tree match = matcher.getMatch();
            List<TaggedWord> tWord = match.taggedYield();
            Iterator<TaggedWord> it = tWord.iterator();
            String str="";
            while(it.hasNext()){
                TaggedWord word = it.next();
                String taggedWord = word.tag();
                if(taggedWord.equals("NN")||taggedWord.equals("NNS")||taggedWord.equals("NNP")){
                    str = str+word.value()+" ";
                }
            }
       }

那么请帮助我如何提高性能,还是有另一种优化此代码的方法。

提前致谢 Gouse。

1 个答案:

答案 0 :(得分:1)

完全选区解析文本只是有点慢......如果你坚持下去,你可能做的事情可能不多。

但有几点需要提及:(i)如果你没有使用englishPCFG.ser.gz语法,那么你应该,因为它比使用englishFactored.seer.gz更快,(ii)解析很长的句子特别慢,所以如果你可以通过省略或打破很长的句子(例如,超过70个单词),这可以帮助很多。特别是,如果某些文本来自网页抓取或其他任何内容并且有很长的不是真正句子的内容,过滤或分割它们可能会有很大帮助。

你可以去的另一个方向是你似乎并不需要一个完整的解析器,而只需要一个NP chunker(识别文本中最小的名词短语的东西)。这些可以更快,因为它们不构建递归结构。目前斯坦福NLP工具中没有一个,但您可以通过在网络上搜索这个术语来找到一些。