Search in sources :

Example 1 with CasMerge

use of de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge in project webanno by webanno.

the class SuggestionBuilder method createCurationCas.

/**
 * For the first time a curation page is opened, create a MergeCas that contains only agreeing
 * annotations Using the CAS of the curator user.
 *
 * @param aState
 *            the annotator state
 * @param aRandomAnnotationDocument
 *            an annotation document.
 * @param aCasses
 *            the CASes
 * @param aAnnotationLayers
 *            the layers.
 * @return the CAS.
 * @throws IOException
 *             if an I/O error occurs.
 */
private CAS createCurationCas(AnnotatorState aState, AnnotationDocument aRandomAnnotationDocument, Map<String, CAS> aCasses, List<AnnotationLayer> aAnnotationLayers, boolean aMergeIncompleteAnnotations) throws IOException, UIMAException, AnnotationException {
    Validate.notNull(aState, "State must be specified");
    Validate.notNull(aRandomAnnotationDocument, "Annotation document must be specified");
    // We need a modifiable copy of some annotation document which we can use to initialize
    // the curation CAS. This is an exceptional case where BYPASS is the correct choice
    CAS mergeCas = documentService.readAnnotationCas(aRandomAnnotationDocument, UNMANAGED_ACCESS);
    List<DiffAdapter> adapters = getDiffAdapters(schemaService, aState.getAnnotationLayers());
    DiffResult diff;
    try (StopWatch watch = new StopWatch(log, "CasDiff")) {
        diff = doDiffSingle(adapters, LINK_ROLE_AS_LABEL, aCasses, 0, mergeCas.getDocumentText().length()).toResult();
    }
    try (StopWatch watch = new StopWatch(log, "CasMerge")) {
        CasMerge casMerge = new CasMerge(schemaService);
        casMerge.setMergeIncompleteAnnotations(aMergeIncompleteAnnotations);
        casMerge.reMergeCas(diff, aState.getDocument(), aState.getUser().getUsername(), mergeCas, aCasses);
    }
    curationDocumentService.writeCurationCas(mergeCas, aRandomAnnotationDocument.getDocument(), false);
    return mergeCas;
}
Also used : CAS(org.apache.uima.cas.CAS) CasMerge(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge) DiffAdapter(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.api.DiffAdapter) DiffResult(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.DiffResult) StopWatch(de.tudarmstadt.ukp.clarin.webanno.support.StopWatch)

Example 2 with CasMerge

use of de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge in project webanno by webanno.

the class SuggestionViewPanel method actionAcceptAll.

private void actionAcceptAll(AjaxRequestTarget aTarget, UserAnnotationSegment aSegment, AnnotationLayer aLayer) throws IOException {
    CAS targetCas = readEditorCas(aSegment.getAnnotatorState());
    CAS sourceCas = readAnnotatorCas(aSegment);
    AnnotatorState sourceState = aSegment.getAnnotatorState();
    TypeAdapter adapter = schemaService.getAdapter(aLayer);
    int mergeConflict = 0;
    int alreadyMerged = 0;
    int updated = 0;
    int created = 0;
    Set<String> otherErrors = new LinkedHashSet<>();
    CasMerge casMerge = new CasMerge(schemaService);
    casMerge.setSilenceEvents(true);
    nextAnnotation: for (AnnotationFS ann : select(sourceCas, adapter.getAnnotationType(sourceCas))) {
        try {
            CasMergeOperationResult result;
            switch(aLayer.getType()) {
                case SPAN_TYPE:
                    result = mergeSpan(casMerge, targetCas, sourceCas, new VID(ann), sourceState.getDocument(), sourceState.getUser().getUsername(), aLayer);
                    break;
                case RELATION_TYPE:
                    result = mergeRelation(casMerge, targetCas, sourceCas, new VID(ann), sourceState.getDocument(), sourceState.getUser().getUsername(), aLayer);
                    break;
                default:
                    continue nextAnnotation;
            }
            switch(result.getState()) {
                case CREATED:
                    created++;
                    break;
                case UPDATED:
                    updated++;
                    break;
            }
        } catch (AlreadyMergedException e) {
            alreadyMerged++;
        } catch (MergeConflictException e) {
            mergeConflict++;
        } catch (Exception e) {
            otherErrors.add(e.getMessage());
        }
    }
    writeEditorCas(sourceState, targetCas);
    int success = created + updated;
    if (success > 0) {
        success(String.format("Annotations were changed: %d (%d created, %d updated)", success, created, updated));
    } else {
        info("No annotations were changed");
    }
    if (alreadyMerged > 0) {
        info("Annotations had already been merged: " + alreadyMerged);
    }
    if (mergeConflict > 0) {
        info("Annotations skipped due to conflicts: " + mergeConflict);
    }
    if (!otherErrors.isEmpty()) {
        otherErrors.forEach(this::error);
    }
    applicationEventPublisher.get().publishEvent(new BulkAnnotationEvent(this, sourceState.getDocument(), sourceState.getUser().getUsername(), adapter.getLayer()));
    aTarget.addChildren(getPage(), IFeedback.class);
    onChange(aTarget);
}
Also used : LinkedHashSet(java.util.LinkedHashSet) AnnotatorState(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.AnnotatorState) CasMergeOperationResult(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMergeOperationResult) AnnotationException(de.tudarmstadt.ukp.clarin.webanno.api.annotation.exception.AnnotationException) AlreadyMergedException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.AlreadyMergedException) UIMAException(org.apache.uima.UIMAException) MergeConflictException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.MergeConflictException) IOException(java.io.IOException) VID(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.VID) AnnotationFS(org.apache.uima.cas.text.AnnotationFS) MergeConflictException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.MergeConflictException) CAS(org.apache.uima.cas.CAS) CasMerge(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge) BulkAnnotationEvent(de.tudarmstadt.ukp.clarin.webanno.api.annotation.event.BulkAnnotationEvent) TypeAdapter(de.tudarmstadt.ukp.clarin.webanno.api.annotation.adapter.TypeAdapter) AlreadyMergedException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.AlreadyMergedException)

