В ответ на вопрос, который я разместил здесь , я хотел бы спросить, можно ли исключить некоторые теги на уровне фразы при разборе. В частности, я использую анализатор сдвига-уменьшения 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;
}
}
Как всегда, спасибо!