Подтвердить что ты не робот

Как извлечь существительные фразы, используя Open nlp chunking parser

Я новичок в обработке естественного языка. Мне нужно извлечь существительные фразы из текста. Далеко я использовал открытый nlp chunking parser для разбора моего текста, чтобы получить структуру Tree. Но я не могу извлечь существительное фразы из древовидной структуры, есть ли какой-либо шаблон регулярного выражения в открытом nlp, чтобы я мог использовать его для извлечения существительных фраз.

Ниже приведен код, который я использую

    InputStream is = new FileInputStream("en-parser-chunking.bin");
    ParserModel model = new ParserModel(is);
    Parser parser = ParserFactory.create(model);
    Parse topParses[] = ParserTool.parseLine(line, parser, 1);
        for (Parse p : topParses){
                 p.show();}

Здесь я получаю вывод как

(TOP (S (S (ADJP (JJ welcome) (PP (TO to) (NP (NNP Big) (данные NNP.))))) (S (NP (PRP We)) (VP (VP (VP) VBP) (VP (работа VBG) (PP (IN on) (NP (NNP Natural) (NNP Language) (NNP Processing.can))))) (NP (DT some) (CD один) (помощь NN)) (NP (PR)) (PP (IN in) (S (VP (экстракция VBG)) (NP (DT) (NN-существительное) (фразы NNS)) (PP (IN from) (NP (DT the) (NN дерево) (WP stucture.))))))))))

Может кто-нибудь, пожалуйста, помогите мне в получении существительных фраз, таких как NP, NNP, NN и т.д. Может кто-нибудь скажет мне, что мне нужно использовать любой другой NP Chunker для получения именных фраз? Есть ли какой-либо шаблон регулярного выражения для достижения то же самое.

Пожалуйста, помогите мне в этом.

Заранее спасибо

Gouse.

4b9b3361

Ответ 1

Объект Parse - это дерево; вы можете использовать getParent() и getChildren() и getType() для перемещения по дереву.

List<Parse> nounPhrases;

public void getNounPhrases(Parse p) {
    if (p.getType().equals("NP")) {
         nounPhrases.add(p);
    }
    for (Parse child : p.getChildren()) {
         getNounPhrases(child);
    }
}

Ответ 2

если вам нужны только фразы-существительные, тогда используйте курант предложения, а не парсер. код выглядит примерно так (вам нужно получить модель из того же места, где у вас есть модель парсера)

public void chunk() {
    InputStream modelIn = null;
    ChunkerModel model = null;

    try {
      modelIn = new FileInputStream("en-chunker.bin");
      model = new ChunkerModel(modelIn);
    }
    catch (IOException e) {
      // Model loading failed, handle the error
      e.printStackTrace();
    }
    finally {
      if (modelIn != null) {
        try {
          modelIn.close();
        }
        catch (IOException e) {
        }
      }
    }

//After the model is loaded a Chunker can be instantiated.


    ChunkerME chunker = new ChunkerME(model);



    String sent[] = new String[]{"Rockwell", "International", "Corp.", "'s",
      "Tulsa", "unit", "said", "it", "signed", "a", "tentative", "agreement",
      "extending", "its", "contract", "with", "Boeing", "Co.", "to",
      "provide", "structural", "parts", "for", "Boeing", "'s", "747",
      "jetliners", "."};

    String pos[] = new String[]{"NNP", "NNP", "NNP", "POS", "NNP", "NN",
      "VBD", "PRP", "VBD", "DT", "JJ", "NN", "VBG", "PRP$", "NN", "IN",
      "NNP", "NNP", "TO", "VB", "JJ", "NNS", "IN", "NNP", "POS", "CD", "NNS",
      "."};

    String tag[] = chunker.chunk(sent, pos);
  }

затем посмотрите на массив тегов для типов, которые вы хотите

http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html#tools.parser.chunking.api

Ответ 3

Будет продолжаться от вашего кода. Этот программный блок предоставит все существительные-фразы в предложении. Используйте метод getTagNodes() для получения токенов и их типов

Parse topParses[] = ParserTool.parseLine(line, parser, 1);
Parse words[]=null; //an array to store the tokens
//Loop thorugh to get the tag nodes
for (Parse nodes : topParses){
        words=nodes.getTagNodes(); // we will get a list of nodes
}

for(Parse word:words){
//Change the types according to your desired types
    if(word.getType().equals("NN") || word.getType().equals("NNP") || word.getType().equals("NNS")){
            System.out.println(word);
            }
        }