@Override protected String print(Relation t) { final StringBuilder sb = new StringBuilder(); writeLine(sb, "Value", t.getValue()); writeLine(sb, "Type", t.getRelationshipType() + " [" + t.getRelationSubType() + "]"); writeLine(sb, "Source", t.getSource()); writeLine(sb, "Target", t.getTarget()); return sb.toString(); } }
private boolean assertRelation(Relation r, Entity a, Entity b, String type) { return (r.getSource() == a && r.getTarget() == b || r.getSource() == b && r.getTarget() == a) && r.getRelationshipType().equalsIgnoreCase(type); } }
private boolean assertRelation(Relation r, Entity a, Entity b, String type) { return (r.getSource() == a && r.getTarget() == b || r.getSource() == b && r.getTarget() == a) && r.getRelationshipType().equalsIgnoreCase(type); } }
source, sentence, r.getRelationshipType(), r.getRelationSubType(), normalize(r.getSource().getValue()),
@Test public void testNoPerson() throws Exception { jCas.setDocumentText("The UN Senior Advisor released a statement"); Organisation o = new Organisation(jCas, 4, 6); o.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("UN Senior Advisor", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("UN", org.getCoveredText()); assertEquals(1, JCasUtil.select(jCas, Person.class).size()); Person pers = JCasUtil.selectByIndex(jCas, Person.class, 0); assertEquals("Senior Advisor", pers.getCoveredText()); }
@Test public void testNoPersonNestedApostrophe() throws Exception { jCas.setDocumentText("The UN's leader released a statement"); Organisation o = new Organisation(jCas, 4, 15); o.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("UN's leader", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("UN", org.getCoveredText()); assertEquals(1, JCasUtil.select(jCas, Person.class).size()); Person pers = JCasUtil.selectByIndex(jCas, Person.class, 0); assertEquals("leader", pers.getCoveredText()); }
@Test public void testNoPersonNested() throws Exception { jCas.setDocumentText("The UN Senior Advisor released a statement"); Organisation o = new Organisation(jCas, 4, 21); o.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("UN Senior Advisor", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("UN", org.getCoveredText()); assertEquals(1, JCasUtil.select(jCas, Person.class).size()); Person pers = JCasUtil.selectByIndex(jCas, Person.class, 0); assertEquals("Senior Advisor", pers.getCoveredText()); }
@Test public void testNoPersonApostrophe() throws Exception { jCas.setDocumentText("The UN's leader released a statement"); Organisation o = new Organisation(jCas, 4, 6); o.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("UN's leader", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("UN", org.getCoveredText()); assertEquals(1, JCasUtil.select(jCas, Person.class).size()); Person pers = JCasUtil.selectByIndex(jCas, Person.class, 0); assertEquals("leader", pers.getCoveredText()); } }
@Test public void testNested() throws Exception { jCas.setDocumentText("A statement US Army Major J Bloggs said that"); Organisation o = new Organisation(jCas, 12, 34); o.addToIndexes(); Person p = new Person(jCas, 20, 34); p.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("US Army Major J Bloggs", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("US Army", org.getCoveredText()); }
@Test public void testAdjacent() throws Exception { jCas.setDocumentText("A statement US Army Major J Bloggs said that"); Organisation o = new Organisation(jCas, 12, 19); o.addToIndexes(); Person p = new Person(jCas, 20, 34); p.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("US Army Major J Bloggs", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("US Army", org.getCoveredText()); }
@Test public void testBetween() throws Exception { jCas.setDocumentText("A statement UN Spokesperson J Bloggs said that"); Organisation o = new Organisation(jCas, 12, 14); o.addToIndexes(); Person p = new Person(jCas, 28, 36); p.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("UN Spokesperson J Bloggs", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("UN", org.getCoveredText()); }
@Test public void testAdjacentApostrophe() throws Exception { jCas.setDocumentText("A statement US Army's Major J Bloggs said that"); Organisation o = new Organisation(jCas, 12, 19); o.addToIndexes(); Person p = new Person(jCas, 22, 36); p.addToIndexes(); processJCas(); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("US Army's Major J Bloggs", r.getCoveredText()); assertEquals("ROLE", r.getRelationshipType()); assertEquals(1, JCasUtil.select(jCas, Organisation.class).size()); Organisation org = JCasUtil.selectByIndex(jCas, Organisation.class, 0); assertEquals("US Army", org.getCoveredText()); }
@Test public void testRelations() throws Exception { BaleenCollectionReader bcr = getCollectionReader( Re3dReader.PARAM_FOLDER, tmpDir.toAbsolutePath().toString(), Re3dReader.PARAM_ENTITIES, true, Re3dReader.PARAM_RELATIONSHIPS, true, Re3dReader.PARAM_RANDOM_DATES, true); assertTrue(bcr.doHasNext()); bcr.getNext(jCas.getCas()); AnnotationIndex<Entity> entityIndex = jCas.getAnnotationIndex(Entity.class); Entity source = Streams.stream(entityIndex).filter(e -> e.getBegin() == 12).findAny().get(); Entity target = Streams.stream(entityIndex).filter(e -> e.getBegin() == 9).findAny().get(); AnnotationIndex<Relation> relationIndex = jCas.getAnnotationIndex(Relation.class); contains(relationIndex, r -> r.getBegin() == 11); contains(relationIndex, r -> r.getEnd() == 12); contains(relationIndex, r -> r.getValue().equals("")); contains(relationIndex, r -> r.getRelationshipType().equals("HasAttrOf")); contains(relationIndex, r -> r.getSource().equals(source)); contains(relationIndex, r -> r.getTarget().equals(target)); bcr.close(); }
Assert.assertEquals("visit", r.getRelationshipType());
@Test public void testLanguageSentenceGivesRelation() throws AnalysisEngineProcessException, ResourceInitializationException { jCas.setDocumentText("Jon, at last, visits London."); final Person person = Annotations.createPerson(jCas, 0, 3, "Jon"); final Location location = Annotations.createLocation(jCas, 21, 27, "London", ""); final uk.gov.dstl.baleen.types.structure.Sentence s = new uk.gov.dstl.baleen.types.structure.Sentence(jCas); s.setBegin(0); s.setEnd(jCas.getDocumentText().length()); s.addToIndexes(); addWordTokens(); processJCas(); final List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); Assert.assertEquals(1, relations.size()); final Relation r = relations.get(0); assertEquals(person, r.getSource()); assertEquals(location, r.getTarget()); assertEquals("", r.getRelationshipType()); assertEquals("Jon, at last, visits London.", r.getValue()); assertEquals(0, r.getSentenceDistance()); assertEquals(5, r.getWordDistance()); assertEquals(-1, r.getDependencyDistance()); }
@Test public void testMarked() throws UIMAException { Quantity q = new Quantity(jCas); q.setBegin(18); q.setEnd(21); q.addToIndexes(); Buzzword e = new Buzzword(jCas); e.setBegin(25); e.setEnd(36); e.addToIndexes(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Entity.class).size()); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals(18, r.getBegin()); assertEquals(q, r.getSource()); assertEquals(36, e.getEnd()); assertEquals(e, r.getTarget()); assertEquals("QUANTITY", r.getRelationshipType()); } }
@Test public void testStructureSentenceGivesRelation() throws AnalysisEngineProcessException, ResourceInitializationException { jCas.setDocumentText("Jon, at last, visits London."); final Person person = Annotations.createPerson(jCas, 0, 3, "Jon"); final Location location = Annotations.createLocation(jCas, 21, 27, "London", ""); final uk.gov.dstl.baleen.types.structure.Sentence s = new uk.gov.dstl.baleen.types.structure.Sentence(jCas); s.setBegin(0); s.setEnd(jCas.getDocumentText().length()); s.addToIndexes(); addWordTokens(); processJCas(SentenceRelationshipAnnotator.PARAM_VALUE_STRATEGY, ValueStrategy.BETWEEN); final List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); assertEquals(1, relations.size()); final Relation r = relations.get(0); assertEquals(person, r.getSource()); assertEquals(location, r.getTarget()); assertEquals("", r.getRelationshipType()); assertEquals(", at last, visits", r.getValue()); assertEquals(0, r.getSentenceDistance()); assertEquals(5, r.getWordDistance()); assertEquals(-1, r.getDependencyDistance()); }
@Test public void testUnmarked() throws UIMAException { Quantity q = new Quantity(jCas); q.setBegin(18); q.setEnd(21); q.addToIndexes(); processJCas(); assertAnnotations(2, Entity.class, new TestEntity<>(1, "blue powder")); assertEquals(1, JCasUtil.select(jCas, Relation.class).size()); Relation r = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals(18, r.getBegin()); assertEquals(q, r.getSource()); assertEquals(36, r.getEnd()); assertNotNull(r.getTarget()); assertEquals("QUANTITY", r.getRelationshipType()); }
@Test public void testBothOnlyGivesOneRelationAndDependencyValue() throws AnalysisEngineProcessException, ResourceInitializationException { jCas.setDocumentText("Jon, at last, visits London."); final Person person = Annotations.createPerson(jCas, 0, 3, "Jon"); final Location location = Annotations.createLocation(jCas, 21, 27, "London", ""); final Sentence s1 = new Sentence(jCas); s1.setBegin(0); s1.setEnd(jCas.getDocumentText().length()); s1.addToIndexes(); final uk.gov.dstl.baleen.types.structure.Sentence s = new uk.gov.dstl.baleen.types.structure.Sentence(jCas); s.setBegin(0); s.setEnd(jCas.getDocumentText().length()); s.addToIndexes(); addDependencyInformation(); processJCas(SentenceRelationshipAnnotator.PARAM_VALUE_STRATEGY, ValueStrategy.DEPENDENCY); final List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); Assert.assertEquals(1, relations.size()); final Relation r = relations.get(0); assertEquals(person, r.getSource()); assertEquals(location, r.getTarget()); assertEquals("", r.getRelationshipType()); assertEquals("visits", r.getValue()); assertEquals(0, r.getSentenceDistance()); assertEquals(5, r.getWordDistance()); assertEquals(1, r.getDependencyDistance()); }
@Test public void testRegExRelationExtraction() throws AnalysisEngineProcessException, ResourceInitializationException { jCas.setDocumentText("Jon visits London. Steve visited Cheltenham"); final Person jon = Annotations.createPerson(jCas, 0, 3, "Jon"); final Person steve = Annotations.createPerson(jCas, 19, 24, "Steve"); final Location london = Annotations.createLocation(jCas, 11, 17, "London", ""); final Location cheltenham = Annotations.createLocation(jCas, 33, 43, "Cheltenham", ""); processJCas( PARAM_PATTERN, "(:Person:)\\s+(?:visit\\w*|went)\\s+(:Location:)", PARAM_TYPE, LOCATED_AT); final List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); assertEquals(2, relations.size()); final Relation jlr = findRelationBetween(relations, jon, london); final Relation scr = findRelationBetween(relations, steve, cheltenham); assertEquals(LOCATED_AT, jlr.getRelationshipType()); assertEquals("Jon visits London", jlr.getValue()); assertEquals(0, jlr.getBegin()); assertEquals(17, jlr.getEnd()); assertEquals("", jlr.getRelationSubType()); assertEquals(LOCATED_AT, scr.getRelationshipType()); assertEquals("", scr.getRelationSubType()); assertEquals("Steve visited Cheltenham", scr.getValue()); assertEquals(19, scr.getBegin()); assertEquals(43, scr.getEnd()); }