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.
 
 
 
 
 
 

58 lines
1.5 KiB

from typing import List
from api.models import Project
from .labels import CategoryLabel, Label, SpanLabel
class Cleaner:
def __init__(self, project: Project):
pass
def clean(self, labels: List[Label]) -> List[Label]:
return labels
@property
def message(self) -> str:
return ''
class SpanCleaner(Cleaner):
def __init__(self, project: Project):
super().__init__(project)
self.allow_overlapping = getattr(project, 'allow_overlapping', False)
def clean(self, labels: List[SpanLabel]) -> List[SpanLabel]:
if self.allow_overlapping:
return labels
labels.sort(key=lambda label: label.start_offset)
last_offset = -1
new_labels = []
for label in labels:
if label.start_offset >= last_offset:
last_offset = label.end_offset
new_labels.append(label)
return new_labels
@property
def message(self) -> str:
return 'This project cannot allow label overlapping. It\'s cleaned.'
class CategoryCleaner(Cleaner):
def __init__(self, project: Project):
super().__init__(project)
self.exclusive = getattr(project, 'single_class_classification', False)
def clean(self, labels: List[CategoryLabel]) -> List[CategoryLabel]:
if self.exclusive:
return labels[:1]
else:
return labels
@property
def message(self) -> str:
return 'This project only one label can apply but multiple label found. It\'s cleaned.'