извлекать именные фразы с помощью opennlp в java

Я пытаюсь извлечь словосочетания из предложений. Я использую библиотеку opennlp "en-parser-chunking.bin".

пример кода:

 ArrayList<opennlp.tools.parser.Parse> nounPhrases = new ArrayList<>();

 searchmethod("what is the nickname of the British flag?");
 for(int t =0; t<50; t++)
 {
     str= text.get(t);
     InputStream is = new FileInputStream("en-parser-chunking.bin");
     ParserModel model = new ParserModel(is);
     opennlp.tools.parser.Parser parser = ParserFactory.create(model);
     opennlp.tools.parser.Parse[] topParses = ParserTool.parseLine(str, parser, 1);
     for (opennlp.tools.parser.Parse p : topParses){
          p.show();
          if (p.getType().equals("NP")) {
              nounPhrases.add(p);
          }
     }                                        
  }

С этим кодом я получаю следующий результат:

(TOP (S (NP (NP (DT The) (NN nickname)) (PP (IN for) (NP (DT the) (JJ British) (NN flag)))) (VP (VBZ is) (NP (NP (DT the) (NNP Union) (NNP Jack.)) (SBAR (IN Although) (S (NP (PRP it)) (VP (VBZ is) (ADVP (RB only) (RB correctly)) (VP (VBN known) (PP (IN as) (NP (DT this) (NN when) (NN flown))) (PP (IN on) (NP (DT a) (NN ship.)))))))))))  

Как я могу извлечь из этого результата словосочетания с существительными?

Любая помощь будет принята с благодарностью.


person user4462040    schedule 30.01.2015    source источник


Ответы (2)


Вы можете извлечь из него NP, но есть модель на http://opennlp.sourceforge.net/models-1.5/en-chunker.bin, который выполняет только фрагментацию (т. е. определение именной фразы) без грамматики. Это может быть проще в использовании (но для его запуска требуются этапы токенизации и POS-тегов).

person Daniel Naber    schedule 30.01.2015
comment
когда я это сделал, я получаю следующие результаты: B-NP I-NP B-PP B-NP I-NP I-NP B-VP B-NP I-NP I-NP B-SBAR B-NP B-VP I -ВП И-ВП И-ВП Б-ПП Б-НП И-НП Б-ВП Б-ПП Б-НП И-НП [0..2) НП [2..3) ПП [3..6) НП [6..7) ВП [7..10) НП [10..11) СБАР [11..12) НП [12..16) ВП [16..17) ПП [17..19) НП [ 19..20) ВП [20..21) ПП [21..23) НП, но я хочу получить правильное предложение. Как я его получу? - person user4462040; 30.01.2015
comment
См. stackoverflow.com/questions/15059878/ для значения тегов словосочетания существительного. - person Daniel Naber; 31.01.2015
comment
как я могу получить объект из этих фрагментированных данных ?? @ДаниэльНабер - person smoothsipai; 02.06.2016

Привет, я согласен с ответом, но если вы внимательно посмотрите на свой вывод, в указанном дереве есть проблема, которая вызовет неправильное определение чанка деревом.

В приведенном выше примере есть PP, идентифицированный как неправильный, так как flyn никогда не может быть NN. Во что я верю, так это в то, что правильный постинг — это ключ. Пожалуйста, дайте мне знать, если вам нужно знать, как можно исправить постагирование. Спасибо.

(PP 
    (IN as) 
        (NP 
            (DT this) (NN when) (NN flown)
        )
    )
)
person Abhishek Kumar    schedule 14.05.2019