Browse Source

Implement annotation update

pull/10/head
Hironsan 6 years ago
parent
commit
adb852f0e7
3 changed files with 78 additions and 45 deletions
  1. BIN
      doccano/app/db.sqlite3
  2. 83
      doccano/app/server/static/main.js
  3. 40
      doccano/app/server/views.py

BIN
doccano/app/db.sqlite3

83
doccano/app/server/static/main.js

@ -1,50 +1,55 @@
Vue.config.debug = true;
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';
var base_url = window.location.href.split('/').slice(3, 5).join('/');
function swap(values){
var ret = {};
for(var item of values){
ret[item['text']] = item['id'];
}
return ret;
}
var app = new Vue({
el: '#app',
delimiters: ['[[', ']]'],
data: {
cur: 0,
items: [{
"id": 10,
"labels": [{
"text": "Prefecture",
"prob": 0.98
}, {
"text": "Domestic Region",
"prob": 0.58
}],
"text": "北海道(ほっかいどう)は、日本の北部に位置する島[※ 1][※ 2]。また、同島および付随する島を管轄する地方公共団体(道)である。島としての北海道は日本列島を構成する主要4島の一つである。地方公共団体としての北海道は47都道府県中唯一の「道」で、道庁所在地は札幌市。"
},
{
"id": 11,
"labels": [{
"text": "Person",
"prob": 0.98
}],
"text": "安倍 晋三(あべ しんぞう、1954年(昭和29年)9月21日 - )は、日本の政治家。自由民主党所属の衆議院議員(9期)、第90代・第96代・第97代・第98代内閣総理大臣、第21代・第25代自由民主党総裁。"
},
{
"id": 12,
"labels": [{
"text": "Country",
"prob": 0.99
}, {
"text": "Continental Region",
"prob": 0.58
}],
"text": "アメリカ合衆国(アメリカがっしゅうこく、英語: United States of America)、通称アメリカ、米国(べいこく)は、50の州および連邦区から成る連邦共和国である[6][7]。アメリカ本土の48州およびワシントンD.C.は、カナダとメキシコの間の北アメリカ中央に位置する。アラスカ州は北アメリカ北西部の角に位置し、東ではカナダと、西ではベーリング海峡をはさんでロシアと国境を接している。ハワイ州は中部太平洋における島嶼群である。同国は、太平洋およびカリブに5つの有人の海外領土および9つの無人の海外領土を有する。985万平方キロメートル (km2) の総面積は世界第3位または第4位、3億1千7百万人の人口は世界第3位である。同国は世界で最も民族的に多様かつ多文化な国の1つであり、これは多くの国からの大規模な移住の産物とされている[8]。また同国の広大な国土における地理および気候も極めて多様であり、多種多様な野生生物が存在する。"
},
],
items: [],
// {
// "id": 10,
// "labels": [{
// "text": "Prefecture",
// "prob": 0.98
// }, {
// "text": "Domestic Region",
// "prob": 0.58
// }],
// "text": "北海道(ほっかいどう)は、日本の北部に位置する島[※ 1][※ 2]。また、同島および付随する島を管轄する地方公共団体(道)である。島としての北海道は日本列島を構成する主要4島の一つである。地方公共団体としての北海道は47都道府県中唯一の「道」で、道庁所在地は札幌市。"
// }
labels: [],
guideline: ''
},
methods: {
addLabel: function (label) {
this.items[this.cur]['labels'].push({
var label = {
'text': label,
'prob': null
})
};
this.items[this.cur]['labels'].push(label);
console.log(this.labels);
console.log(swap(this.labels));
var label2id = swap(this.labels);
var data = {'id': this.items[this.cur]['id'], 'label_id': label2id[label['text']]};
axios.post('/' + base_url + '/apis/data', data)
.then(function (response) {
console.log('post data');
})
.catch(function (error) {
console.log('ERROR!! happend by Backend.')
});
},
deleteLabel: function (index) {
this.items[this.cur]['labels'].splice(index, 1)
@ -58,15 +63,23 @@ var app = new Vue({
},
created: function () {
console.log('created');
var base_url = window.location.href.split('/').slice(3, 5).join('/');
var self = this;
axios.get('/' + base_url + '/apis/label')
.then(function (response) {
console.log('label request');
console.log('request label');
self.labels = response.data['labels'];
})
.catch(function (error) {
console.log('ERROR!! happend by Backend.')
});
axios.get('/' + base_url + '/apis/data')
.then(function (response) {
console.log('request data');
self.items = response.data['data'];
})
.catch(function (error) {
console.log('ERROR!! happend by Backend.')
});
}
})

40
doccano/app/server/views.py

@ -1,9 +1,10 @@
from django.core.paginator import Paginator
import json
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from .models import Annotation, Label
from .models import Annotation, Label, RawData
class AnnotationView(View):
@ -16,17 +17,36 @@ class AnnotationView(View):
class AnnotationAPIView(View):
def get(self, request, *args, **kwargs):
annotation_list = Annotation.objects.all()
paginator = Paginator(annotation_list, 5)
once_active_learned = len(Annotation.objects.all().exclude(prob=None)) > 0
if once_active_learned:
# Use Annotation model & RawData model.
# Left outer join data and annotation.
# Filter manual=False
# Sort prob
docs = Annotation.objects.all()
else:
# Left outer join data and annotation.
docs = RawData.objects.filter(annotation__isnull=True)
docs = [{**d.as_dict(), **{'labels': []}} for d in docs]
return JsonResponse({'data': docs})
page = request.GET.get('page')
annotations = paginator.get_page(page)
annotations = [a.as_dict() for a in annotations]
def post(self, request, *args, **kwargs):
body = json.loads(request.body)
data_id, label_id = body.get('id'), body.get('label_id') # {id:0, label_id:1}
return JsonResponse({'annotations': annotations})
data = RawData.objects.get(id=data_id)
label = Label.objects.get(id=label_id)
Annotation(data=data, label=label, manual=True).save()
def post(self, request, *args, **kwargs):
pass
return JsonResponse({})
def delete(self, request, *args, **kwargs):
body = json.loads(request.body)
data_id, label_id = body.get('id'), body.get('label_id') # {id:0, label_id:1}
Annotation.objects.get(data=data_id, label=label_id).delete()
return JsonResponse({})
class LabelAPIView(View):

Loading…
Cancel
Save