Стэнфорд Парсер вопросы - PullRequest
0 голосов
/ 22 января 2011

Я пишу проект, который работает с НЛП (парсер естественного языка).Я использую анализатор Стэнфорда.

Я создаю пул потоков, который принимает предложения и запускает анализатор вместе с ними.Когда я создаю один поток, все работает нормально, но когда я создаю больше, я получаю ошибки.Процедура «test» находит слова, которые имеют некоторые связи.Если я делаю синхронизированный, он должен работать как один поток, но все равно я получаю ошибки.Моя проблема в том, что у меня есть ошибки в этом коде:

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".apply (LexicalizedParser.java:289) на блогахThreadPoolTest $ 1.run (ThreadPoolTest.java:50) в блогаххорошо, и я хочу получить экран хорошо из списка, который я получаю, а не как list.get(1).

Ответы [ 2 ]

4 голосов
/ 22 января 2011

Вы не можете позвонить LexicalizedParser.parse на List из String с;он ожидает список HasWord объектов.Гораздо проще вызвать метод apply для входной строки.Это также запустит соответствующий токенизатор на вашем входе (вместо вашего простого split на пробелах).

Чтобы получить отношения, такие как субъектность, из возвращенного Tree, вызовите его dependencies участник.

1 голос
/ 05 апреля 2011

Хм, я был свидетелем того же следа стека.Оказалось, что я загружал два экземпляра LexicalizedParser в одну и ту же JVM.Это казалось проблемой.Когда я убедился, что создан только один экземпляр, я смог нормально вызвать lp.apply(Arrays.asList(sent)).

...