Ограничение набора тегов на уровне фраз Stanford CoreNLP - PullRequest
0 голосов
/ 16 января 2019

В ответ на вопрос, который я разместил здесь , я хотел бы спросить, можно ли исключить некоторые теги на уровне фразы при разборе. В частности, я использую анализатор сдвига-уменьшения Stanford CorenNLP версии 3.9.2 (для его вывода в стиле избирательного округа) и теперь имею опыт добавления ParserConstraint ограничений к ParserQuery. Однако не сразу видно, можно ли использовать ParserConstraint для (эффективного) выполнения того, что я хочу.

Я могу позволить себе роскошь знать, что мой входной текст является однородно грамматическим, в полных предложениях с конечными матричными предложениями. Следовательно, всякий раз, когда выходные данные парсера содержат метку FRAG или UCP, синтаксический анализ почти наверняка будет неточным. Я хотел бы заранее сказать парсеру "не использовать FRAG или UCP" , пытаясь улучшить качество вывода путем ограничения набора решений.

Это возможно? Как, если так?

Отрывок:

import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;

import edu.stanford.nlp.io.*;
import edu.stanford.nlp.trees.*;
import edu.stanford.nlp.ling.HasWord;
import edu.stanford.nlp.ling.TaggedWord;
import edu.stanford.nlp.process.DocumentPreprocessor;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;
import edu.stanford.nlp.parser.shiftreduce.ShiftReduceParser;
import edu.stanford.nlp.parser.common.ParserQuery;
import edu.stanford.nlp.parser.common.ParserConstraint;

public class constraintTest {

    // Initialize POS tagger and parser.
    private static MaxentTagger meTagger = new MaxentTagger("edu/stanford/nlp/models/pos-tagger/english-left3words/english-left3words-distsim.tagger");
    private static ShiftReduceParser srParser = ShiftReduceParser.loadModel("edu/stanford/nlp/models/srparser/englishSR.ser.gz");

    public static void main(String[] args) throws IOException {

        String text = "";
        // If user passes in the name of an input file, use that.
        if (args.length > 0) {
            text = IOUtils.slurpFileNoExceptions(args[0]);
            System.out.println(text);

        // If user does not pass in a file, ask for some sentences.
        } else {
            System.out.println("Please enter a sentence for parsing:");
            Scanner input = new Scanner(System.in);
            text = input.nextLine();  
        }

        // Create output filename and file.
        String fileName = new SimpleDateFormat("'output/trees'yyyyMMdd'_'HHmmss'.txt'").format(new Date());
        PrintWriter writer = new PrintWriter(fileName, "UTF-8");

        // Prepare document for reading.
        DocumentPreprocessor tokenizedText = new DocumentPreprocessor(new StringReader(text));
        int i = 1;
        for (List<HasWord> sentence : tokenizedText) {
            List<TaggedWord> taggedSentence = meTagger.tagSentence(sentence);

            // To parse sentences WITHOUT parser constraints:
            // Tree tree = srParser.apply(taggedSentence);

            // To parse sentences WITH parser constraints:
            Tree tree = constrainedTree(taggedSentence);

            // Print to file.
            writer.println(tree);

            // Print to standard out while you're at it.
            System.out.println("/-/-/-/ Sentence #" + i + " /-/-/-/");
            tree.pennPrint();
            System.out.println();
            i += 1;

        }
        writer.close();
    }

    // Takes a list of TaggedWord objects and outputs a parse tree with
    // a constraint that the topmost label (below ROOT) be S.
    public static Tree constrainedTree(List<TaggedWord> taggedSentence) {
        int sentenceLength = taggedSentence.size();

        ParserConstraint constraint = new ParserConstraint(0, sentenceLength, "S");
        List<ParserConstraint> constraints = Collections.singletonList(constraint);
        ParserQuery pq = srParser.parserQuery();
        pq.setConstraints(constraints);
        pq.parse(taggedSentence);
        Tree tree = pq.getBestParse();

        return tree;

    }

}

Как всегда, спасибо!

...