Skip to content
Snippets Groups Projects
order_based.py 1.19 KiB
Newer Older
Michał Pogoda's avatar
Michał Pogoda committed
from typing import List, Tuple, Dict, Any
from bitarray import bitarray
Michał Pogoda's avatar
Michał Pogoda committed
from src.suppressors.interface import Suppressor
Michał Pogoda's avatar
Michał Pogoda committed
class OrderBasedSuppressor(Suppressor):
    def __init__(self) -> None:
        super().__init__()
        
    def suppress(self, annotations: List[Tuple[int, int, Any]]) -> List[Tuple[int, int, Any]]:
        return suppress_order_based(annotations)

def suppress_order_based(annotations: List[Tuple[int, int, Any]]) -> List[Tuple[int, int, Any]]:
    """If two annotations overlap, the first one int the list is kept.

    Args:
Michał Pogoda's avatar
Michał Pogoda committed
        annotations (List[Tuple[int, int, Any]]): List of annotations.
Michał Pogoda's avatar
Michał Pogoda committed
        List[Tuple[int, int, Any]]: List of annotations with overlapping
            annotations removed.

    """
Michał Pogoda's avatar
Michał Pogoda committed
    if len(annotations) == 0:
        return annotations
    
    annotations = annotations
    bitarray_size = max([end for _, end, _ in annotations])
    bitarray_ = bitarray(bitarray_size)
    bitarray_.setall(False)
    
    result = []
    
    for start, end, entity_type in annotations:
        if not bitarray_[start:end].any():
            bitarray_[start:end] = True
            result.append((start, end, entity_type))
            
    return result