Стэнфордский парсер — количество тегов

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

Так что я могу выйти, например (взято из другого запроса при переполнении стека):

(ROOT (S (NP (PRP$ My) (NN dog)) (ADVP (RB also)) (VP (VBZ likes) (NP (JJ eating) (NN sausage))) (. .)))

Но что мне действительно нужно, так это количество тегов, выводимых в файле CSV:

PRP - 1
JJ - 1

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


person JRUK    schedule 27.01.2014    source источник


Ответы (2)


Да, это легко возможно.

Тебе понадобится:

import java.util.HashMap;
import edu.stanford.nlp.trees.Tree;

Я предполагаю, что из другого вопроса у вас уже есть существующий объект Tree. Я подозреваю, что вам нужен только список с выходными узлами (PRP, NN, RB... в вашем примере), но вы можете сделать это для каждого узла в целом.

Затем переберите все узлы и подсчитайте только листья:

Tree tree = ...
for (int i = 1; i < tree.size(); i++) {
  Tree node = tree.getNodeNumber(i);

  if (node.isLeaf()) {
    // count here
  }
}

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

редактировать: извините, исправил ошибку отрицания в коде.

person Christopher Schröder    schedule 28.01.2014

Предыдущий ответ, будучи правильным, перебирает все узлы в дереве синтаксического анализа. Хотя не существует легкодоступного метода, который возвращает количество тегов POS, вы можете напрямую получать конечные узлы, используя методы класса edu.stanford.nlp.trees.Trees следующим образом:

(Я использую Function из Guava для большей элегантности в коде, но простой цикл for тоже подойдет.)

Tree tree = sentence.get(TreeAnnotation.class); // parse tree of the sentence
List<CoreLabel> labels = Trees.taggedLeafLabels(tree); // returns the labels of the leaves in a Tree, augmented with POS tags.
List<String> tags = Lists.transform(labels, getPOSTag);
for (String tag : tags)
    Collections.frequency(tags, tag);

куда

Function<CoreLabel, String> getPOSTag = new Function<CoreLabel, String>() {
    public String apply(CoreLabel core_label) { return core_label.get(PartOfSpeechAnnotation.class); }
};
person Chthonic Project    schedule 29.01.2014
comment
Шикарный ответ, да! - person Christopher Schröder; 30.01.2014
comment
Спасибо за помощь вам обоим. Извините, если это очевидно, но тогда это будет означать создание модуля Java? В настоящее время я только что запускал его в командной строке терминала (например, java -mx200m edu.stanford.nlp.parser.lexparser.LexicalizedParser -retainTMPSubcategories -outputFormat wordsAndTags,penn,typedDependencies englishPCFG.ser.gz mumbai.txt) - person JRUK; 11.02.2014
comment
Да, вам нужен собственный код. Несмотря на то, что авторы Stanford NLP предоставили большую гибкость для использования CLI, для всего, кроме прямого вывода результатов синтаксического анализа, вам обычно потребуется использовать их API (который, кстати, очень хорошо документирован). . - person Chthonic Project; 11.02.2014