#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
This module provides base containers.
"""
__author__ = 'Mu Yang <http://muyang.pro>'
__copyright__ = '2018-2023 CKIP Lab'
__license__ = 'GPL-3.0'
import json as _json
from abc import (
ABCMeta as _ABCMeta,
abstractmethod as _abstractmethod,
)
from collections import (
UserList as _UserList,
)
################################################################################################################################
[docs]class Base(metaclass=_ABCMeta):
"""The base CKIPNLP container."""
########################################################################################################################
[docs] @classmethod
@_abstractmethod
def from_text(cls, data):
"""Construct an instance from text format.
Parameters
----------
data : str
"""
return NotImplemented # pragma: no cover
[docs] @_abstractmethod
def to_text(self):
"""Transform to plain text.
Returns
-------
str
"""
return NotImplemented # pragma: no cover
########################################################################################################################
[docs] @classmethod
@_abstractmethod
def from_list(cls, data):
"""Construct an instance from python built-in containers."""
return NotImplemented # pragma: no cover
[docs] @_abstractmethod
def to_list(self):
"""Transform to python built-in containers."""
return NotImplemented # pragma: no cover
########################################################################################################################
[docs] @classmethod
@_abstractmethod
def from_dict(cls, data):
"""Construct an instance from python built-in containers."""
return NotImplemented # pragma: no cover
[docs] @_abstractmethod
def to_dict(self):
"""Transform to python built-in containers."""
return NotImplemented # pragma: no cover
########################################################################################################################
[docs] @classmethod
def from_json(cls, data, **kwargs):
"""Construct an instance from JSON format.
Parameters
----------
data : str
please refer :meth:`from_dict` for format details.
"""
return cls.from_dict(_json.loads(data, **kwargs))
[docs] def to_json(self, **kwargs):
"""Transform to JSON format.
Returns
-------
str
"""
return _json.dumps(self.to_dict(), **kwargs)
################################################################################################################################
[docs]class BaseTuple(Base, metaclass=_ABCMeta):
"""The base CKIPNLP tuple."""
########################################################################################################################
@classmethod
@_abstractmethod
def from_text(cls, data):
return NotImplemented # pragma: no cover
@_abstractmethod
def to_text(self):
return NotImplemented # pragma: no cover
########################################################################################################################
[docs] @classmethod
def from_list(cls, data):
"""Construct an instance from python built-in containers.
Parameters
----------
data : list
"""
return cls(*data)
[docs] def to_list(self):
"""Transform to python built-in containers.
Returns
-------
list
"""
return list(self)
########################################################################################################################
[docs] @classmethod
def from_dict(cls, data):
"""Construct an instance from python built-in containers.
Parameters
----------
data : dict
"""
return cls(**data)
[docs] def to_dict(self):
"""Transform to python built-in containers.
Returns
-------
dict
"""
return dict(self._asdict()) # pylint: disable=no-member
################################################################################################################################
class _BaseList(Base, _UserList):
"""The base CKIPNLP list."""
item_class = NotImplemented
########################################################################################################################
@classmethod
def from_text(cls, data):
"""Construct an instance from text format.
Parameters
----------
data : Sequence[str]
list of texts as ``item_class.from_text`` input.
"""
return cls(map(cls._item_from_text, data)) # pylint: disable=no-member
def to_text(self):
"""Transform to plain text.
Returns
-------
List[str]
"""
return list(map(self._item_to_text, self)) # pylint: disable=no-member
########################################################################################################################
@classmethod
def from_list(cls, data):
"""Construct an instance from python built-in containers.
Parameters
----------
data : Sequence[Container]
list of objects as ``item_class.from_list`` input.
"""
return cls(map(cls._item_from_list, data)) # pylint: disable=no-member
def to_list(self):
"""Transform to python built-in containers.
Returns
-------
List[Container]
"""
return list(map(self._item_to_list, self)) # pylint: disable=no-member
########################################################################################################################
@classmethod
def from_dict(cls, data):
"""Construct an instance from python built-in containers.
Parameters
----------
data : Sequence[Container]
list of objects as ``item_class.from_dict`` input.
"""
return cls(map(cls._item_from_dict, data)) # pylint: disable=no-member
def to_dict(self):
"""Transform to python built-in containers.
Returns
-------
List[Container]
"""
return list(map(self._item_to_dict, self)) # pylint: disable=no-member
################################################################################################################################
class _BaseSentence(_BaseList):
"""The base CKIPNLP sentence."""
@classmethod
def from_text(cls, data):
"""Construct an instance from text format.
Parameters
----------
data : str
words segmented by ``'\\u3000'``.
"""
return cls(map(cls._item_from_text, data.split('\u3000'))) # pylint: disable=no-member
def to_text(self):
return '\u3000'.join(map(self._item_to_text, self)) # pylint: disable=no-member
################################################################################################################################
class _InterfaceItem:
"""Container has ckipnlp item class."""
@classmethod
def _item_from_text(cls, data):
return cls.item_class.from_text(data) # pylint: disable=no-member
@classmethod
def _item_to_text(cls, item):
return cls.item_class.to_text(item) # pylint: disable=no-member
@classmethod
def _item_from_list(cls, data):
return cls.item_class.from_list(data) # pylint: disable=no-member
@classmethod
def _item_to_list(cls, item):
return cls.item_class.to_list(item) # pylint: disable=no-member
@classmethod
def _item_from_dict(cls, data):
return cls.item_class.from_dict(data) # pylint: disable=no-member
@classmethod
def _item_to_dict(cls, item):
return cls.item_class.to_dict(item) # pylint: disable=no-member
################################################################################################################################
class _InterfaceBuiltInItem:
@classmethod
def _item_from_text(cls, data):
return cls.item_class(data) # pylint: disable=no-member
@classmethod
def _item_to_text(cls, item):
return cls.item_class(item) # pylint: disable=no-member
@classmethod
def _item_from_list(cls, data):
return cls.item_class(data) # pylint: disable=no-member
@classmethod
def _item_to_list(cls, item):
return cls.item_class(item) # pylint: disable=no-member
@classmethod
def _item_from_dict(cls, data):
return cls.item_class(data) # pylint: disable=no-member
@classmethod
def _item_to_dict(cls, item):
return cls.item_class(item) # pylint: disable=no-member
################################################################################################################################
[docs]class BaseList(_BaseList, _InterfaceItem):
"""The base CKIPNLP list.
.. attribute:: item_class
:value: Not Implemented
Must be a CKIPNLP container class.
"""
[docs]class BaseList0(_BaseList, _InterfaceBuiltInItem):
"""The base CKIPNLP list with built-in item class.
.. attribute:: item_class
:value: Not Implemented
Must be a built-in type.
"""
[docs]class BaseSentence(_BaseSentence, _InterfaceItem):
"""The base CKIPNLP sentence.
.. attribute:: item_class
:value: Not Implemented
Must be a CKIPNLP container class.
"""
[docs]class BaseSentence0(_BaseSentence, _InterfaceBuiltInItem):
"""The base CKIPNLP sentence with built-in item class.
.. attribute:: item_class
:value: Not Implemented
Must be a built-in type.
"""