@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode()) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && aFeature.getType().startsWith(PREFIX); }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode()) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && aFeature.getType().startsWith(PREFIX); }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && (CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature()); } }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(AnchoringMode.SENTENCES).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature(); }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && "span".equals(aLayer.getType()) && (CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature()); }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && (CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature()); } }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && "span".equals(aLayer.getType()) && (CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature()); }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature(); } }
@Override public boolean accepts(AnnotationLayer aLayer, AnnotationFeature aFeature) { if (aLayer == null || aFeature == null) { return false; } return (asList(SINGLE_TOKEN, TOKENS).contains(aLayer.getAnchoringMode())) && !aLayer.isCrossSentence() && SPAN_TYPE.equals(aLayer.getType()) && CAS.TYPE_NAME_STRING.equals(aFeature.getType()) || aFeature.isVirtualFeature(); }
@Override public void onRender(TypeAdapter aAdapter, VDocument aResponse, Map<AnnotationFS, VSpan> annoToSpanIdx) { if (aAdapter.getLayer().isCrossSentence()) { return; } // Since we split spans into multiple ranges at sentence boundaries, we can simply check // if there are multiple ranges for a given span. This is cheaper than checking for // every annotation whether the begin/end offset is in the same sentence. for (Entry<AnnotationFS, VSpan> e : annoToSpanIdx.entrySet()) { if (e.getValue().getRanges().size() > 1) { aResponse.add(new VComment(new VID(e.getKey()), ERROR, "Crossing sentence bounardies is not permitted.")); } } }
@Override public void onRender(TypeAdapter aAdapter, VDocument aResponse, Map<AnnotationFS, VSpan> annoToSpanIdx) { if (aAdapter.getLayer().isCrossSentence()) { return; } // Since we split spans into multiple ranges at sentence boundaries, we can simply check // if there are multiple ranges for a given span. This is cheaper than checking for // every annotation whether the begin/end offset is in the same sentence. for (Entry<AnnotationFS, VSpan> e : annoToSpanIdx.entrySet()) { if (e.getValue().getRanges().size() > 1) { aResponse.add(new VComment(new VID(e.getKey()), ERROR, "Crossing sentence bounardies is not permitted.")); } } }
@Override public List<Pair<LogMessage, AnnotationFS>> onValidate(TypeAdapter aAdapter, JCas aJCas) { if (aAdapter.getLayer().isCrossSentence()) { return emptyList(); } CAS cas = aJCas.getCas(); Type type = getType(cas, aAdapter.getAnnotationTypeName()); List<Pair<LogMessage, AnnotationFS>> messages = new ArrayList<>(); for (AnnotationFS fs : select(cas, type)) { if (!isBeginEndInSameSentence(aJCas, fs.getBegin(), fs.getEnd())) { messages.add(Pair.of( LogMessage.error(this, "Crossing sentence bounardies is not permitted."), fs)); } } return messages; } }
@Override public CreateSpanAnnotationRequest onCreate(TypeAdapter aAdapter, CreateSpanAnnotationRequest aRequest) throws AnnotationException { if (aAdapter.getLayer().isCrossSentence()) { return aRequest; } if (!isBeginEndInSameSentence(aRequest.getJcas(), aRequest.getBegin(), aRequest.getEnd())) { throw new MultipleSentenceCoveredException("Annotation covers multiple sentences, " + "limit your annotation to single sentence!"); } return aRequest; }
@Override public void onRender(TypeAdapter aAdapter, VDocument aResponse, Map<AnnotationFS, VArc> aAnnoToArcIdx) { if (aAdapter.getLayer().isCrossSentence()) { return; } try { for (Entry<AnnotationFS, VArc> e : aAnnoToArcIdx.entrySet()) { JCas jcas = e.getKey().getCAS().getJCas(); if (!isBeginInSameSentence(jcas, selectByAddr(jcas, e.getValue().getSource().getId()).getBegin(), selectByAddr(jcas, e.getValue().getTarget().getId()).getBegin())) { aResponse.add(new VComment(new VID(e.getKey()), ERROR, "Crossing sentence bounardies is not permitted.")); } } } catch (CASException e) { throw new IllegalStateException("Unable to obtain JCas"); } }
@Override public CreateSpanAnnotationRequest onCreate(TypeAdapter aAdapter, CreateSpanAnnotationRequest aRequest) throws AnnotationException { if (aAdapter.getLayer().isCrossSentence()) { return aRequest; } if (!isBeginEndInSameSentence(aRequest.getJcas(), aRequest.getBegin(), aRequest.getEnd())) { throw new MultipleSentenceCoveredException("Annotation covers multiple sentences, " + "limit your annotation to single sentence!"); } return aRequest; }
@Override public List<Pair<LogMessage, AnnotationFS>> onValidate(TypeAdapter aAdapter, JCas aJCas) { if (aAdapter.getLayer().isCrossSentence()) { emptyList(); } RelationAdapter adapter = (RelationAdapter) aAdapter; CAS cas = aJCas.getCas(); Type type = getType(cas, adapter.getAnnotationTypeName()); Feature targetFeature = type.getFeatureByBaseName(adapter.getTargetFeatureName()); Feature sourceFeature = type.getFeatureByBaseName(adapter.getSourceFeatureName()); List<Pair<LogMessage, AnnotationFS>> messages = new ArrayList<>(); for (AnnotationFS fs : select(cas, type)) { AnnotationFS targetFs = (AnnotationFS) fs.getFeatureValue(targetFeature); AnnotationFS sourceFs = (AnnotationFS) fs.getFeatureValue(sourceFeature); if (!isBeginInSameSentence(aJCas, targetFs.getBegin(), sourceFs.getBegin())) { messages.add(Pair.of( LogMessage.error(this, "Crossing sentence bounardies is not permitted."), fs)); } } return messages; } }
private Metadata buildMetadata(CAS aCas) throws RecommendationException { CASMetadata casMetadata = getCasMetadata(aCas); AnnotationLayer layer = recommender.getLayer(); return new Metadata( layer.getName(), recommender.getFeature().getName(), casMetadata.getProjectId(), layer.getAnchoringMode().getId(), layer.isCrossSentence() ); }
private Metadata buildMetadata(CAS aCas) throws RecommendationException { CASMetadata casMetadata = getCasMetadata(aCas); AnnotationLayer layer = recommender.getLayer(); return new Metadata( layer.getName(), recommender.getFeature().getName(), casMetadata.getProjectId(), layer.getAnchoringMode().getId(), layer.isCrossSentence() ); }
@Override public CreateRelationAnnotationRequest onCreate(RelationAdapter aAdapter, CreateRelationAnnotationRequest aRequest) throws AnnotationException { if (aAdapter.getLayer().isCrossSentence()) { return aRequest; } if (!isBeginEndInSameSentence(aRequest.getJcas(), aRequest.getOriginFs().getBegin(), aRequest.getTargetFs().getEnd())) { throw new MultipleSentenceCoveredException("Annotation coveres multiple sentences, " + "limit your annotation to single sentence!"); } return aRequest; }
@Override public CreateRelationAnnotationRequest onCreate(RelationAdapter aAdapter, CreateRelationAnnotationRequest aRequest) throws AnnotationException { if (aAdapter.getLayer().isCrossSentence()) { return aRequest; } if (!isBeginEndInSameSentence(aRequest.getJcas(), aRequest.getOriginFs().getBegin(), aRequest.getTargetFs().getEnd())) { throw new MultipleSentenceCoveredException("Annotation coveres multiple sentences, " + "limit your annotation to single sentence!"); } return aRequest; }