/** * Get relations that have a given entity as either the source or the target * * @param e The given entity * @return Collection of relations that refer to the given Entity */ public Collection<Relation> getRelations(Entity e) { try { JCas jCas = e.getCAS().getJCas(); Collection<Relation> relations = JCasUtil.select(jCas, Relation.class); return relations .stream() .filter(r -> r.getSource() == e || r.getTarget() == e) .collect(Collectors.toList()); } catch (UIMAException ue) { monitor.warn("Unable to get relations from entity", ue); return Collections.emptyList(); } } }
/** * Get relations that have a given entity as either the source or the target * * @param e The given entity * @return Collection of relations that refer to the given Entity */ public Collection<Relation> getRelations(Entity e) { try { JCas jCas = e.getCAS().getJCas(); Collection<Relation> relations = JCasUtil.select(jCas, Relation.class); return relations .stream() .filter(r -> r.getSource() == e || r.getTarget() == e) .collect(Collectors.toList()); } catch (UIMAException ue) { monitor.warn("Unable to get relations from entity", ue); return Collections.emptyList(); } } }
private Relation findRelationBetween( final List<Relation> relations, final Entity e1, final Entity e2) { return relations .stream() .filter(r -> r.getSource().equals(e1) && r.getTarget().equals(e2)) .findFirst() .get(); } }
private Relation findRelationBetween( final List<Relation> relations, final Entity e1, final Entity e2) { return relations .stream() .filter(r -> r.getSource().equals(e1) && r.getTarget().equals(e2)) .findFirst() .get(); } }
private Relation findRelationBetween( final List<Relation> relations, final Entity e1, final Entity e2) { return relations .stream() .filter(r -> r.getSource().equals(e1) && r.getTarget().equals(e2)) .findFirst() .get(); } }
private Relation findRelationBetween( final List<Relation> relations, final Entity e1, final Entity e2) { return relations .stream() .filter(r -> r.getSource().equals(e1) && r.getTarget().equals(e2)) .findFirst() .get(); } }
@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(); } }
/** * Get a usable unique uid for the relation based on the properties, source and target. * * @param relation the relation to identify * @return hash * @throws BaleenException */ public static String getExternalId(Relation relation) { String[] ids = { relation.getExternalId(), relation.getSource().getExternalId(), relation.getTarget().getExternalId() }; try { return IdentityUtils.hashStrings(ids); } catch (BaleenException e) { return fallbackToUUID(e); } }
@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(location, r.getTarget()); Assert.assertEquals("visit", r.getRelationshipType());
@Test public void test1() throws UIMAException { createPOS(); Person person = new Person(jCas, 0, 2); // He person.addToIndexes(); Money money = new Money(jCas, 59, 71); // $1.8 billion money.addToIndexes(); Temporal date = new Temporal(jCas, 75, 84); // September date.addToIndexes(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Relation.class).size()); Relation r1 = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("reckons", r1.getValue()); assertEquals(person, r1.getSource()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r1.getTarget().getTypeName()); assertEquals("the current account deficit", r1.getTarget().getCoveredText()); Relation r2 = JCasUtil.selectByIndex(jCas, Relation.class, 1); assertEquals("will narrow to", r2.getValue()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r2.getSource().getTypeName()); assertEquals("the current account deficit", r2.getSource().getCoveredText()); assertEquals(money, r2.getTarget()); }
@Test public void test2() throws UIMAException { createPOS(); Person person = new Person(jCas, 0, 1); // H person.addToIndexes(); Money money = new Money(jCas, 59, 71); // $1.8 billion money.addToIndexes(); Temporal date = new Temporal(jCas, 75, 84); // September date.addToIndexes(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Relation.class).size()); Relation r1 = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("reckons", r1.getValue()); assertEquals(person, r1.getSource()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r1.getTarget().getTypeName()); assertEquals("the current account deficit", r1.getTarget().getCoveredText()); Relation r2 = JCasUtil.selectByIndex(jCas, Relation.class, 1); assertEquals("will narrow to", r2.getValue()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r2.getSource().getTypeName()); assertEquals("the current account deficit", r2.getSource().getCoveredText()); assertEquals(money, r2.getTarget()); }
@Test public void test3() throws UIMAException { createPOS(); Person person = new Person(jCas, 0, 2); // He person.addToIndexes(); Money money = new Money(jCas, 54, 71); // only $1.8 billion money.addToIndexes(); Temporal date = new Temporal(jCas, 75, 84); // September date.addToIndexes(); processJCas(); assertEquals(2, JCasUtil.select(jCas, Relation.class).size()); Relation r1 = JCasUtil.selectByIndex(jCas, Relation.class, 0); assertEquals("reckons", r1.getValue()); assertEquals(person, r1.getSource()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r1.getTarget().getTypeName()); assertEquals("the current account deficit", r1.getTarget().getCoveredText()); Relation r2 = JCasUtil.selectByIndex(jCas, Relation.class, 1); assertEquals("will narrow to", r2.getValue()); assertEquals("uk.gov.dstl.baleen.types.semantic.Entity", r2.getSource().getTypeName()); assertEquals("the current account deficit", r2.getSource().getCoveredText()); assertEquals(money, r2.getTarget()); }
@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 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 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()); }