This is an automated email from the ASF dual-hosted git repository.
rzo1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opennlp.git
The following commit(s) were added to refs/heads/main by this push:
new 25112729 OPENNLP-509 opennlp.tools.parser.Parse.getParent() returning
incorrect object
25112729 is described below
commit 25112729e7a59d61411e8321b12d946166d6a70a
Author: Martin Wiesner <[email protected]>
AuthorDate: Sat Mar 4 21:58:37 2023 +0100
OPENNLP-509 opennlp.tools.parser.Parse.getParent() returning incorrect
object
- adds `setParents(..)` calls in `AbstractBottomUpParser#parse(Parse
tokens, int numParses)` which now set the hierarchical (back) references that
were missing before
- adds test to verify that a processed Parse instance's parent references
are populated and _not_ `null`
---
.../tools/parser/AbstractBottomUpParser.java | 17 +++++++-
.../tools/parser/AbstractParserModelTest.java | 51 ++++++++++++++++++++++
2 files changed, 67 insertions(+), 1 deletion(-)
diff --git
a/opennlp-tools/src/main/java/opennlp/tools/parser/AbstractBottomUpParser.java
b/opennlp-tools/src/main/java/opennlp/tools/parser/AbstractBottomUpParser.java
index cf0b4981..bf4a5d6e 100644
---
a/opennlp-tools/src/main/java/opennlp/tools/parser/AbstractBottomUpParser.java
+++
b/opennlp-tools/src/main/java/opennlp/tools/parser/AbstractBottomUpParser.java
@@ -338,15 +338,30 @@ public abstract class AbstractBottomUpParser implements
Parser {
odh = ndh;
}
if (completeParses.size() == 0) {
+ if (guess != null) {
+ setParents(guess);
+ for (Parse childGuess: guess.getChildren()) {
+ setParents(childGuess);
+ }
+ }
return new Parse[] {guess};
}
else if (numParses == 1) {
- return new Parse[] {completeParses.first()};
+ Parse best = completeParses.first();
+ setParents(best);
+ for (Parse childBest: best.getChildren()) {
+ setParents(childBest);
+ }
+ return new Parse[] {best};
}
else {
List<Parse> topParses = new ArrayList<>(numParses);
while (!completeParses.isEmpty() && topParses.size() < numParses) {
Parse tp = completeParses.first();
+ setParents(tp);
+ for (Parse childTp: tp.getChildren()) {
+ setParents(childTp);
+ }
completeParses.remove(tp);
topParses.add(tp);
//parses.remove(tp);
diff --git
a/opennlp-tools/src/test/java/opennlp/tools/parser/AbstractParserModelTest.java
b/opennlp-tools/src/test/java/opennlp/tools/parser/AbstractParserModelTest.java
index 016a1fe8..5b4f8df4 100644
---
a/opennlp-tools/src/test/java/opennlp/tools/parser/AbstractParserModelTest.java
+++
b/opennlp-tools/src/test/java/opennlp/tools/parser/AbstractParserModelTest.java
@@ -91,6 +91,57 @@ public abstract class AbstractParserModelTest {
Assertions.assertNotNull(s);
}
+ /*
+ * Verifies / addresses OPENNLP-509
+ * See: https://issues.apache.org/jira/projects/OPENNLP/issues/OPENNLP-509
+ */
+ @Test
+ void testParsingCheckParentReferencesArePopulated() {
+ // fixtures
+ final String sent = "Martin is testing.";
+ // prepare
+ List<String> tokens =
Arrays.asList(WhitespaceTokenizer.INSTANCE.tokenize(sent));
+ String text = String.join(" ", tokens);
+
+ Parse sentP = new Parse(text, new Span(0, text.length()),
+ AbstractBottomUpParser.INC_NODE, 0, null);
+ int start = 0;
+ int i = 0;
+ for (Iterator<String> ti = tokens.iterator(); ti.hasNext(); i++) {
+ String tok = ti.next();
+ sentP.insert(new Parse(text, new Span(start, start + tok.length()),
+ AbstractBottomUpParser.TOK_NODE, 0, i));
+ start += tok.length() + 1;
+ }
+
+ Parser parser = ParserFactory.create(getModel());
+ Assertions.assertNotNull(parser);
+
+ // Verifies parents of top-k parses (k=2)
+ Parse[] parses = parser.parse(sentP, 2);
+ Assertions.assertNotNull(parses);
+ for (Parse parent : parses) {
+ checkParentsEqual(parent);
+ }
+ }
+
+ /*
+ * Recursively traverses the parse tree and verifies parent references are
populated.
+ */
+ private void checkParentsEqual(Parse parent) {
+ for (Parse child : parent.getChildren()) {
+ Parse cParent = child.getParent();
+ // System.out.println(cParent.toStringPennTreebank() " --- type: "
cParent.getType());
+ if (AbstractBottomUpParser.TOK_NODE.equals(child.getType())) {
+ return; // found a leaf node: stopping recursion
+ }
+ Assertions.assertEquals(parent, cParent);
+ if (cParent.getChildren() != null) {
+ checkParentsEqual(child);
+ }
+ }
+ }
+
/*
* Verifies changes in OPENNLP-1330 and addresses follow-up OPENNLP-1333
* See: https://issues.apache.org/jira/projects/OPENNLP/issues/OPENNLP-1333