Skip to content

Commit 825abc6

Browse files
author
Val Brodsky
committed
Add ConversationEntity annotation class(es)
1 parent 11793a4 commit 825abc6

File tree

7 files changed

+63
-7
lines changed

7 files changed

+63
-7
lines changed

labelbox/data/annotation_types/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@
1010
from .annotation import ObjectAnnotation
1111
from .annotation import VideoObjectAnnotation
1212

13-
from .ner import TextEntity
13+
from .ner import ConversationEntity
1414
from .ner import DocumentEntity
1515
from .ner import DocumentTextSelection
16+
from .ner import TextEntity
1617

1718
from .classification import Checklist
1819
from .classification import ClassificationAnswer

labelbox/data/annotation_types/annotation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import abc
2-
from typing import Any, Dict, List, Optional, Union
2+
from typing import Any, Dict, List, Optional, Union, Type
33

44
from labelbox.data.mixins import ConfidenceNotSupportedMixin, ConfidenceMixin
55

@@ -51,7 +51,7 @@ class ObjectAnnotation(BaseAnnotation, ConfidenceMixin):
5151
classifications (Optional[List[ClassificationAnnotation]]): Optional sub classification of the annotation
5252
extra (Dict[str, Any])
5353
"""
54-
value: Union[TextEntity, DocumentEntity, Geometry]
54+
value: Union[Type[TextEntity], DocumentEntity, Geometry]
5555
classifications: List[ClassificationAnnotation] = []
5656

5757

labelbox/data/annotation_types/label.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import labelbox
88
from labelbox.data.annotation_types.data.tiled_image import TiledImageData
9-
from labelbox.data.annotation_types.ner import DocumentEntity
109
from labelbox.schema import ontology
1110
from .annotation import (ClassificationAnnotation, ObjectAnnotation,
1211
VideoClassificationAnnotation, VideoObjectAnnotation)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
from .text_entity import TextEntity
1+
from .conversation_entity import ConversationEntity
22
from .document_entity import DocumentEntity, DocumentTextSelection
3+
from .text_entity import TextEntity
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from typing import Dict, Any
2+
3+
from pydantic import BaseModel, root_validator
4+
5+
from labelbox.data.annotation_types.ner.text_entity import TextEntity
6+
from labelbox.utils import _CamelCaseMixin
7+
8+
9+
class ConversationEntity(TextEntity, _CamelCaseMixin):
10+
""" Represents a text entity """
11+
message_id: str

labelbox/data/serialization/ndjson/objects.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from ast import Bytes
22
from io import BytesIO
3-
from typing import Any, Dict, List, Tuple, Union, Optional
3+
from typing import Any, Dict, List, Tuple, Type, Union, Optional
44
import base64
5+
from labelbox.data.annotation_types.ner.conversation_entity import ConversationEntity
56
from labelbox.data.mixins import ConfidenceMixin
67
import numpy as np
78

@@ -399,6 +400,33 @@ def from_common(cls,
399400
confidence=confidence)
400401

401402

403+
class NDConversationEntity(NDTextEntity):
404+
message_id: str
405+
406+
def to_common(self) -> ConversationEntity:
407+
return ConversationEntity(start=self.location.start, end=self.location.end, message_id=self.message_id)
408+
409+
@classmethod
410+
def from_common(cls,
411+
conversation_entity: ConversationEntity,
412+
classifications: List[ClassificationAnnotation],
413+
name: str,
414+
feature_schema_id: Cuid,
415+
extra: Dict[str, Any],
416+
data: Union[ImageData, TextData],
417+
confidence: Optional[float] = None) -> "NDConversationEntity":
418+
return cls(location=Location(
419+
start=conversation_entity.start,
420+
end=conversation_entity.end),
421+
message_id=conversation_entity.message_id,
422+
dataRow=DataRow(id=data.uid),
423+
name=name,
424+
schema_id=feature_schema_id,
425+
uuid=extra.get('uuid'),
426+
classifications=classifications,
427+
confidence=confidence)
428+
429+
402430
class NDObject:
403431

404432
@staticmethod
@@ -463,6 +491,7 @@ def lookup_object(
463491
Mask: NDMask,
464492
TextEntity: NDTextEntity,
465493
DocumentEntity: NDDocumentEntity,
494+
ConversationEntity: NDConversationEntity,
466495
}.get(type(annotation.value))
467496
if result is None:
468497
raise TypeError(
@@ -472,6 +501,6 @@ def lookup_object(
472501

473502

474503
NDObjectType = Union[NDLine, NDPolygon, NDPoint, NDRectangle, NDMask,
475-
NDTextEntity, NDDocumentEntity]
504+
Type[NDTextEntity], NDDocumentEntity]
476505

477506
NDFrameObjectType = NDFrameRectangle, NDFramePoint, NDFrameLine

tests/data/annotation_types/test_ner.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from labelbox.data.annotation_types import TextEntity, DocumentEntity, DocumentTextSelection
2+
from labelbox.data.annotation_types.ner.conversation_entity import ConversationEntity
23

34

45
def test_ner():
@@ -22,3 +23,17 @@ def test_document_entity():
2223
assert document_entity.text_selections[0].token_ids == ["1", "2"]
2324
assert document_entity.text_selections[0].group_id == "1"
2425
assert document_entity.text_selections[0].page == 1
26+
27+
28+
def test_conversation_entity():
29+
document_entity = ConversationEntity(name="tool_name",
30+
message_id=1,
31+
start=0,
32+
end=1,
33+
confidence=0.5)
34+
35+
assert document_entity.name == "tool_name"
36+
assert document_entity.message_id == "1"
37+
assert document_entity.start == 0
38+
assert document_entity.end == 1
39+
assert document_entity.confidence == 0.5

0 commit comments

Comments
 (0)