//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.relations; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import org.apache.uima.analysis_engine.AnalysisEngine; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.fit.factory.ExternalResourceFactory; import org.apache.uima.fit.util.JCasUtil; import org.apache.uima.resource.ExternalResourceDescription; import org.apache.uima.resource.ResourceInitializationException; import org.junit.Test; import uk.gov.dstl.baleen.annotators.language.MaltParser; import uk.gov.dstl.baleen.annotators.language.OpenNLP; import uk.gov.dstl.baleen.annotators.language.OpenNLPParser; import uk.gov.dstl.baleen.annotators.testing.AbstractMultiAnnotatorTest; import uk.gov.dstl.baleen.resources.SharedOpenNLPModel; import uk.gov.dstl.baleen.types.common.Person; import uk.gov.dstl.baleen.types.language.Interaction; import uk.gov.dstl.baleen.types.semantic.Entity; import uk.gov.dstl.baleen.types.semantic.Location; import uk.gov.dstl.baleen.types.semantic.Relation; import uk.gov.dstl.baleen.types.semantic.Temporal; public class UbmreConstituentRelationshipTest extends AbstractMultiAnnotatorTest { @Override protected AnalysisEngine[] createAnalysisEngines() throws ResourceInitializationException { ExternalResourceDescription parserChunkingDesc = ExternalResourceFactory .createExternalResourceDescription("parserChunking", SharedOpenNLPModel.class); // Add in the OpenNLP implementation too, as its a prerequisite // (in theory we should test OpenNLPParser in isolation, but in practise it as this as a // dependency // so better test they work together) ExternalResourceDescription tokensDesc = ExternalResourceFactory.createExternalResourceDescription("tokens", SharedOpenNLPModel.class); ExternalResourceDescription sentencesDesc = ExternalResourceFactory .createExternalResourceDescription("sentences", SharedOpenNLPModel.class); ExternalResourceDescription posDesc = ExternalResourceFactory.createExternalResourceDescription("posTags", SharedOpenNLPModel.class); ExternalResourceDescription chunksDesc = ExternalResourceFactory .createExternalResourceDescription("phraseChunks", SharedOpenNLPModel.class); return asArray( createAnalysisEngine(OpenNLP.class, "tokens", tokensDesc, "sentences", sentencesDesc, "posTags", posDesc, "phraseChunks", chunksDesc), createAnalysisEngine(OpenNLPParser.class, "parserChunking", parserChunkingDesc), createAnalysisEngine(MaltParser.class), createAnalysisEngine(UbmreConstituent.class) ); } @Test public void test() throws AnalysisEngineProcessException, ResourceInitializationException { // From the above pipeline we'll have WordToken, Setence and Depedency // We still need Entity and Interaction jCas.setDocumentText("Jon and Chris will visit London on Monday."); Person jon = new Person(jCas); jon.setBegin(0); jon.setEnd(3); jon.addToIndexes(); Person chris = new Person(jCas); chris.setBegin(8); chris.setEnd(13); chris.addToIndexes(); Interaction visit = new Interaction(jCas); visit.setBegin(19); visit.setEnd(24); visit.setRelationshipType("visit"); visit.setValue("visit"); visit.addToIndexes(); Location london = new Location(jCas); london.setBegin(25); london.setEnd(31); london.addToIndexes(); Temporal monday = new Temporal(jCas); monday.setBegin(35); monday.setEnd(41); monday.addToIndexes(); processJCas(); List<Relation> relations = new ArrayList<>(JCasUtil.select(jCas, Relation.class)); // jon-visit-london, jon-visit-monday // chris-visit-london, chris-visit-monday. assertEquals(4, relations.size()); assertTrue(relations.stream() .anyMatch(r -> assertRelation(r, jon, london, "visit"))); assertTrue(relations.stream().anyMatch( r -> assertRelation(r, jon, monday, "visit"))); assertTrue(relations.stream() .anyMatch(r -> assertRelation(r, chris, monday, "visit"))); assertTrue(relations.stream().anyMatch( r -> assertRelation(r, london, chris, "visit"))); } 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); } }