Поиск именных фраз с помощью синтаксического анализатора stanford

#java #parsing #stanford-nlp

#java #синтаксический анализ #stanford-nlp

Вопрос:

Я хочу найти несколько именных фраз в данном предложении, используя синтаксический анализатор stanford. Я использую Java.

Пример предложения:

Качество изображения действительно хорошее.

Теперь мне нужно извлечь «Качество изображения».

Есть ли какой-либо способ обойти дерево зависимостей для достижения желаемого результата?
Кроме того, может ли синтаксический анализатор stanford помечать предложения в формате XML?

Ответ №1:

Если вы хотите найти все именные фразы, то это, вероятно, проще всего сделать, работая с деревом синтаксического анализа структуры фраз, а не с представлением зависимостей. Вы можете либо вручную выполнить итерацию по узлам древовидного объекта и посмотреть, является ли label().value() «NP», либо вы можете использовать TregexPattern «@NP», а затем выполнить итерацию по NPS с помощью TregexMatcher.

Вы можете получить выходные данные в формате XML из синтаксического анализатора, используя флаг командной строки

 -outputFormatOptions xml
  

или в коде путем создания объекта TreePrint со строкой параметров «xml».

Ответ №2:

Просто чтобы расширить ответ @christopher-manning, вот некоторый код, который вы можете использовать:

 private List<String> getNounPhrases(Tree parse) {
    List<String> result = new ArrayList<>();
    TregexPattern pattern = TregexPattern.compile("@NP");
    TregexMatcher matcher = pattern.matcher(parse);
    while (matcher.find()) {
        Tree match = matcher.getMatch();
        List<Tree> leaves = match.getLeaves();
        System.out.println(leaves);
        // Some Guava magic.
        String nounPhrase = Joiner.on(' ').join(Lists.transform(leaves, Functions.toStringFunction()));
        result.add(nounPhrase);
        List<LabeledWord> labeledYield = match.labeledYield();
        System.out.println("labeledYield: "   labeledYield);
    }
    return resu<
}