Example 3 with CasMerge

use of de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge in project webanno by webanno.

the class SuggestionViewPanel method onClientEvent.

/**
 * Method is called, if user has clicked on a span or an arc in the sentence panel. The span or
 * arc respectively is identified and copied to the merge CAS.
 */
protected void onClientEvent(AjaxRequestTarget aTarget, UserAnnotationSegment aSegment) throws UIMAException, IOException, AnnotationException {
    if (isDocumentFinished(documentService, aSegment.getAnnotatorState())) {
        error("This document is already closed. Please ask the project manager to re-open it.");
        aTarget.addChildren(getPage(), IFeedback.class);
        return;
    }
    IRequestParameters request = getRequest().getPostParameters();
    StringValue action = request.getParameterValue(PARAM_ACTION);
    if (!action.isEmpty()) {
        String type = removePrefix(request.getParameterValue(PARAM_TYPE).toString());
        AnnotationLayer layer = schemaService.getLayer(TypeUtil.getLayerId(type));
        VID sourceVid = VID.parse(request.getParameterValue(PARAM_ID).toString());
        CAS targetCas = readEditorCas(aSegment.getAnnotatorState());
        CAS sourceCas = readAnnotatorCas(aSegment);
        AnnotatorState sourceState = aSegment.getAnnotatorState();
        if (CHAIN_TYPE.equals(layer.getType())) {
            error("Coreference annotations are not supported in curation");
            aTarget.addChildren(getPage(), IFeedback.class);
            return;
        }
        if (ACTION_CONTEXT_MENU.equals(action.toString())) {
            // No bulk actions supports for slots at the moment.
            if (sourceVid.isSlotSet()) {
                return;
            }
            List<IMenuItem> items = contextMenu.getItemList();
            items.clear();
            items.add(new LambdaMenuItem(String.format("Merge all %s", layer.getUiName()), _target -> actionAcceptAll(_target, aSegment, layer)));
            contextMenu.onOpen(aTarget);
            return;
        }
        // check if clicked on a span
        CasMerge casMerge = new CasMerge(schemaService);
        if (ACTION_SELECT_SPAN_FOR_MERGE.equals(action.toString())) {
            mergeSpan(casMerge, targetCas, sourceCas, sourceVid, sourceState.getDocument(), sourceState.getUser().getUsername(), layer);
        } else // check if clicked on an arc (relation or slot)
        if (ACTION_SELECT_ARC_FOR_MERGE.equals(action.toString())) {
            // this is a slot arc
            if (sourceVid.isSlotSet()) {
                mergeSlot(casMerge, targetCas, sourceCas, sourceVid, sourceState.getDocument(), sourceState.getUser().getUsername(), layer);
            } else // normal relation annotation arc is clicked
            {
                mergeRelation(casMerge, targetCas, sourceCas, sourceVid, sourceState.getDocument(), sourceState.getUser().getUsername(), layer);
            }
        }
        writeEditorCas(sourceState, targetCas);
        // Update timestamp
        AnnotationFS sourceAnnotation = selectAnnotationByAddr(sourceCas, sourceVid.getId());
        int sentenceNumber = getSentenceNumber(sourceAnnotation.getCAS(), sourceAnnotation.getBegin());
        sourceState.getDocument().setSentenceAccessed(sentenceNumber);
        if (sourceState.getPreferences().isScrollPage()) {
            sourceState.getPagingStrategy().moveToOffset(sourceState, targetCas, sourceAnnotation.getBegin(), CENTERED);
        }
        onChange(aTarget);
    }
}
Also used : TypeAdapter(de.tudarmstadt.ukp.clarin.webanno.api.annotation.adapter.TypeAdapter) SpringBean(org.apache.wicket.spring.injection.annot.SpringBean) Configuration(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.Configuration) ConfigurationSet(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.ConfigurationSet) LoggerFactory(org.slf4j.LoggerFactory) IMenuItem(com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem) WebAnnoCasUtil(de.tudarmstadt.ukp.clarin.webanno.api.annotation.util.WebAnnoCasUtil) Sentence(de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Sentence) AnnotationException(de.tudarmstadt.ukp.clarin.webanno.api.annotation.exception.AnnotationException) CasMergeOperationResult(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMergeOperationResult) CorrectionDocumentService(de.tudarmstadt.ukp.clarin.webanno.api.CorrectionDocumentService) VObject(de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.model.VObject) Map(java.util.Map) AlreadyMergedException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.AlreadyMergedException) ColoringRules(de.tudarmstadt.ukp.clarin.webanno.api.annotation.coloring.ColoringRules) AnnotatorStateUtils.updateDocumentTimestampAfterWrite(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.AnnotatorStateUtils.updateDocumentTimestampAfterWrite) AjaxRequestTarget(org.apache.wicket.ajax.AjaxRequestTarget) ColoringService(de.tudarmstadt.ukp.clarin.webanno.api.annotation.coloring.ColoringService) CurationContainer(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.CurationContainer) LambdaMenuItem(de.tudarmstadt.ukp.clarin.webanno.support.lambda.LambdaMenuItem) WebAnnoCasUtil.selectAnnotationByAddr(de.tudarmstadt.ukp.clarin.webanno.api.annotation.util.WebAnnoCasUtil.selectAnnotationByAddr) FeatureStructure(org.apache.uima.cas.FeatureStructure) CasMerge(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge) IModel(org.apache.wicket.model.IModel) StringValue(org.apache.wicket.util.string.StringValue) ListView(org.apache.wicket.markup.html.list.ListView) WebAnnoCasUtil.getSentenceNumber(de.tudarmstadt.ukp.clarin.webanno.api.annotation.util.WebAnnoCasUtil.getSentenceNumber) UIMAException(org.apache.uima.UIMAException) GetCollectionInformationResponse(de.tudarmstadt.ukp.clarin.webanno.brat.message.GetCollectionInformationResponse) DiffResult(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.DiffResult) AnnotationSelection(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationSelection) ListItem(org.apache.wicket.markup.html.list.ListItem) Collection(java.util.Collection) CENTERED(de.tudarmstadt.ukp.clarin.webanno.api.annotation.paging.FocusPosition.CENTERED) Model(org.apache.wicket.model.Model) UserDao(de.tudarmstadt.ukp.clarin.webanno.security.UserDao) Set(java.util.Set) MarkupContainer(org.apache.wicket.MarkupContainer) UserAnnotationSegment(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.UserAnnotationSegment) AnnotationDocument(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationDocument) AnnotationDocumentState(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationDocumentState) IFeedback(org.apache.wicket.feedback.IFeedback) ContextMenu(de.tudarmstadt.ukp.clarin.webanno.support.wicket.ContextMenu) LINK_ROLE_AS_LABEL(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.LinkCompareBehavior.LINK_ROLE_AS_LABEL) List(java.util.List) TypeUtil(de.tudarmstadt.ukp.clarin.webanno.api.annotation.util.TypeUtil) AnnotationLayer(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationLayer) SourceDocument(de.tudarmstadt.ukp.clarin.webanno.model.SourceDocument) CasDiff.getDiffAdapters(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.getDiffAdapters) ApplicationEventPublisherHolder(de.tudarmstadt.ukp.clarin.webanno.support.spring.ApplicationEventPublisherHolder) BratRenderer(de.tudarmstadt.ukp.clarin.webanno.brat.render.BratRenderer) VDocument(de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.model.VDocument) USE(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationState.USE) AnnotationFS(org.apache.uima.cas.text.AnnotationFS) AnnotatorState(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.AnnotatorState) AGREE(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationState.AGREE) CAS(org.apache.uima.cas.CAS) HashMap(java.util.HashMap) ColoringStrategy(de.tudarmstadt.ukp.clarin.webanno.api.annotation.coloring.ColoringStrategy) Mode(de.tudarmstadt.ukp.clarin.webanno.model.Mode) MergeConflictException(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.MergeConflictException) ArrayList(java.util.ArrayList) AnnotationSchemaService(de.tudarmstadt.ukp.clarin.webanno.api.AnnotationSchemaService) SourceListView(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.SourceListView) Token(de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Token) AnnotationState(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationState) User(de.tudarmstadt.ukp.clarin.webanno.security.model.User) GetDocumentResponse(de.tudarmstadt.ukp.clarin.webanno.brat.message.GetDocumentResponse) DISAGREE(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationState.DISAGREE) Project(de.tudarmstadt.ukp.clarin.webanno.model.Project) IRequestParameters(org.apache.wicket.request.IRequestParameters) BratSuggestionVisualizer(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.BratSuggestionVisualizer) LinkedHashSet(java.util.LinkedHashSet) PreRenderer(de.tudarmstadt.ukp.clarin.webanno.api.annotation.rendering.PreRenderer) DO_NOT_USE(de.tudarmstadt.ukp.clarin.webanno.ui.curation.component.model.AnnotationState.DO_NOT_USE) DocumentService(de.tudarmstadt.ukp.clarin.webanno.api.DocumentService) CURATION(de.tudarmstadt.ukp.clarin.webanno.model.Mode.CURATION) Logger(org.slf4j.Logger) CasUtil.select(org.apache.uima.fit.util.CasUtil.select) CurationDocumentService(de.tudarmstadt.ukp.clarin.webanno.curation.storage.CurationDocumentService) IOException(java.io.IOException) RELATION_TYPE(de.tudarmstadt.ukp.clarin.webanno.api.WebAnnoConst.RELATION_TYPE) SPAN_TYPE(de.tudarmstadt.ukp.clarin.webanno.api.WebAnnoConst.SPAN_TYPE) AjaxComponentRespondListener(de.tudarmstadt.ukp.clarin.webanno.support.wicket.AjaxComponentRespondListener) BratAnnotatorUtility.isDocumentFinished(de.tudarmstadt.ukp.clarin.webanno.brat.util.BratAnnotatorUtility.isDocumentFinished) JSONUtil(de.tudarmstadt.ukp.clarin.webanno.support.JSONUtil) CasDiff.doDiffSingle(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.doDiffSingle) StringUtils.isBlank(org.apache.commons.lang3.StringUtils.isBlank) WebMarkupContainer(org.apache.wicket.markup.html.WebMarkupContainer) BulkAnnotationEvent(de.tudarmstadt.ukp.clarin.webanno.api.annotation.event.BulkAnnotationEvent) AnnotationFeature(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationFeature) DiffAdapter(de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.api.DiffAdapter) CHAIN_TYPE(de.tudarmstadt.ukp.clarin.webanno.api.WebAnnoConst.CHAIN_TYPE) VID(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.VID) Collections(java.util.Collections) IMenuItem(com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem) AnnotatorState(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.AnnotatorState) AnnotationLayer(de.tudarmstadt.ukp.clarin.webanno.model.AnnotationLayer) VID(de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.VID) AnnotationFS(org.apache.uima.cas.text.AnnotationFS) CAS(org.apache.uima.cas.CAS) CasMerge(de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge) StringValue(org.apache.wicket.util.string.StringValue) LambdaMenuItem(de.tudarmstadt.ukp.clarin.webanno.support.lambda.LambdaMenuItem) IRequestParameters(org.apache.wicket.request.IRequestParameters)

