/*
* Copyright 2015
* Ubiquitous Knowledge Processing (UKP) Lab and FG Language Technology
* Technische Universität Darmstadt
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.tudarmstadt.ukp.clarin.webanno.curation.casdiff;
import static java.util.Arrays.asList;
import static org.apache.uima.fit.util.JCasUtil.select;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.fit.factory.JCasFactory;
import org.apache.uima.fit.factory.TypeSystemDescriptionFactory;
import org.apache.uima.fit.testing.factory.TokenBuilder;
import org.apache.uima.fit.util.FSUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.metadata.TypeSystemDescription;
import org.apache.uima.util.CasCreationUtils;
import org.junit.Rule;
import org.junit.Test;
import de.tudarmstadt.ukp.clarin.webanno.api.WebAnnoConst;
import de.tudarmstadt.ukp.clarin.webanno.curation.agreement.AgreementUtils;
import de.tudarmstadt.ukp.clarin.webanno.curation.agreement.AgreementUtils.AgreementResult;
import de.tudarmstadt.ukp.clarin.webanno.curation.agreement.AgreementUtils.ConcreteAgreementMeasure;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2.ArcDiffAdapter;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2.DiffAdapter;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2.DiffResult;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2.LinkCompareBehavior;
import de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff2.SpanDiffAdapter;
import de.tudarmstadt.ukp.dkpro.core.api.lexmorph.type.pos.POS;
import de.tudarmstadt.ukp.dkpro.core.api.ner.type.NamedEntity;
import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Lemma;
import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Sentence;
import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Token;
import de.tudarmstadt.ukp.dkpro.core.api.syntax.type.dependency.Dependency;
import de.tudarmstadt.ukp.dkpro.core.testing.DkproTestContext;
import de.tudarmstadt.ukp.dkpro.statistics.agreement.coding.ICodingAnnotationItem;
public class CasDiff2Test
{
@Test
public void noDataTest()
throws Exception
{
List<String> entryTypes = new ArrayList<>();
List<DiffAdapter> diffAdapters = new ArrayList<>();
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(0, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
}
@Test
public void singleEmptyCasTest()
throws Exception
{
String text = "";
JCas user1Cas = JCasFactory.createJCas();
user1Cas.setDocumentText(text);
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1Cas));
List<String> entryTypes = asList(Token.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(new SpanDiffAdapter(Token.class.getName()));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(0, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
}
@Test
public void twoEmptyCasTest()
throws Exception
{
String text = "";
JCas user1Cas = JCasFactory.createJCas();
user1Cas.setDocumentText(text);
JCas user2Cas = JCasFactory.createJCas();
user2Cas.setDocumentText(text);
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1Cas));
casByUser.put("user2", asList(user2Cas));
List<String> entryTypes = asList(Lemma.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(new SpanDiffAdapter(Lemma.class.getName()));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(0, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"value", casByUser);
assertEquals(Double.NaN, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void multipleEmptyCasWithMissingOnesTest()
throws Exception
{
String text = "";
JCas user1Cas1 = null;
JCas user1Cas2 = null;
JCas user1Cas3 = JCasFactory.createJCas();
user1Cas3.setDocumentText(text);
JCas user1Cas4 = JCasFactory.createJCas();
user1Cas4.setDocumentText(text);
JCas user2Cas1 = JCasFactory.createJCas();
user2Cas1.setDocumentText(text);
JCas user2Cas2 = null;
JCas user2Cas3 = null;
JCas user2Cas4 = JCasFactory.createJCas();
user2Cas4.setDocumentText(text);
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1Cas1, user1Cas2, user1Cas3, user1Cas4));
casByUser.put("user2", asList(user2Cas1, user2Cas2, user2Cas3, user2Cas4));
List<String> entryTypes = asList(Lemma.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(new SpanDiffAdapter(Lemma.class.getName()));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(0, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"value", casByUser);
assertEquals(Double.NaN, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void noDifferencesPosTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/noDifferences/data.conll",
"casdiff/noDifferences/data.conll");
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(26, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(1.0d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void noDifferencesDependencyTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/noDifferences/data.conll",
"casdiff/noDifferences/data.conll");
List<String> entryTypes = asList(Dependency.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(ArcDiffAdapter.DEPENDENCY);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(26, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"DependencyType", casByUser);
assertEquals(1.0d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void noDifferencesPosDependencyTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/noDifferences/data.conll",
"casdiff/noDifferences/data.conll");
List<String> entryTypes = asList(POS.class.getName(), Dependency.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(
SpanDiffAdapter.POS,
ArcDiffAdapter.DEPENDENCY);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(52, result.size());
assertEquals(26, result.size(POS.class.getName()));
assertEquals(26, result.size(Dependency.class.getName()));
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(1.0d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void singleDifferencesTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/singleSpanDifference/user1.conll",
"casdiff/singleSpanDifference/user2.conll");
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(1, result.size());
assertEquals(1, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(0.0d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void singleNoDifferencesWithAdditionalCas1Test()
throws Exception
{
JCas user1 = JCasFactory.createJCas();
user1.setDocumentText("test");
JCas user2 = JCasFactory.createJCas();
user2.setDocumentText("test");
JCas user3 = JCasFactory.createJCas();
user3.setDocumentText("test");
POS pos3 = new POS(user3, 0, 4);
pos3.setPosValue("test");
pos3.addToIndexes();
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1));
casByUser.put("user2", asList(user2));
casByUser.put("user3", asList(user3));
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
casByUser.remove("user3");
AgreementResult agreement = AgreementUtils.getAgreement(
ConcreteAgreementMeasure.KRIPPENDORFF_ALPHA_NOMINAL_AGREEMENT, false, result,
entryTypes.get(0), "PosValue", casByUser);
assertEquals(1, agreement.getTotalSetCount());
assertEquals(1, agreement.getIrrelevantSets().size());
assertEquals(0, agreement.getRelevantSetCount());
}
@Test
public void singleNoDifferencesWithAdditionalCas2Test()
throws Exception
{
JCas user1 = JCasFactory.createJCas();
user1.setDocumentText("test");
JCas user2 = JCasFactory.createJCas();
user2.setDocumentText("test");
JCas user3 = JCasFactory.createJCas();
user3.setDocumentText("test");
POS pos3 = new POS(user3, 0, 4);
pos3.addToIndexes();
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1));
casByUser.put("user2", asList(user2));
casByUser.put("user3", asList(user3));
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
casByUser.remove("user3");
AgreementResult agreement = AgreementUtils.getAgreement(
ConcreteAgreementMeasure.KRIPPENDORFF_ALPHA_NOMINAL_AGREEMENT, false, result,
entryTypes.get(0), "PosValue", casByUser);
assertEquals(1, agreement.getTotalSetCount());
assertEquals(1, agreement.getIrrelevantSets().size());
assertEquals(0, agreement.getRelevantSetCount());
}
@Test
public void twoWithoutLabelTest()
throws Exception
{
JCas user1 = JCasFactory.createJCas();
user1.setDocumentText("test");
new POS(user1, 0, 1).addToIndexes();
new POS(user1, 1, 2).addToIndexes();
POS p1 = new POS(user1, 3, 4);
p1.setPosValue("A");
p1.addToIndexes();
JCas user2 = JCasFactory.createJCas();
user2.setDocumentText("test");
new POS(user2, 0, 1).addToIndexes();
new POS(user2, 2, 3).addToIndexes();
POS p2 = new POS(user2, 3, 4);
p2.setPosValue("B");
p2.addToIndexes();
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(user1));
casByUser.put("user2", asList(user2));
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
AgreementResult agreement = AgreementUtils.getAgreement(
ConcreteAgreementMeasure.KRIPPENDORFF_ALPHA_NOMINAL_AGREEMENT, false, result,
entryTypes.get(0), "PosValue", casByUser);
assertEquals(4, agreement.getTotalSetCount());
assertEquals(0, agreement.getIrrelevantSets().size());
// the following two counts are zero because the incomplete sets are not excluded!
assertEquals(2, agreement.getIncompleteSetsByPosition().size());
assertEquals(0, agreement.getIncompleteSetsByLabel().size());
assertEquals(3, agreement.getSetsWithDifferences().size());
assertEquals(4, agreement.getRelevantSetCount());
assertEquals(0.4, agreement.getAgreement(), 0.01);
ICodingAnnotationItem item1 = agreement.getStudy().getItem(0);
ICodingAnnotationItem item2 = agreement.getStudy().getItem(1);
ICodingAnnotationItem item3 = agreement.getStudy().getItem(2);
assertEquals("", item1.getUnit(0).getCategory());
assertEquals("", item1.getUnit(1).getCategory());
assertEquals("", item2.getUnit(0).getCategory());
assertEquals(null, item2.getUnit(1).getCategory());
assertEquals(null, item3.getUnit(0).getCategory());
assertEquals("", item3.getUnit(1).getCategory());
}
@Test
public void someDifferencesTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/someDifferences/user1.conll",
"casdiff/someDifferences/user2.conll");
List<String> entryTypes = asList(POS.class.getName());
List<SpanDiffAdapter> diffAdapters = asList(SpanDiffAdapter.POS);
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(26, result.size());
assertEquals(4, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(0.836477987d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void singleNoDifferencesTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/singleSpanNoDifference/data.conll",
"casdiff/singleSpanNoDifference/data.conll");
List<String> entryTypes = asList(POS.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(new SpanDiffAdapter(POS.class.getName(),
"PosValue"));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(1, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(Double.NaN, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void relationDistanceTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/relationDistance/user1.conll",
"casdiff/relationDistance/user2.conll");
List<String> entryTypes = asList(Dependency.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(new ArcDiffAdapter(
Dependency.class.getName(), "Dependent", "Governor", "DependencyType"));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(27, result.size());
assertEquals(0, result.getDifferingConfigurationSets().size());
assertEquals(2, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"DependencyType", casByUser);
assertEquals(1.0, agreement.getAgreement(), 0.000001d);
assertEquals(2, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void spanLabelLabelTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/spanLabel/user1.conll",
"casdiff/spanLabel/user2.conll");
List<String> entryTypes = asList(POS.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(new SpanDiffAdapter(POS.class.getName(),
"PosValue"));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(26, result.size());
assertEquals(1, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"PosValue", casByUser);
assertEquals(0.958730d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void relationLabelTest()
throws Exception
{
Map<String, List<JCas>> casByUser = DiffUtils.load(
"casdiff/relationLabel/user1.conll",
"casdiff/relationLabel/user2.conll");
List<String> entryTypes = asList(Dependency.class.getName());
List<? extends DiffAdapter> diffAdapters = asList(new ArcDiffAdapter(
Dependency.class.getName(), "Dependent", "Governor", "DependencyType"));
DiffResult result = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
result.print(System.out);
assertEquals(26, result.size());
assertEquals(1, result.getDifferingConfigurationSets().size());
assertEquals(0, result.getIncompleteConfigurationSets().size());
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(result, entryTypes.get(0),
"DependencyType", casByUser);
assertEquals(0.958199d, agreement.getAgreement(), 0.000001d);
assertEquals(0, agreement.getIncompleteSetsByPosition().size());
}
@Test
public void relationStackedSpansTest()
throws Exception
{
TypeSystemDescription global = TypeSystemDescriptionFactory.createTypeSystemDescription();
TypeSystemDescription local = TypeSystemDescriptionFactory
.createTypeSystemDescriptionFromPath(
"src/test/resources/desc/type/webannoTestTypes.xml");
TypeSystemDescription merged = CasCreationUtils.mergeTypeSystems(asList(global, local));
TokenBuilder<Token, Sentence> tb = new TokenBuilder<Token, Sentence>(Token.class,
Sentence.class);
JCas jcasA = JCasFactory.createJCas(merged);
{
CAS casA = jcasA.getCas();
tb.buildTokens(jcasA, "This is a test .");
List<Token> tokensA = new ArrayList<>(select(jcasA, Token.class));
Token t1A = tokensA.get(0);
Token t2A = tokensA.get(tokensA.size()-1);
NamedEntity govA = new NamedEntity(jcasA, t1A.getBegin(), t1A.getEnd());
govA.addToIndexes();
// Here we add a stacked named entity!
new NamedEntity(jcasA, t1A.getBegin(), t1A.getEnd()).addToIndexes();
NamedEntity depA = new NamedEntity(jcasA, t2A.getBegin(), t2A.getEnd());
depA.addToIndexes();
Type relationTypeA = casA.getTypeSystem().getType("webanno.custom.Relation");
AnnotationFS fs1A = casA.createAnnotation(relationTypeA, depA.getBegin(), depA.getEnd());
FSUtil.setFeature(fs1A, "Governor", govA);
FSUtil.setFeature(fs1A, "Dependent", depA);
FSUtil.setFeature(fs1A, "value", "REL");
casA.addFsToIndexes(fs1A);
}
JCas jcasB = JCasFactory.createJCas(merged);
{
CAS casB = jcasB.getCas();
tb.buildTokens(jcasB, "This is a test .");
List<Token> tokensB = new ArrayList<>(select(jcasB, Token.class));
Token t1B = tokensB.get(0);
Token t2B = tokensB.get(tokensB.size()-1);
NamedEntity govB = new NamedEntity(jcasB, t1B.getBegin(), t1B.getEnd());
govB.addToIndexes();
NamedEntity depB = new NamedEntity(jcasB, t2B.getBegin(), t2B.getEnd());
depB.addToIndexes();
Type relationTypeB = casB.getTypeSystem().getType("webanno.custom.Relation");
AnnotationFS fs1B = casB.createAnnotation(relationTypeB, depB.getBegin(), depB.getEnd());
FSUtil.setFeature(fs1B, "Governor", govB);
FSUtil.setFeature(fs1B, "Dependent", depB);
FSUtil.setFeature(fs1B, "value", "REL");
casB.addFsToIndexes(fs1B);
}
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList("webanno.custom.Relation");
List<? extends DiffAdapter> diffAdapters = asList(new ArcDiffAdapter(
"webanno.custom.Relation", WebAnnoConst.FEAT_REL_TARGET,
WebAnnoConst.FEAT_REL_SOURCE, "value"));
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(1, diff.size());
assertEquals(0, diff.getDifferingConfigurationSets().size());
assertEquals(0, diff.getIncompleteConfigurationSets().size());
// Check against new impl
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff,
"webanno.custom.Relation", "value", casByUser);
// Asserts
System.out.printf("Agreement: %s%n", agreement.toString());
AgreementUtils.dumpAgreementStudy(System.out, agreement);
assertEquals(1, agreement.getPluralitySets().size());
}
@Test
public void multiLinkWithRoleNoDifferenceTest()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0, DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0));
DiffUtils.makeLinkHostFS(jcasA, 10, 10, DiffUtils.makeLinkFS(jcasA, "slot1", 10, 10));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0, DiffUtils.makeLinkFS(jcasB, "slot1", 0, 0));
DiffUtils.makeLinkHostFS(jcasB, 10, 10, DiffUtils.makeLinkFS(jcasB, "slot1", 10, 10));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(4, diff.size());
assertEquals(0, diff.getDifferingConfigurationSets().size());
assertEquals(0, diff.getIncompleteConfigurationSets().size());
// Check against new impl
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, DiffUtils.HOST_TYPE, "links",
casByUser);
// Asserts
System.out.printf("Agreement: %s%n", agreement.toString());
AgreementUtils.dumpAgreementStudy(System.out, agreement);
assertEquals(1.0d, agreement.getAgreement(), 0.00001d);
}
@Test
public void multiLinkWithRoleLabelDifferenceTest()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0, DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0, DiffUtils.makeLinkFS(jcasB, "slot2", 0, 0));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(3, diff.size());
assertEquals(0, diff.getDifferingConfigurationSets().size());
assertEquals(2, diff.getIncompleteConfigurationSets().size());
// Check against new impl
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, DiffUtils.HOST_TYPE, "links",
casByUser);
// Asserts
System.out.printf("Agreement: %s%n", agreement.toString());
AgreementUtils.dumpAgreementStudy(System.out, agreement);
assertEquals(Double.NaN, agreement.getAgreement(), 0.00001d);
}
@Test
public void multiLinkWithRoleLabelDifferenceTest2()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0, DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0, DiffUtils.makeLinkFS(jcasB, "slot2", 0, 0));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_ROLE_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(2, diff.size());
assertEquals(1, diff.getDifferingConfigurationSets().size());
assertEquals(0, diff.getIncompleteConfigurationSets().size());
// Check against new impl
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, DiffUtils.HOST_TYPE, "links",
casByUser);
// Asserts
System.out.printf("Agreement: %s%n", agreement.toString());
AgreementUtils.dumpAgreementStudy(System.out, agreement);
assertEquals(0.0d, agreement.getAgreement(), 0.00001d);
}
@Test
public void multiLinkWithRoleTargetDifferenceTest()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0, DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0, DiffUtils.makeLinkFS(jcasB, "slot1", 10, 10));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(2, diff.size());
assertEquals(1, diff.getDifferingConfigurationSets().size());
assertEquals(0, diff.getIncompleteConfigurationSets().size());
// Check against new impl
AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, DiffUtils.HOST_TYPE, "links",
casByUser);
// Asserts
System.out.printf("Agreement: %s%n", agreement.toString());
AgreementUtils.dumpAgreementStudy(System.out, agreement);
assertEquals(0.0, agreement.getAgreement(), 0.00001d);
}
@Test
public void multiLinkWithRoleMultiTargetDifferenceTest()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0,
DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0),
DiffUtils.makeLinkFS(jcasA, "slot1", 10, 10));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0,
DiffUtils.makeLinkFS(jcasB, "slot1", 10, 10));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(2, diff.size());
assertEquals(1, diff.getDifferingConfigurationSets().size());
assertEquals(0, diff.getIncompleteConfigurationSets().size());
// // Check against new impl
// AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, HOST_TYPE, "links",
// casByUser);
//
// // Asserts
// System.out.printf("Agreement: %s%n", agreement.toString());
// AgreementUtils.dumpAgreementStudy(System.out, agreement);
//
// assertEquals(0.0, agreement.getAgreement(), 0.00001d);
}
@Test
public void multiLinkWithRoleMultiTargetDifferenceTest2()
throws Exception
{
JCas jcasA = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasA, 0, 0,
DiffUtils.makeLinkFS(jcasA, "slot1", 0, 0),
DiffUtils.makeLinkFS(jcasA, "slot1", 10, 10));
JCas jcasB = JCasFactory.createJCas(DiffUtils.createMultiLinkWithRoleTestTypeSytem());
DiffUtils.makeLinkHostFS(jcasB, 0, 0,
DiffUtils.makeLinkFS(jcasB, "slot2", 10, 10));
Map<String, List<JCas>> casByUser = new LinkedHashMap<>();
casByUser.put("user1", asList(jcasA));
casByUser.put("user2", asList(jcasB));
List<String> entryTypes = asList(DiffUtils.HOST_TYPE);
SpanDiffAdapter adapter = new SpanDiffAdapter(DiffUtils.HOST_TYPE);
adapter.addLinkFeature("links", "role", "target");
List<? extends DiffAdapter> diffAdapters = asList(adapter);
DiffResult diff = CasDiff2.doDiff(entryTypes, diffAdapters,
LinkCompareBehavior.LINK_TARGET_AS_LABEL, casByUser);
diff.print(System.out);
assertEquals(3, diff.size());
assertEquals(1, diff.getDifferingConfigurationSets().size());
assertEquals(2, diff.getIncompleteConfigurationSets().size());
// // Check against new impl
// AgreementResult agreement = AgreementUtils.getCohenKappaAgreement(diff, HOST_TYPE, "links",
// casByUser);
//
// // Asserts
// System.out.printf("Agreement: %s%n", agreement.toString());
// AgreementUtils.dumpAgreementStudy(System.out, agreement);
//
// assertEquals(0.0, agreement.getAgreement(), 0.00001d);
}
@Rule
public DkproTestContext testContext = new DkproTestContext();
}