mirror of https://github.com/doccano/doccano.git
pythondatasetsactive-learningtext-annotationdatasetnatural-language-processingdata-labelingmachine-learningannotation-tool
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
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>
|