You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
4.9 KiB

<template>
<v-main>
<v-container fluid>
<v-row justify="center">
<v-col cols="12" md="9">
<v-card>
<v-card-title>
<label-group
:labels="items"
:annotations="categoryAnnotations"
:single-label="exclusive"
@add="addLabel"
@remove="removeLabel"
/>
</v-card-title>
<v-divider />
<div class="annotation-text pa-4">
<entity-editor
:dark="$vuetify.theme.dark"
:text="currentDoc.text"
:entities="currentDoc.annotations"
:entity-labels="entityLabels"
@addEntity="addEntity"
@click:entity="updateEntity"
@contextmenu:entity="deleteEntity"
/>
</div>
</v-card>
</v-col>
<v-col cols="12" md="3">
<list-metadata :metadata="currentDoc.meta" />
</v-col>
</v-row>
</v-container>
</v-main>
</template>
<script>
import EntityEditor from '@/components/tasks/sequenceLabeling/EntityEditor.vue'
import LabelGroup from '@/components/tasks/textClassification/LabelGroup'
import ListMetadata from '@/components/tasks/metadata/ListMetadata'
export default {
components: {
EntityEditor,
ListMetadata,
LabelGroup
},
layout: 'demo',
data() {
return {
entityLabels: [
{
id: 4,
text: 'City',
prefixKey: null,
suffixKey: 'l',
color: '#fbb028',
textColor: '#ffffff'
},
{
id: 5,
text: 'MISC',
prefixKey: null,
suffixKey: 'm',
color: '#7c20e0',
textColor: '#000000'
},
{
id: 6,
text: 'ORG',
prefixKey: null,
suffixKey: 'o',
color: '#e6d176',
textColor: '#000000'
},
{
id: 7,
text: 'Time',
prefixKey: null,
suffixKey: 'p',
color: '#6a74b9',
textColor: '#ffffff'
}
],
items: [
{
id: 4,
text: 'Flight',
prefixKey: null,
suffixKey: 'f',
backgroundColor: '#7c20e0',
textColor: '#ffffff'
},
{
id: 5,
text: 'FlightTime',
prefixKey: null,
suffixKey: 't',
backgroundColor: '#fbb028',
textColor: '#000000'
},
{
id: 6,
text: 'Airfare',
prefixKey: null,
suffixKey: 'a',
backgroundColor: '#1e90ff',
textColor: '#000000'
}
],
categoryAnnotations: [
{
id: 17,
prob: 0.0,
label: 4,
user: 1,
document: 8
}
],
exclusive: true,
currentDoc: {
id: 8,
text: 'I want to fly from Boston at 8:38 am and arrive in Denver at 11:10 in the morning.',
annotations: [
{
id: 17,
prob: 0.0,
label: 4,
startOffset: 19,
endOffset: 25,
user: 1
},
{
id: 19,
prob: 0.0,
label: 7,
startOffset: 29,
endOffset: 36,
user: 1
},
{
id: 16,
prob: 0.0,
label: 4,
startOffset: 51,
endOffset: 57,
user: 1
},
{
id: 18,
prob: 0.0,
label: 7,
startOffset: 61,
endOffset: 66,
user: 1
}
],
meta: { wikiPageId: 2 },
annotation_approver: null
}
}
},
methods: {
deleteEntity(annotationId) {
this.currentDoc.annotations = this.currentDoc.annotations.filter(
(item) => item.id !== annotationId
)
},
updateEntity(annotationId, labelId) {
const index = this.currentDoc.annotations.findIndex((item) => item.id === annotationId)
this.currentDoc.annotations[index].label = labelId
},
addEntity(startOffset, endOffset, labelId) {
const payload = {
id: Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER)),
startOffset,
endOffset,
label: labelId
}
this.currentDoc.annotations.push(payload)
},
removeLabel(annotationId) {
this.categoryAnnotations = this.categoryAnnotations.filter((item) => item.id !== annotationId)
},
addLabel(labelId) {
const payload = {
id: Math.floor(Math.random() * Math.floor(Number.MAX_SAFE_INTEGER)),
label: labelId
}
this.categoryAnnotations.push(payload)
}
}
}
</script>
<style scoped>
.annotation-text {
font-size: 1.25rem !important;
font-weight: 500;
line-height: 2rem;
font-family: 'Roboto', sans-serif !important;
opacity: 0.6;
}
</style>