Aggregations

CasMerge (de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMerge)3 CAS (org.apache.uima.cas.CAS)3 TypeAdapter (de.tudarmstadt.ukp.clarin.webanno.api.annotation.adapter.TypeAdapter)2 BulkAnnotationEvent (de.tudarmstadt.ukp.clarin.webanno.api.annotation.event.BulkAnnotationEvent)2 AnnotationException (de.tudarmstadt.ukp.clarin.webanno.api.annotation.exception.AnnotationException)2 AnnotatorState (de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.AnnotatorState)2 VID (de.tudarmstadt.ukp.clarin.webanno.api.annotation.model.VID)2 DiffResult (de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.CasDiff.DiffResult)2 DiffAdapter (de.tudarmstadt.ukp.clarin.webanno.curation.casdiff.api.DiffAdapter)2 AlreadyMergedException (de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.AlreadyMergedException)2 CasMergeOperationResult (de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.CasMergeOperationResult)2 MergeConflictException (de.tudarmstadt.ukp.clarin.webanno.curation.casmerge.MergeConflictException)2 IOException (java.io.IOException)2 LinkedHashSet (java.util.LinkedHashSet)2 UIMAException (org.apache.uima.UIMAException)2 AnnotationFS (org.apache.uima.cas.text.AnnotationFS)2 IMenuItem (com.googlecode.wicket.jquery.ui.widget.menu.IMenuItem)1 AnnotationSchemaService (de.tudarmstadt.ukp.clarin.webanno.api.AnnotationSchemaService)1 CorrectionDocumentService (de.tudarmstadt.ukp.clarin.webanno.api.CorrectionDocumentService)1 DocumentService (de.tudarmstadt.ukp.clarin.webanno.api.DocumentService)1